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 |
#ifndef __menu_h #define __menu_h #include "action.h" #include "render/render.h" #include "geom.h" #include <glib.h> extern GHashTable *menu_map; struct Menu; struct MenuEntry; typedef void(*menu_controller_show)(struct Menu *self, int x, int y, Client *); typedef void(*menu_controller_update)(struct Menu *self); typedef void(*menu_controller_mouseover)(struct MenuEntry *self, gboolean enter); typedef struct Menu { ObWindow obwin; char *label; char *name; GList *entries; gboolean shown; gboolean invalid; struct Menu *parent; struct Menu *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 */ Client *client; Window frame; Window title; Appearance *a_title; int title_min_w, title_h; Window items; Appearance *a_items; int bullet_w; int item_h; Point location; Size size; /* plugin stuff */ char *plugin; void *plugin_data; } Menu; typedef enum MenuEntryRenderType { MenuEntryRenderType_None = 0, MenuEntryRenderType_Submenu = 1 << 0, MenuEntryRenderType_Boolean = 1 << 1, MenuEntryRenderType_Separator = 1 << 2, MenuEntryRenderType_Other = 1 << 7 } MenuEntryRenderType; typedef struct { char *label; Menu *parent; Action *action; MenuEntryRenderType render_type; gboolean hilite; gboolean enabled; gboolean boolean_value; Menu *submenu; /* render stuff */ Window item; Appearance *a_item; Appearance *a_disabled; Appearance *a_hilite; int y; int min_w; } MenuEntry; void menu_startup(); void menu_shutdown(); #define menu_new(l, n, p) \ menu_new_full(l, n, p, NULL, NULL) Menu *menu_new_full(char *label, char *name, Menu *parent, menu_controller_show show, menu_controller_update update); void menu_free(char *name); void menu_show(char *name, int x, int y, Client *client); void menu_show_full(Menu *menu, int x, int y, Client *client); void menu_hide(Menu *self); void menu_clear(Menu *self); MenuEntry *menu_entry_new_full(char *label, Action *action, MenuEntryRenderType render_type, gpointer submenu); #define menu_entry_new(label, action) \ menu_entry_new_full(label, action, MenuEntryRenderType_None, NULL) #define menu_entry_new_separator(label) \ menu_entry_new_full(label, NULL, MenuEntryRenderType_Separator, NULL) #define menu_entry_new_submenu(label, submenu) \ menu_entry_new_full(label, NULL, MenuEntryRenderType_Submenu, submenu) #define menu_entry_new_boolean(label, action) \ menu_entry_new_full(label, action, MenuEntryRenderType_Boolean, NULL) void menu_entry_free(MenuEntry *entry); void menu_entry_set_submenu(MenuEntry *entry, Menu *submenu); void menu_add_entry(Menu *menu, MenuEntry *entry); MenuEntry *menu_find_entry(Menu *menu, Window win); void menu_entry_render(MenuEntry *self); void menu_entry_fire(MenuEntry *self); void menu_render(Menu *self); void menu_control_mouseover(MenuEntry *entry, gboolean enter); #endif |