summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorMikael Magnusson <mikachu@comhem.se>2006-04-22 19:21:06 +0000
committerMikael Magnusson <mikachu@comhem.se>2006-04-22 19:21:06 +0000
commit310d268bf0b3fbc065e754b9dc25862a60efcaae (patch)
tree0bb2f65b00ea0a5dccf4b66f013bf612b010c61e /openbox
parentad215303e7e651c0274d219709e109073bc4a032 (diff)
patch from syscrash2k, adds submenuShowDelay option, bug #2682
Diffstat (limited to 'openbox')
-rw-r--r--openbox/config.c4
-rw-r--r--openbox/config.h2
-rw-r--r--openbox/menuframe.c32
3 files changed, 36 insertions, 2 deletions
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);
+ }
+ }
}
}