#include <glib.h>
struct _ObClient;
+struct _ObParseInst;
-typedef struct _ObMenu ObMenu;
+typedef struct _ObMenu ObMenu;
typedef struct _ObMenuEntry ObMenuEntry;
+typedef void(*menu_controller_destroy)(ObMenu *self);
typedef void(*menu_controller_show)(ObMenu *self, int x, int y,
struct _ObClient *);
typedef void(*menu_controller_update)(ObMenu *self);
typedef void(*menu_controller_mouseover)(ObMenuEntry *self, gboolean enter);
+typedef void(*menu_controller_selected)(ObMenuEntry *entry,
+ unsigned int button,
+ unsigned int x, unsigned int y);
+typedef void(*menu_controller_hide)(ObMenu *self);
+
extern GHashTable *menu_hash;
-extern GSList *menu_visible;
+extern GList *menu_visible;
struct _ObMenu
{
ObWindow obwin;
+ /* The title displayed above the menu.
+ NULL for no titlebar */
gchar *label;
+
+ /* Name of the menu.
+ Used in the action showmenu */
gchar *name;
-
+
+ /* ObMenuEntry list */
GList *entries;
+ /* If the menu is currently displayed */
gboolean shown;
+
+ /* If the rendering of the menu has changed and needs to be rerendered. */
gboolean invalid;
+ /* Kind of lame.Each menu can only be a submenu, and each menu can only
+ have one submenu open */
ObMenu *parent;
-
ObMenu *open_submenu;
+ GList *over;
+
+ /* destructor */
+ menu_controller_destroy destroy;
+ /* behaviour callbacks
+ TODO: Document and split code that HAS to be in the overridden callback */
/* place a menu on screen */
menu_controller_show show;
- void (*hide)( /* some bummu */);
-
+ /* Hide the menu */
+ menu_controller_hide hide;
/* render a menu */
menu_controller_update update;
+ /* Event for a mouse enter/exit on an entry
+ TODO: May have to split from simple render updating?
+ */
menu_controller_mouseover mouseover;
- void (*selected)( /* some bummu */);
+ /* Entry is clicked/hit enter on */
+ menu_controller_selected selected;
/* render stuff */
Size size;
guint xin_area; /* index of the xinerama head/area */
- /* plugin stuff */
+ /* Name of plugin for menu */
char *plugin;
+ /* plugin's data */
void *plugin_data;
};
char *label;
ObMenu *parent;
- Action *action;
+ ObAction *action;
ObMenuEntryRenderType render_type;
gboolean hilite;
/* render stuff */
Window item;
+ Window submenu_pic;
+
RrAppearance *a_item;
RrAppearance *a_disabled;
RrAppearance *a_hilite;
+ RrAppearance *a_submenu;
gint y;
gint min_w;
} MenuEntry;
typedef struct PluginMenuCreateData{
+ struct _ObParseInst *parse_inst;
xmlDocPtr doc;
xmlNodePtr node;
ObMenu *parent;
void menu_startup();
void menu_shutdown();
+void menu_parse();
+
+void menu_noop();
+
#define menu_new(l, n, p) \
- menu_new_full(l, n, p, NULL, NULL)
+ menu_new_full(l, n, p, menu_show_full, menu_render, menu_entry_fire, \
+ menu_hide, menu_control_mouseover, NULL)
ObMenu *menu_new_full(char *label, char *name, ObMenu *parent,
- menu_controller_show show, menu_controller_update update);
+ menu_controller_show show,
+ menu_controller_update update,
+ menu_controller_selected selected,
+ menu_controller_hide hide,
+ menu_controller_mouseover mouseover,
+ menu_controller_destroy destroy);
+
void menu_free(char *name);
void menu_show(char *name, int x, int y, struct _ObClient *client);
void menu_clear(ObMenu *self);
-ObMenuEntry *menu_entry_new_full(char *label, Action *action,
+ObMenuEntry *menu_entry_new_full(char *label, ObAction *action,
ObMenuEntryRenderType render_type,
gpointer submenu);
void menu_add_entry(ObMenu *menu, ObMenuEntry *entry);
ObMenuEntry *menu_find_entry(ObMenu *menu, Window win);
+ObMenuEntry *menu_find_entry_by_submenu(ObMenu *menu, ObMenu *submenu);
ObMenuEntry *menu_find_entry_by_pos(ObMenu *menu, int x, int y);
void menu_entry_render(ObMenuEntry *self);
-void menu_entry_fire(ObMenuEntry *self);
+void menu_entry_fire(ObMenuEntry *entry,
+ unsigned int button, unsigned int x, unsigned int y);
void menu_render(ObMenu *self);
void menu_render_full(ObMenu *self);
-//so plugins can call it?
-void parse_menu_full(xmlDocPtr doc, xmlNodePtr node, void *data, gboolean new);
+/*so plugins can call it? */
+void parse_menu_full(struct _ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+ void *data, gboolean new);
void menu_control_mouseover(ObMenuEntry *entry, gboolean enter);
+void menu_control_keyboard_nav(unsigned int key);
#endif