]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
stop any moveresizes on shutdown
[chaz/openbox] / openbox / event.c
index 79d350775ed43be0fc2364f37b581928f25af560..22a074fd462cfe420cc6864b114a5868f3134f3b 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)
 {
@@ -488,10 +492,16 @@ static void event_process(const XEvent *ec, gpointer data)
         if (menu_frame_visible)
             event_handle_menu(e);
         else {
-            if (!keyboard_process_interactive_grab(e)) {
+            if (!keyboard_process_interactive_grab(e, &client)) {
                 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);
@@ -500,7 +510,8 @@ static void event_process(const XEvent *ec, gpointer data)
                        causes the window which appears to be focused to be
                        the one on which the actions will be executed */
                     keyboard_event((focus_cycle_target ?
-                                    focus_cycle_target : client), e);
+                                    focus_cycle_target :
+                                    (client ? client : focus_client)), e);
             }
         }
     }
@@ -570,7 +581,9 @@ static void event_handle_client(ObClient *client, XEvent *e)
         /* Wheel buttons don't draw because they are an instant click, so it
            is a waste of resources to go drawing it. */
         if (!(e->xbutton.button == 4 || e->xbutton.button == 5)) {
-            switch (frame_context(client, e->xbutton.window)) {
+            con = frame_context(client, e->xbutton.window);
+            con = mouse_button_frame_context(con, e->xbutton.button);
+            switch (con) {
             case OB_FRAME_CONTEXT_MAXIMIZE:
                 client->frame->max_press = (e->type == ButtonPress);
                 framerender_frame(client->frame);
@@ -1121,14 +1134,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,
@@ -1167,6 +1177,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.022174 seconds and 4 git commands to generate.