]> Dogcows Code - chaz/openbox/blobdiff - openbox/action.c
more hacks to avoid races
[chaz/openbox] / openbox / action.c
index 249dec07dcef7f8f458d92a45b84b2002316c5d8..1af396a495a42c9cdff9d53e85496acf268b202f 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);
This page took 0.023626 seconds and 4 git commands to generate.