]> Dogcows Code - chaz/openbox/commitdiff
make menu hiding-on-release based on a timer rather than on where it is released...
authorDana Jansens <danakj@orodu.net>
Wed, 10 Sep 2003 19:37:52 +0000 (19:37 +0000)
committerDana Jansens <danakj@orodu.net>
Wed, 10 Sep 2003 19:37:52 +0000 (19:37 +0000)
openbox/event.c

index b5ad2924244a50ba6e766bd7db195255a4249a00..f5b2ec4823127d464e843aaa883789537eefbafd 100644 (file)
@@ -45,6 +45,8 @@ static void event_handle_client(ObClient *c, XEvent *e);
 static gboolean focus_delay_func(gpointer data);
 static void focus_delay_client_dest(gpointer data);
 
+static gboolean menu_hide_delay_func(gpointer data);
+
 #define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \
                             (e)->xfocus.detail == NotifyAncestor || \
                             (e)->xfocus.detail > NotifyNonlinearVirtual)
@@ -70,6 +72,8 @@ static int mask_table_size;
 
 static ObClient *focus_delay_client;
 
+static gboolean menu_can_hide;
+
 #ifdef USE_SM
 static void ice_handler(int fd, gpointer conn)
 {
@@ -492,6 +496,12 @@ static void event_process(const XEvent *ec, gpointer data)
                 if (moveresize_in_progress)
                     moveresize_event(e);
 
+                menu_can_hide = FALSE;
+                ob_main_loop_timeout_add(ob_main_loop,
+                                         G_USEC_PER_SEC / 4,
+                                         menu_hide_delay_func,
+                                         NULL, NULL);
+
                 if (e->type == ButtonPress || e->type == ButtonRelease ||
                     e->type == MotionNotify)
                     mouse_event(client, e);
@@ -1122,14 +1132,11 @@ static void event_handle_menu(XEvent *ev)
 
     switch (ev->type) {
     case ButtonRelease:
-        if (!(f = menu_frame_under(ev->xbutton.x_root,
-                                   ev->xbutton.y_root)))
+        if ((e = menu_entry_frame_under(ev->xbutton.x_root,
+                                        ev->xbutton.y_root)))
+            menu_entry_frame_execute(e, ev->xbutton.state);
+        else if (menu_can_hide)
             menu_frame_hide_all();
-        else {
-            if ((e = menu_entry_frame_under(ev->xbutton.x_root,
-                                            ev->xbutton.y_root)))
-                menu_entry_frame_execute(e, ev->xbutton.state);
-        }
         break;
     case MotionNotify:
         if ((f = menu_frame_under(ev->xmotion.x_root,
@@ -1168,6 +1175,12 @@ static void event_handle_menu(XEvent *ev)
     }
 }
 
+static gboolean menu_hide_delay_func(gpointer data)
+{
+    menu_can_hide = TRUE;
+    return FALSE; /* no repeat */
+}
+
 static gboolean focus_delay_func(gpointer data)
 {
     client_focus(focus_delay_client);
This page took 0.030788 seconds and 4 git commands to generate.