all repos — openbox @ 59c3cce4f49f04ed2c2937e7de24255dd53df487

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

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

#include <glib.h>

extern GHashTable *menu_map;

typedef struct Menu {
    char *label;
    char *name;
    
    GList *entries;
    /* GList *tail; */

    /* ? */
    gboolean shown;
    gboolean invalid;
    gpointer render_data; /* where the engine can store anything it likes */

    struct Menu *parent;

    /* waste o' pointers */
    void (*show)( /* some bummu */);
    void (*hide)( /* some bummu */);
    void (*update)( /* some bummu */);
    void (*mouseover)( /* some bummu */);
    void (*selected)( /* some bummu */);
} Menu;

typedef struct MenuRenderData {
    Window frame;
    Window title;
    Appearance *a_title;
    int title_min_w, title_h;
    Window items;
    Appearance *a_items;
    int item_h;
} MenuRenderData;

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 enabled;
    gboolean boolean_value;
    gpointer render_data; /* where the engine can store anything it likes */

    Menu *submenu;
} MenuEntry;

typedef struct MenuEntryRenderData {
    Window item;
    Appearance *a_item;
    int min_w;
} MenuEntryRenderData;

void menu_startup();
void menu_shutdown();

Menu *menu_new(char *label, char *name, Menu *parent);
void menu_free(char *name);

void menu_show(char *name, int x, int y, Client *client);

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)

void menu_entry_free(MenuEntry *entry);

void menu_entry_set_submenu(MenuEntry *entry, Menu *submenu);

void menu_add_entry(Menu *menu, MenuEntry *entry);
#endif