all repos — openbox @ 71d2605e1c24732e923333419d829f1c5f867fed

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
#ifndef __menu_h
#define __menu_h

#include "action.h"
#include "render/render.h"
#include "geom.h"

#include <glib.h>

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);

extern GHashTable *menu_hash;

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_render_full(Menu *self);

void menu_control_mouseover(MenuEntry *entry, gboolean enter);
#endif