summaryrefslogtreecommitdiff
path: root/openbox/menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'openbox/menu.c')
-rw-r--r--openbox/menu.c51
1 files changed, 37 insertions, 14 deletions
diff --git a/openbox/menu.c b/openbox/menu.c
index a8a51117..e2c55c6d 100644
--- a/openbox/menu.c
+++ b/openbox/menu.c
@@ -18,28 +18,51 @@ GSList *menu_visible = NULL;
static void parse_menu(xmlDocPtr doc, xmlNodePtr node, void *data)
{
+ parse_menu_full(doc, node, data, TRUE);
+}
+
+
+void parse_menu_full(xmlDocPtr doc, xmlNodePtr node, void *data,
+ gboolean newmenu)
+{
Action *act;
xmlNodePtr nact;
- gchar *id = NULL, *title = NULL, *label = NULL;
- ObMenu *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;
+ gchar *id = NULL, *title = NULL, *label = NULL, *plugin;
+ ObMenu *menu = NULL, *parent;
+
+ if (newmenu == TRUE) {
+ 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);
+ g_message("menu label %s", title);
- menu = menu_new(title, id, data ? *((ObMenu**)data) : NULL);
- if (data)
- *((ObMenu**)data) = menu;
+ menu = menu_new(title, id, data ? *((ObMenu**)data) : NULL);
+ if (data)
+ *((ObMenu**)data) = menu;
+ } else {
+ menu = (ObMenu *)data;
+ }
+
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));
+ if (parse_attr_string("plugin", node, &plugin)) {
+ PluginMenuCreateData data = {
+ .doc = doc,
+ .node = node,
+ .parent = menu
+ };
+ parent = plugin_create(plugin, &data);
+ } else {
+ 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)) {