]> Dogcows Code - chaz/openbox/commitdiff
add a simple menu parser.
authorDana Jansens <danakj@orodu.net>
Sun, 22 Jun 2003 08:32:35 +0000 (08:32 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 22 Jun 2003 08:32:35 +0000 (08:32 +0000)
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
openbox/menu_render.c

index a02cda9d61f304376bdaf6ac7b60b659938b54e8..29e6677d55988804ee20ec6ba4cc92bbd06a750d 100644 (file)
@@ -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);
 }  
 
index 2ca1c77392af215ec9eb4163205e77f560242194..73a539e868ce68fc73af81020eaf8be2fa5ae2f4 100644 (file)
@@ -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);
This page took 0.028869 seconds and 4 git commands to generate.