openbox/menu.h (raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
#ifndef __menu_h #define __menu_h #include "action.h" #include "window.h" #include "render/render.h" #include "geom.h" #include <glib.h> struct _ObClient; typedef struct _ObMenu ObMenu; typedef struct _ObMenuEntry ObMenuEntry; 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); extern GHashTable *menu_hash; extern GList *menu_visible; struct _ObMenu { ObWindow obwin; gchar *label; gchar *name; GList *entries; gboolean shown; gboolean invalid; ObMenu *parent; ObMenu *open_submenu; /* place a menu on screen */ menu_controller_show show; void (*hide)( /* some bummu */); /* render a menu */ menu_controller_update update; menu_controller_mouseover mouseover; void (*selected)( /* some bummu */); /* render stuff */ struct _ObClient *client; Window frame; Window title; RrAppearance *a_title; gint title_min_w, title_h; Window items; RrAppearance *a_items; gint bullet_w; gint item_h; Point location; Size size; guint xin_area; /* index of the xinerama head/area */ /* plugin stuff */ char *plugin; void *plugin_data; }; typedef enum { OB_MENU_ENTRY_RENDER_TYPE_NONE, OB_MENU_ENTRY_RENDER_TYPE_SUBMENU, OB_MENU_ENTRY_RENDER_TYPE_BOOLEAN, OB_MENU_ENTRY_RENDER_TYPE_SEPARATOR, OB_MENU_ENTRY_RENDER_TYPE_OTHER /* XXX what is this? */ } ObMenuEntryRenderType; struct _ObMenuEntry { char *label; ObMenu *parent; Action *action; ObMenuEntryRenderType render_type; gboolean hilite; gboolean enabled; gboolean boolean_value; ObMenu *submenu; /* render stuff */ Window item; RrAppearance *a_item; RrAppearance *a_disabled; RrAppearance *a_hilite; gint y; gint min_w; } MenuEntry; typedef struct PluginMenuCreateData{ xmlDocPtr doc; xmlNodePtr node; ObMenu *parent; } PluginMenuCreateData; void menu_startup(); void menu_shutdown(); #define menu_new(l, n, p) \ menu_new_full(l, n, p, NULL, NULL) ObMenu *menu_new_full(char *label, char *name, ObMenu *parent, menu_controller_show show, menu_controller_update update); void menu_free(char *name); void menu_show(char *name, int x, int y, struct _ObClient *client); void menu_show_full(ObMenu *menu, int x, int y, struct _ObClient *client); void menu_hide(ObMenu *self); void menu_clear(ObMenu *self); ObMenuEntry *menu_entry_new_full(char *label, Action *action, ObMenuEntryRenderType render_type, gpointer submenu); #define menu_entry_new(label, action) \ menu_entry_new_full(label, action, OB_MENU_ENTRY_RENDER_TYPE_NONE, NULL) #define menu_entry_new_separator(label) \ menu_entry_new_full(label, NULL, OB_MENU_ENTRY_RENDER_TYPE_SEPARATOR, NULL) #define menu_entry_new_submenu(label, submenu) \ menu_entry_new_full(label, NULL, OB_MENU_ENTRY_RENDER_TYPE_SUBMENU, submenu) #define menu_entry_new_boolean(label, action) \ menu_entry_new_full(label, action, OB_MENU_ENTRY_RENDER_TYPE_BOOLEAN, NULL) void menu_entry_free(ObMenuEntry *entry); void menu_entry_set_submenu(ObMenuEntry *entry, ObMenu *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_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); void menu_control_mouseover(ObMenuEntry *entry, gboolean enter); ObMenuEntry *menu_control_keyboard_nav(ObMenuEntry *over, ObKey key); #endif |