diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2010-06-25 09:48:10 +1000 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2010-06-30 06:44:07 -0700 |
commit | 018c878e9495b21146c8f38617fdd1bf6d8cc73b (patch) | |
tree | 95c38b893f65acfdd41fe89288f1c88fb3b0d98c | |
parent | 3b3c77b87070ddcdbb2acb114a81628485e7a129 (diff) |
Revert "dix: use the event mask of the grab for TryClientEvents."
Behaviour of earlier X servers was to deliver the ButtonPress event
unconditionally, regardless of the actual event mask being set. Thus, a
GrabButton event will always deliver the button press event, a GrabKey
always the key press event, etc. Same goes for XI and XI2.
Reproducible with a simple client requesting a button grab in the form of:
XGrabButton(dpy, AnyButton, AnyModifier, win, True, ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, None, None);
On servers before MPX/XI2, the client will receive a button press and
release event. On current servers, the client receives only the release.
Clients that expect the press event to be delivered unconditionally may
leave the user with a stuck grab.
XTS test results for XGrabButton are identical with and without this patch.
This reverts commit 48585bd1e3e98db0f3df1ecc68022510216e00cc.
Conflicts:
dix/events.c
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r-- | dix/events.c | 52 |
1 files changed, 2 insertions, 50 deletions
diff --git a/dix/events.c b/dix/events.c index ae9847c93..e1c3d0a02 100644 --- a/dix/events.c +++ b/dix/events.c @@ -3422,3 +3422,2 @@ CheckPassiveGrabsOnWindow( XkbSrvInfoPtr xkbi = NULL; - Mask mask = 0; @@ -3537,5 +3536,2 @@ CheckPassiveGrabsOnWindow( count = 1; - mask = grab->eventMask; - if (grab->ownerEvents) - mask |= pWin->eventMask; } else if (match & XI2_MATCH) @@ -3551,30 +3547,2 @@ CheckPassiveGrabsOnWindow( count = 1; - - /* FIXME: EventToXI2 returns NULL for enter events, so - * dereferencing the event is bad. Internal event types are - * aligned with core events, so the else clause is valid. - * long-term we should use internal events for enter/focus - * as well */ - if (xE) - mask = grab->xi2mask[device->id][((xGenericEvent*)xE)->evtype/8]; - else if (event->type == XI_Enter || event->type == XI_FocusIn) - mask = grab->xi2mask[device->id][event->type/8]; - - if (grab->ownerEvents && wOtherInputMasks(grab->window)) - { - InputClientsPtr icp = - wOtherInputMasks(grab->window)->inputClients; - - while(icp) - { - if (rClient(icp) == rClient(grab)) - { - int evtype = (xE) ? ((xGenericEvent*)xE)->evtype : event->type; - mask |= icp->xi2mask[device->id][evtype/8]; - break; - } - - icp = icp->next; - } - } } else @@ -3589,19 +3557,2 @@ CheckPassiveGrabsOnWindow( } - mask = grab->eventMask; - if (grab->ownerEvents && wOtherInputMasks(grab->window)) - { - InputClientsPtr icp = - wOtherInputMasks(grab->window)->inputClients; - - while(icp) - { - if (rClient(icp) == rClient(grab)) - { - mask |= icp->mask[device->id]; - break; - } - - icp = icp->next; - } - } } @@ -3614,3 +3565,4 @@ CheckPassiveGrabsOnWindow( - TryClientEvents(rClient(grab), device, xE, count, mask, + TryClientEvents(rClient(grab), device, xE, count, + GetEventFilter(device, xE), GetEventFilter(device, xE), grab); |