Allow infinite delay for submenu show/hide by using a negative value.
authorDana Jansens <danakj@orodu.net>
Mon, 4 Jan 2010 20:26:10 +0000 (15:26 -0500)
committerDana Jansens <danakj@orodu.net>
Wed, 6 Jan 2010 22:13:03 +0000 (17:13 -0500)
data/rc.xml
openbox/menuframe.c

index cf6d47c..c89625d 100644 (file)
   <middle>no</middle>
   <!-- center submenus vertically about the parent entry -->
   <submenuShowDelay>200</submenuShowDelay>
-  <!-- this one is easy, time to delay before showing a submenu after hovering
-       over the parent entry -->
+  <!-- time to delay before showing a submenu after hovering over the parent
+       entry.
+       if this is a negative value, then the delay is infinite and the
+       submenu will not be shown until it is clicked on -->
   <submenuHideDelay>400</submenuHideDelay>
   <!-- time to delay before hiding a submenu when selecting another
        entry in parent menu -->
+       if this is a negative value, then the delay is infinite and the
+       submenu will not be hidden until a different submenu is opened -->
   <applicationIcons>yes</applicationIcons>
   <!-- controls if icons appear in the client-list-(combined-)menu -->
   <manageDesktops>yes</manageDesktops>
index 9e8c891..d8c1691 100644 (file)
@@ -1160,7 +1160,9 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry,
     if (entry && entry->entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR)
         entry = old;
 
-    if (old == entry) return;
+    if (old == entry && (old->entry->type != OB_MENU_ENTRY_TYPE_SUBMENU ||
+                         old == oldchild_entry))
+        return;
 
     /* if the user left this menu but we have a submenu open, move the
        selection back to that submenu */
@@ -1187,15 +1189,14 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry,
         else if (oldchild_entry == old) {
             /* The open submenu was selected and is no longer, so hide the
                submenu */
-            if (!immediate && config_submenu_hide_delay) {
+            if (immediate || config_submenu_hide_delay == 0)
+                menu_frame_hide(oldchild);
+            else if (config_submenu_hide_delay > 0)
                 ob_main_loop_timeout_add(ob_main_loop,
                                          config_submenu_hide_delay * 1000,
                                          submenu_hide_timeout,
                                          oldchild, g_direct_equal,
                                          NULL);
-            }
-            else
-                menu_frame_hide(oldchild);
         }
     }
 
@@ -1206,15 +1207,14 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry,
         if (oldchild_entry != self->selected &&
             self->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU)
         {
-            if (config_submenu_show_delay && !immediate) {
-                /* initiate a new submenu open request */
+            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);
-            } else
-                menu_entry_frame_show_submenu(self->selected);
         }
     }
 }