summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-06-22 08:32:35 +0000
committerDana Jansens <danakj@orodu.net>2003-06-22 08:32:35 +0000
commit76aeb9b231fdd82ffe7f3d39b515c468d2029c4c (patch)
treeb1f1ef086d57880a72e94e61b15871be47e699ed
parent197988af674da27837f7a9e930e7a6d5c7a48c60 (diff)
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.
-rw-r--r--openbox/menu.c73
-rw-r--r--openbox/menu_render.c18
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);