From f3285a3d0bf118ce0eba0014ea53b11f47d710d6 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 6 Jan 2010 17:30:42 -0500 Subject: [PATCH] Improved menu behaviour Make 'left' key in a menu close it's visible child menu and move to the parent properly. Make clicking on a menu item in a menu close any of its grandchildren and remove focus from its children, effectively focusing the menu item you clicked on. --- openbox/event.c | 7 ++++++- openbox/menuframe.c | 34 +++++++++++++++++++--------------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/openbox/event.c b/openbox/event.c index c77d968a..ad9dade6 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -1700,8 +1700,13 @@ static gboolean event_handle_menu_keyboard(XEvent *ev) else if (ob_keycode_match(keycode, OB_KEY_LEFT)) { /* Left goes to the parent menu */ - if (frame->parent) + if (frame->parent) { + /* remove focus from the child */ menu_frame_select(frame, NULL, TRUE); + /* and put it in the parent */ + menu_frame_select(frame->parent, frame->parent->selected, + TRUE); + } ret = TRUE; } diff --git a/openbox/menuframe.c b/openbox/menuframe.c index d8c1691e..088986f8 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -1153,15 +1153,13 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry, ObMenuEntryFrame *old = self->selected; ObMenuFrame *oldchild = self->child; ObMenuEntryFrame *oldchild_entry = self->child_entry; - ObMenuEntryFrame *temp; /* if the user selected a separator, ignore it and reselect what we had selected before */ if (entry && entry->entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR) entry = old; - if (old == entry && (old->entry->type != OB_MENU_ENTRY_TYPE_SUBMENU || - old == oldchild_entry)) + if (old == entry && (old->entry->type != OB_MENU_ENTRY_TYPE_SUBMENU)) return; /* if the user left this menu but we have a submenu open, move the @@ -1203,18 +1201,24 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry, if (self->selected) { menu_entry_frame_render(self->selected); - /* only show if the submenu isn't already showing */ - if (oldchild_entry != self->selected && - self->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) - { - if (immediate || config_submenu_hide_delay == 0) - menu_entry_frame_show_submenu(self->selected); - else if (config_submenu_hide_delay > 0) - ob_main_loop_timeout_add(ob_main_loop, - config_submenu_show_delay * 1000, - submenu_show_timeout, - self->selected, g_direct_equal, - NULL); + if (self->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) { + /* only show if the submenu isn't already showing */ + if (oldchild_entry != self->selected) { + if (immediate || config_submenu_hide_delay == 0) + menu_entry_frame_show_submenu(self->selected); + else if (config_submenu_hide_delay > 0) + ob_main_loop_timeout_add(ob_main_loop, + config_submenu_show_delay * 1000, + submenu_show_timeout, + self->selected, g_direct_equal, + NULL); + } + /* hide the grandchildren of this menu. and move the cursor to + the current menu */ + else if (immediate && self->child && self->child->child) { + menu_frame_hide(self->child->child); + menu_frame_select(self->child, NULL, TRUE); + } } } } -- 2.39.2