X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fmenu.c;h=231777f214e589850975e36262480582f96336e3;hb=4bb7543de6c66d6d9068f76f253d45f44f58d5fb;hp=286434cf09218672055ff94513c7d122b02f1a53;hpb=84a60ebbfbdf9deea446c35c53f8703edeb8213d;p=chaz%2Fopenbox diff --git a/openbox/menu.c b/openbox/menu.c index 286434cf..231777f2 100644 --- a/openbox/menu.c +++ b/openbox/menu.c @@ -39,20 +39,27 @@ static gboolean menu_open(gchar *file, xmlDocPtr *doc, xmlNodePtr *node) gboolean loaded = TRUE; gchar *p; - 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 (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_strdup(file); + p = g_build_filename(RCDIR, file, NULL); if (!parse_load(p, "openbox_menu", doc, node)) { - g_warning("Failed to load menu from '%s'", file); - loaded = FALSE; + 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); } - g_free(p); return loaded; } @@ -154,6 +161,8 @@ void menu_pipe_execute(ObMenu *self) } else { g_warning("Invalid output from pipe-menu: %s", self->execute); } + + g_free(output); } static ObMenu* menu_from_name(gchar *name) @@ -253,7 +262,17 @@ ObMenu* menu_new(gchar *name, gchar *title, gpointer data) static void menu_destroy_hash_value(ObMenu *self) { - /* XXX make sure its not visible */ + /* make sure its not visible */ + { + GList *it; + ObMenuFrame *f; + + for (it = menu_frame_visible; it; it = g_list_next(it)) { + f = it->data; + if (f->menu == self) + menu_frame_hide_all(); + } + } if (self->destroy_func) self->destroy_func(self, self->data); @@ -262,6 +281,8 @@ static void menu_destroy_hash_value(ObMenu *self) g_free(self->name); g_free(self->title); g_free(self->execute); + + g_free(self); } void menu_free(ObMenu *menu) @@ -276,6 +297,8 @@ void menu_show(gchar *name, gint x, gint y, ObClient *client) if (!(self = menu_from_name(name))) return; + menu_frame_hide_all(); + frame = menu_frame_new(self, client); menu_frame_move(frame, x, y); menu_frame_show(frame, NULL); @@ -332,7 +355,18 @@ void menu_entry_free(ObMenuEntry *self) void menu_clear_entries(ObMenu *self) { - /* XXX assert that the menu isn't visible */ +#ifdef DEBUG + /* assert that the menu isn't visible */ + { + GList *it; + ObMenuFrame *f; + + for (it = menu_frame_visible; it; it = g_list_next(it)) { + f = it->data; + g_assert(f->menu != self); + } + } +#endif while (self->entries) { menu_entry_free(self->entries->data);