summaryrefslogtreecommitdiff
path: root/openbox/mouse.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2008-02-02 11:22:17 -0500
committerDana Jansens <danakj@orodu.net>2008-02-02 11:22:17 -0500
commit746859c1017e9cdf73eb91470e795f0c4b98b21a (patch)
treeff950342cdfb0290505b68a541864aa18d25279f /openbox/mouse.c
parentc64be9066eaae89839bb59c4d4e9539f2a7e8fc1 (diff)
if windows on screen are going to be moved, then do the ReplayPointer before that occurs, so it goes to the right window. if they are not, then just wait until after the actions are run (for kdesktop's sake really)
Diffstat (limited to 'openbox/mouse.c')
-rw-r--r--openbox/mouse.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/openbox/mouse.c b/openbox/mouse.c
index 66615585..711317ec 100644
--- a/openbox/mouse.c
+++ b/openbox/mouse.c
@@ -225,6 +225,17 @@ void mouse_event(ObClient *client, XEvent *e)
button = e->xbutton.button;
state = e->xbutton.state;
+ /* if the binding was in a client context, then we need to call
+ XAllowEvents with ReplayPointer at some point, to send the event
+ through to the client. when this happens though depends. if
+ windows are going to be moved on screen, then the click will end
+ up going somewhere wrong, so have the action system perform the
+ ReplayPointer for us if that is the case. */
+ if (CLIENT_CONTEXT(context, client))
+ actions_set_need_pointer_replay_before_move(TRUE);
+ else
+ actions_set_need_pointer_replay_before_move(FALSE);
+
fire_binding(OB_MOUSE_ACTION_PRESS, context,
client, e->xbutton.state,
e->xbutton.button,
@@ -235,11 +246,14 @@ void mouse_event(ObClient *client, XEvent *e)
if (grab_on_pointer())
button = 0;
- if (CLIENT_CONTEXT(context, client)) {
- /* Replay the event, so it goes to the client*/
+ /* replay the pointer event if it hasn't been replayed yet (i.e. no
+ windows were moved) */
+ if (actions_get_need_pointer_replay_before_move())
XAllowEvents(ob_display, ReplayPointer, event_curtime);
- /* Fall through to the release case! */
- } else
+
+ /* in the client context, we won't get a button release because of the
+ way it is grabbed, so just fake one */
+ if (!CLIENT_CONTEXT(context, client))
break;
case ButtonRelease: