all repos — openbox @ 76aeb9b231fdd82ffe7f3d39b515c468d2029c4c

openbox fork - make it a bit more like ryudo

add a simple menu parser.
while menu parsing, the theme does not exist so we can't do any theme stuff while creating menu stuff, so put that off for later, i.e when the menu is shown.
Dana Jansens danakj@orodu.net
commit

76aeb9b231fdd82ffe7f3d39b515c468d2029c4c

parent

197988af674da27837f7a9e930e7a6d5c7a48c60

2 files changed, 76 insertions(+), 15 deletions(-)

jump to
M openbox/menu.copenbox/menu.c

@@ -15,6 +15,52 @@ #define TITLE_EVENTMASK (ButtonPressMask | ButtonMotionMask)

#define ENTRY_EVENTMASK (EnterWindowMask | LeaveWindowMask | \ ButtonPressMask | ButtonReleaseMask) +static void parse_menu(xmlDocPtr doc, xmlNodePtr node, void *data) +{ + Action *act; + xmlNodePtr nact; + gchar *id = NULL, *title = NULL, *label = NULL; + Menu *menu, *parent; + + if (!parse_attr_string("id", node->parent, &id)) + goto parse_menu_fail; + if (!parse_attr_string("label", node->parent, &title)) + goto parse_menu_fail; + + g_message("menu label %s", title); + + menu = menu_new(title, id, data ? *((Menu**)data) : NULL); + if (data) + *((Menu**)data) = menu; + + while (node) { + if (!xmlStrcasecmp(node->name, (const xmlChar*) "menu")) { + parent = menu; + parse_menu(doc, node->xmlChildrenNode, &parent); + menu_add_entry(menu, menu_entry_new_submenu(parent->label, + parent)); + } + else if (!xmlStrcasecmp(node->name, (const xmlChar*) "item")) { + if (parse_attr_string("label", node, &label)) { + if ((nact = parse_find_node("action", node->xmlChildrenNode))) + act = action_parse(doc, nact); + else + act = NULL; + if (act) + menu_add_entry(menu, menu_entry_new(label, act)); + else + menu_add_entry(menu, menu_entry_new_separator(label)); + g_free(label); + } + } + node = node->next; + } + +parse_menu_fail: + g_free(id); + g_free(title); +} + void menu_control_show(Menu *self, int x, int y, Client *client); void menu_destroy_hash_key(Menu *menu)

@@ -64,17 +110,20 @@ }

void menu_startup() { - Menu *m; /* + Menu *m; Menu *s; Menu *t; -*/ Action *a; +*/ menu_hash = g_hash_table_new_full(g_str_hash, g_str_equal, (GDestroyNotify)menu_destroy_hash_key, (GDestroyNotify)menu_destroy_hash_value); + parse_register("menu", parse_menu, NULL); + +/* m = menu_new("sex menu", "root", NULL); a = action_from_string("execute");

@@ -85,6 +134,7 @@ menu_add_entry(m, menu_entry_new("restart", a));

menu_add_entry(m, menu_entry_new_separator("--")); a = action_from_string("exit"); menu_add_entry(m, menu_entry_new("exit", a)); +*/ /* s = menu_new("subsex menu", "submenu", m);

@@ -161,22 +211,16 @@ self->plugin_data = NULL;

attrib.override_redirect = TRUE; attrib.event_mask = FRAME_EVENTMASK; - self->frame = createWindow(ob_root, CWOverrideRedirect|CWEventMask, &attrib); + self->frame = createWindow(ob_root, + CWOverrideRedirect|CWEventMask, &attrib); attrib.event_mask = TITLE_EVENTMASK; self->title = createWindow(self->frame, CWEventMask, &attrib); self->items = createWindow(self->frame, 0, &attrib); - XSetWindowBorderWidth(ob_display, self->frame, ob_rr_theme->bwidth); - XSetWindowBackground(ob_display, self->frame, ob_rr_theme->b_color->pixel); - XSetWindowBorderWidth(ob_display, self->title, ob_rr_theme->bwidth); - XSetWindowBorder(ob_display, self->frame, ob_rr_theme->b_color->pixel); - XSetWindowBorder(ob_display, self->title, ob_rr_theme->b_color->pixel); + self->a_title = self->a_items = NULL; XMapWindow(ob_display, self->title); XMapWindow(ob_display, self->items); - - self->a_title = RrAppearanceCopy(ob_rr_theme->a_menu_title); - self->a_items = RrAppearanceCopy(ob_rr_theme->a_menu); g_hash_table_insert(window_map, &self->frame, self); g_hash_table_insert(window_map, &self->title, self);

@@ -236,9 +280,8 @@

attrib.event_mask = ENTRY_EVENTMASK; entry->item = createWindow(menu->items, CWEventMask, &attrib); XMapWindow(ob_display, entry->item); - entry->a_item = RrAppearanceCopy(ob_rr_theme->a_menu_item); - entry->a_disabled = RrAppearanceCopy(ob_rr_theme->a_menu_disabled); - entry->a_hilite = RrAppearanceCopy(ob_rr_theme->a_menu_hilite); + + entry->a_item = entry->a_disabled = entry->a_hilite = NULL; menu->invalid = TRUE;

@@ -255,7 +298,7 @@ g_warning("Attempted to show menu '%s' but it does not exist.",

name); return; } - + menu_show_full(self, x, y, client); }
M openbox/menu_render.copenbox/menu_render.c

@@ -26,6 +26,18 @@

self->size.width = 1; self->item_h = 1; + if (self->a_title == NULL) { + XSetWindowBorderWidth(ob_display, self->frame, ob_rr_theme->bwidth); + XSetWindowBackground(ob_display, self->frame, + ob_rr_theme->b_color->pixel); + XSetWindowBorderWidth(ob_display, self->title, ob_rr_theme->bwidth); + XSetWindowBorder(ob_display, self->frame, ob_rr_theme->b_color->pixel); + XSetWindowBorder(ob_display, self->title, ob_rr_theme->b_color->pixel); + + self->a_title = RrAppearanceCopy(ob_rr_theme->a_menu_title); + self->a_items = RrAppearanceCopy(ob_rr_theme->a_menu); + } + /* set texture data and size them mofos out */ if (self->label) { self->a_title->texture[0].data.text.string = self->label;

@@ -38,6 +50,12 @@

for (it = self->entries; it; it = it->next) { MenuEntry *e = it->data; int h; + + if (e->a_item == NULL) { + e->a_item = RrAppearanceCopy(ob_rr_theme->a_menu_item); + e->a_disabled = RrAppearanceCopy(ob_rr_theme->a_menu_disabled); + e->a_hilite = RrAppearanceCopy(ob_rr_theme->a_menu_hilite); + } e->a_item->texture[0].data.text.string = e->label; RrMinsize(e->a_item, &e->min_w, &self->item_h);