+ xmlDocPtr doc;
+ xmlNodePtr node;
+ gboolean loaded = FALSE;
+ GSList *it;
+
+ menu_hash = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
+ (GDestroyNotify)menu_destroy_hash_value);
+
+ client_list_menu_startup();
+ client_menu_startup();
+
+ menu_parse_inst = parse_startup();
+
+ menu_parse_state.parent = NULL;
+ menu_parse_state.pipe_creator = NULL;
+ parse_register(menu_parse_inst, "menu", parse_menu, &menu_parse_state);
+ parse_register(menu_parse_inst, "item", parse_menu_item,
+ &menu_parse_state);
+ parse_register(menu_parse_inst, "separator",
+ parse_menu_separator, &menu_parse_state);
+
+ for (it = config_menu_files; it; it = g_slist_next(it)) {
+ if (parse_load_menu(it->data, &doc, &node)) {
+ loaded = TRUE;
+ parse_tree(menu_parse_inst, doc, node->children);
+ xmlFreeDoc(doc);
+ }
+ }
+ if (!loaded) {
+ if (parse_load_menu("menu.xml", &doc, &node)) {
+ parse_tree(menu_parse_inst, doc, node->children);
+ xmlFreeDoc(doc);
+ }
+ }
+
+ g_assert(menu_parse_state.parent == NULL);