From 76aeb9b231fdd82ffe7f3d39b515c468d2029c4c Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 22 Jun 2003 08:32:35 +0000 Subject: [PATCH] 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. --- openbox/menu.c | 73 ++++++++++++++++++++++++++++++++++--------- openbox/menu_render.c | 18 +++++++++++ 2 files changed, 76 insertions(+), 15 deletions(-) diff --git a/openbox/menu.c b/openbox/menu.c index a02cda9d..29e6677d 100644 --- a/openbox/menu.c +++ b/openbox/menu.c @@ -15,6 +15,52 @@ GHashTable *menu_hash = NULL; #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_entry_free(MenuEntry *self) 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 @@ void menu_startup() 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,23 +211,17 @@ Menu *menu_new_full(char *label, char *name, Menu *parent, 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); g_hash_table_insert(window_map, &self->items, self); @@ -236,9 +280,8 @@ void menu_add_entry(Menu *menu, MenuEntry *entry) 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 @@ void menu_show(char *name, int x, int y, Client *client) name); return; } - + menu_show_full(self, x, y, client); } diff --git a/openbox/menu_render.c b/openbox/menu_render.c index 2ca1c773..73a539e8 100644 --- a/openbox/menu_render.c +++ b/openbox/menu_render.c @@ -26,6 +26,18 @@ void menu_render_full(Menu *self) { 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; @@ -39,6 +51,12 @@ void menu_render_full(Menu *self) { 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); self->size.width = MAX(self->size.width, e->min_w); -- 2.45.2