all repos — openbox @ 31cdb959639755a195f6bbf733b64971b6f5513c

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
#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