X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmenu.c;h=6a217fc662a4f6a7c1ce1034d52130eb9405e6a4;hb=0f677834e253dfd18a246c8811bf4a4e364d5e0e;hp=c6e986b970af1f97f5f65ed8e4bd167370fc5b2d;hpb=1066f0125af0335b010077eb9a84c6bd01d65324;p=chaz%2Fopenbox diff --git a/openbox/menu.c b/openbox/menu.c index c6e986b9..6a217fc6 100644 --- a/openbox/menu.c +++ b/openbox/menu.c @@ -110,13 +110,13 @@ void menu_startup(gboolean reconfig) g_assert(menu_parse_state.parent == NULL); if (!reconfig) - client_add_destructor(client_dest, NULL); + client_add_destroy_notify(client_dest, NULL); } void menu_shutdown(gboolean reconfig) { if (!reconfig) - client_remove_destructor(client_dest); + client_remove_destroy_notify(client_dest); parse_shutdown(menu_parse_inst); menu_parse_inst = NULL; @@ -327,12 +327,28 @@ ObMenu* menu_new(const gchar *name, const gchar *title, g_hash_table_replace(menu_hash, self->name, self); + /* Each menu has a single more_menu. When the menu spills past what + can fit on the screen, a new menu frame entry is created from this + more_menu, and a new menu frame for the submenu is created for this + menu, also pointing to the more_menu. + + This can be done multiple times using the same more_menu. + + more_menu->more_menu will always be NULL, since there is only 1 for + each menu. */ self->more_menu = g_new0(ObMenu, 1); self->more_menu->name = _("More..."); self->more_menu->title = _("More..."); self->more_menu->data = data; self->more_menu->shortcut = g_unichar_tolower(g_utf8_get_char("M")); + self->more_menu->show_func = self->show_func; + self->more_menu->hide_func = self->hide_func; + self->more_menu->update_func = self->update_func; + self->more_menu->execute_func = self->execute_func; + self->more_menu->destroy_func = self->destroy_func; + self->more_menu->place_func = self->place_func; + return self; } @@ -389,11 +405,20 @@ void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client) frame = menu_frame_new(self, 0, client); if (!menu_frame_show_topmenu(frame, x, y, button)) menu_frame_free(frame); - else if (frame->entries) { - /* select the first entry if it's not a submenu */ - ObMenuEntryFrame *e = frame->entries->data; - if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL) - menu_frame_select(frame, e, FALSE); + else if (!button) { + /* select the first entry if it's not a submenu and we opened + * the menu with the keyboard, and skip all headers */ + GList *it = frame->entries; + while (it) { + ObMenuEntryFrame *e = it->data; + if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL) { + menu_frame_select(frame, e, FALSE); + break; + } else if (e->entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR) + it = g_list_next(it); + else + break; + } } } @@ -532,31 +557,37 @@ ObMenuEntry* menu_add_separator(ObMenu *self, gint id, const gchar *label) void menu_set_show_func(ObMenu *self, ObMenuShowFunc func) { self->show_func = func; + self->more_menu->show_func = func; /* keep it in sync */ } void menu_set_hide_func(ObMenu *self, ObMenuHideFunc func) { self->hide_func = func; + self->more_menu->hide_func = func; /* keep it in sync */ } void menu_set_update_func(ObMenu *self, ObMenuUpdateFunc func) { self->update_func = func; + self->more_menu->update_func = func; /* keep it in sync */ } void menu_set_execute_func(ObMenu *self, ObMenuExecuteFunc func) { self->execute_func = func; + self->more_menu->execute_func = func; /* keep it in sync */ } void menu_set_destroy_func(ObMenu *self, ObMenuDestroyFunc func) { self->destroy_func = func; + self->more_menu->destroy_func = func; /* keep it in sync */ } void menu_set_place_func(ObMenu *self, ObMenuPlaceFunc func) { self->place_func = func; + self->more_menu->place_func = func; /* keep it in sync */ } ObMenuEntry* menu_find_entry_id(ObMenu *self, gint id)