]> Dogcows Code - chaz/openbox/commitdiff
patch from syscrash2k, adds submenuShowDelay option, bug #2682
authorMikael Magnusson <mikachu@comhem.se>
Sat, 22 Apr 2006 19:21:06 +0000 (19:21 +0000)
committerMikael Magnusson <mikachu@comhem.se>
Sat, 22 Apr 2006 19:21:06 +0000 (19:21 +0000)
openbox/config.c
openbox/config.h
openbox/menuframe.c

index c7a6246c1fd5372f306477f418a3bb2322f92dc8..9109675b2529dd560918a30a7a0c7ce8cb05bd06 100644 (file)
@@ -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;
 
index 9b92fba62f3de403b38a6b5d327b5e2937b452dc..a42e8a7e4ad871f936fd48ac13d7431639f4f08e 100644 (file)
@@ -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 */
index 1362d9632182d967bf1f0bd7b112291ba94bfc2a..6cfcd6173461603a45dbc729c9781149ea8cf1aa 100644 (file)
@@ -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);
+            }
+        }
     }
 }
 
This page took 0.031404 seconds and 4 git commands to generate.