]> Dogcows Code - chaz/openbox/blobdiff - openbox/action.c
when restoring from show-desktop mode because a window is going to be focused, then...
[chaz/openbox] / openbox / action.c
index 249dec07dcef7f8f458d92a45b84b2002316c5d8..b54e888eec34a8e5d8679b7c43fc2ad433438768 100644 (file)
@@ -1098,16 +1098,37 @@ void action_run_list(GSList *acts, ObClient *c, ObFrameContext context,
             if (a->data.any.interactive || a->func == action_moveresize) {
                 /* interactive actions are not queued */
                 a->func(&a->data);
-            } else if (context == OB_FRAME_CONTEXT_CLIENT ||
-                       (c && c->type == OB_CLIENT_TYPE_DESKTOP &&
-                        context == OB_FRAME_CONTEXT_DESKTOP)) {
+            } else if ((context == OB_FRAME_CONTEXT_CLIENT ||
+                        (c && c->type == OB_CLIENT_TYPE_DESKTOP &&
+                         context == OB_FRAME_CONTEXT_DESKTOP)) &&
+                       (a->func == action_focus ||
+                        a->func == action_activate ||
+                        a->func == action_showmenu))
+            {
                 /* XXX MORE UGLY HACK
                    actions from clicks on client windows are NOT queued.
                    this solves the mysterious click-and-drag-doesnt-work
                    problem. it was because the window gets focused and stuff
                    after the button event has already been passed through. i
                    dont really know why it should care but it does and it makes
-                   a difference. */
+                   a difference.
+
+                   however this very bogus ! !
+                   we want to send the button press to the window BEFORE
+                   we do the action because the action might move the windows
+                   (eg change desktops) and then the button press ends up on
+                   the completely wrong window !
+                   so, this is just for that bug, and it will only NOT queue it
+                   if it is a focusing action that can be used with the mouse
+                   pointer. ugh.
+
+                   also with the menus, there is a race going on. if the
+                   desktop wants to pop up a menu, and we do to, we send them
+                   the button before we pop up the menu, so they pop up their
+                   menu first. but not always. if we pop up our menu before
+                   sending them the button press, then the result is
+                   deterministic. yay.
+                */
                 a->func(&a->data);
             } else
                 ob_main_loop_queue_action(ob_main_loop, a);
@@ -1911,17 +1932,17 @@ void action_toggle_dockautohide(union ActionData *data)
 
 void action_toggle_show_desktop(union ActionData *data)
 {
-    screen_show_desktop(!screen_showing_desktop);
+    screen_show_desktop(!screen_showing_desktop, TRUE);
 }
 
 void action_show_desktop(union ActionData *data)
 {
-    screen_show_desktop(TRUE);
+    screen_show_desktop(TRUE, TRUE);
 }
 
 void action_unshow_desktop(union ActionData *data)
 {
-    screen_show_desktop(FALSE);
+    screen_show_desktop(FALSE, TRUE);
 }
 
 void action_break_chroot(union ActionData *data)
This page took 0.021093 seconds and 4 git commands to generate.