From: Mikael Magnusson Date: Sat, 22 Apr 2006 19:21:06 +0000 (+0000) Subject: patch from syscrash2k, adds submenuShowDelay option, bug #2682 X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=310d268bf0b3fbc065e754b9dc25862a60efcaae;p=chaz%2Fopenbox patch from syscrash2k, adds submenuShowDelay option, bug #2682 --- diff --git a/openbox/config.c b/openbox/config.c index c7a6246c..9109675b 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -70,6 +70,7 @@ gint config_mouse_dclicktime; gboolean config_menu_warppointer; gboolean config_menu_xorstyle; guint config_menu_hide_delay; +guint config_submenu_show_delay; gboolean config_menu_client_list_icons; GSList *config_menu_files; @@ -422,6 +423,8 @@ static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, config_menu_xorstyle = parse_bool(doc, n); if ((n = parse_find_node("hideDelay", node))) config_menu_hide_delay = parse_int(doc, n); + if ((n = parse_find_node("submenuShowDelay", node))) + config_submenu_show_delay = parse_int(doc, n); if ((n = parse_find_node("desktopMenuIcons", node))) config_menu_client_list_icons = parse_bool(doc, n); } @@ -617,6 +620,7 @@ void config_startup(ObParseInst *i) config_menu_warppointer = TRUE; config_menu_xorstyle = TRUE; config_menu_hide_delay = 250; + config_submenu_show_delay = 0; config_menu_client_list_icons = TRUE; config_menu_files = NULL; diff --git a/openbox/config.h b/openbox/config.h index 9b92fba6..a42e8a7e 100644 --- a/openbox/config.h +++ b/openbox/config.h @@ -122,6 +122,8 @@ extern gboolean config_menu_warppointer; extern gboolean config_menu_xorstyle; /*! delay for hiding menu when opening */ extern guint config_menu_hide_delay; +/*! delay before opening a submenu */ +extern guint config_submenu_show_delay; /*! show icons in client_list_menu */ extern gboolean config_menu_client_list_icons; /*! User-specified menu files */ diff --git a/openbox/menuframe.c b/openbox/menuframe.c index 1362d963..6cfcd617 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -43,6 +43,7 @@ static ObMenuEntryFrame* menu_entry_frame_new(ObMenuEntry *entry, static void menu_entry_frame_free(ObMenuEntryFrame *self); static void menu_frame_render(ObMenuFrame *self); static void menu_frame_update(ObMenuFrame *self); +static gboolean menu_entry_frame_submenu_timeout(gpointer data); static Window createWindow(Window parent, gulong mask, XSetWindowAttributes *attrib) @@ -663,6 +664,11 @@ void menu_frame_hide(ObMenuFrame *self) void menu_frame_hide_all() { + if (config_submenu_show_delay) { + /* remove any submenu open requests */ + ob_main_loop_timeout_remove(ob_main_loop, + menu_entry_frame_submenu_timeout); + } GList *it = g_list_last(menu_frame_visible); if (it) menu_frame_hide(it->data); @@ -717,6 +723,12 @@ ObMenuEntryFrame* menu_entry_frame_under(gint x, gint y) return ret; } +static gboolean menu_entry_frame_submenu_timeout(gpointer data) +{ + menu_entry_frame_show_submenu((ObMenuEntryFrame*)data); + return FALSE; +} + void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry) { ObMenuEntryFrame *old = self->selected; @@ -726,6 +738,12 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry) entry = old; if (old == entry) return; + + if (config_submenu_show_delay) { + /* remove any submenu open requests */ + ob_main_loop_timeout_remove(ob_main_loop, + menu_entry_frame_submenu_timeout); + } self->selected = entry; @@ -737,8 +755,18 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry) if (self->selected) { menu_entry_frame_render(self->selected); - if (self->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) - menu_entry_frame_show_submenu(self->selected); + if (self->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) { + if (config_submenu_show_delay) { + /* initiate a new submenu open request */ + ob_main_loop_timeout_add(ob_main_loop, + config_submenu_show_delay * 1000, + menu_entry_frame_submenu_timeout, + self->selected, + NULL); + } else { + menu_entry_frame_show_submenu(self->selected); + } + } } }