all repos — openbox @ cb49f853c9b62c4403eb562d39f52c51da292c4f

openbox fork - make it a bit more like ryudo

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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#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);
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 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;
    
    /* behaviour callbacks
       TODO: Document and split code that HAS to be in the overridden callback */
    /* place a menu on screen */
    menu_controller_show show;
    /* 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;
    /* Entry is clicked/hit enter on */
    menu_controller_selected selected;


    /* 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 */

    /* Name of plugin for menu */
    char *plugin;
    /* plugin's data */
    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;
    Window submenu_pic;
    
    RrAppearance *a_item;
    RrAppearance *a_disabled;
    RrAppearance *a_hilite;
    RrAppearance *a_submenu;
    gint y;
    gint min_w;
} MenuEntry;

typedef struct PluginMenuCreateData{
    xmlDocPtr doc;
    xmlNodePtr node;
    ObMenu *parent;
} PluginMenuCreateData;


void menu_startup();
void menu_shutdown();

void menu_noop();

#define menu_new(l, n, p) \
  menu_new_full(l, n, p, menu_show_full, menu_render, menu_entry_fire, \
                menu_hide, menu_control_mouseover)

ObMenu *menu_new_full(char *label, char *name, ObMenu *parent, 
                      menu_controller_show show, menu_controller_update update,
                      menu_controller_selected selected,
                      menu_controller_hide hide,
                      menu_controller_mouseover mouseover);

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 *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);
void menu_control_mouseover(ObMenuEntry *entry, gboolean enter);
void menu_control_keyboard_nav(unsigned int key);
#endif