+ 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 gboolean menu_open(gchar *file, xmlDocPtr *doc, xmlNodePtr *node)
+{
+ gboolean loaded = TRUE;
+ gchar *p;
+
+ if (file[0] == '/') {
+ if (!parse_load(file, "openbox_menu", doc, node)) {
+ g_warning("Failed to load menu from '%s'", file);
+ loaded = FALSE;
+ }
+ } else {
+ p = g_build_filename(g_get_home_dir(), ".openbox", file, NULL);
+ if (!parse_load(p, "openbox_menu", doc, node)) {
+ g_free(p);
+ p = g_build_filename(RCDIR, file, NULL);
+ if (!parse_load(p, "openbox_menu", doc, node)) {
+ g_free(p);
+ p = g_strdup(file);
+ if (!parse_load(p, "openbox_menu", doc, node)) {
+ g_warning("Failed to load menu from '%s'", file);
+ loaded = FALSE;
+ }
+ }
+ }
+ g_free(p);
+ }
+ return loaded;