- 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, ObClient *client);
-
-void menu_destroy_hash_key(Menu *menu)
+ ObMenu *parent;
+ ObMenu *pipe_creator;
+};
+
+static GHashTable *menu_hash = NULL;
+static ObParseInst *menu_parse_inst;
+static ObMenuParseState menu_parse_state;
+
+static void menu_destroy_hash_value(ObMenu *self);
+static void parse_menu_item(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+ gpointer data);
+static void parse_menu_separator(ObParseInst *i,
+ xmlDocPtr doc, xmlNodePtr node,
+ gpointer data);
+static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+ gpointer data);
+
+static void client_dest(ObClient *client, gpointer data)