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 | |||
@@ -3420,7 +3420,6 @@ CheckPassiveGrabsOnWindow( | |||
3420 | { | 3420 | { |
3421 | DeviceIntPtr gdev; | 3421 | DeviceIntPtr gdev; |
3422 | XkbSrvInfoPtr xkbi = NULL; | 3422 | XkbSrvInfoPtr xkbi = NULL; |
3423 | Mask mask = 0; | ||
3424 | 3423 | ||
3425 | gdev= grab->modifierDevice; | 3424 | gdev= grab->modifierDevice; |
3426 | if (grab->grabtype == GRABTYPE_CORE) | 3425 | if (grab->grabtype == GRABTYPE_CORE) |
@@ -3535,9 +3534,6 @@ CheckPassiveGrabsOnWindow( | |||
3535 | } | 3534 | } |
3536 | xE = &core; | 3535 | xE = &core; |
3537 | count = 1; | 3536 | count = 1; |
3538 | mask = grab->eventMask; | ||
3539 | if (grab->ownerEvents) | ||
3540 | mask |= pWin->eventMask; | ||
3541 | } else if (match & XI2_MATCH) | 3537 | } else if (match & XI2_MATCH) |
3542 | { | 3538 | { |
3543 | rc = EventToXI2((InternalEvent*)event, &xE); | 3539 | rc = EventToXI2((InternalEvent*)event, &xE); |
@@ -3549,34 +3545,6 @@ CheckPassiveGrabsOnWindow( | |||
3549 | continue; | 3545 | continue; |
3550 | } | 3546 | } |
3551 | count = 1; | 3547 | count = 1; |
3552 | |||
3553 | /* FIXME: EventToXI2 returns NULL for enter events, so | ||
3554 | * dereferencing the event is bad. Internal event types are | ||
3555 | * aligned with core events, so the else clause is valid. | ||
3556 | * long-term we should use internal events for enter/focus | ||
3557 | * as well */ | ||
3558 | if (xE) | ||
3559 | mask = grab->xi2mask[device->id][((xGenericEvent*)xE)->evtype/8]; | ||
3560 | else if (event->type == XI_Enter || event->type == XI_FocusIn) | ||
3561 | mask = grab->xi2mask[device->id][event->type/8]; | ||
3562 | |||
3563 | if (grab->ownerEvents && wOtherInputMasks(grab->window)) | ||
3564 | { | ||
3565 | InputClientsPtr icp = | ||
3566 | wOtherInputMasks(grab->window)->inputClients; | ||
3567 | |||
3568 | while(icp) | ||
3569 | { | ||
3570 | if (rClient(icp) == rClient(grab)) | ||
3571 | { | ||
3572 | int evtype = (xE) ? ((xGenericEvent*)xE)->evtype : event->type; | ||
3573 | mask |= icp->xi2mask[device->id][evtype/8]; | ||
3574 | break; | ||
3575 | } | ||
3576 | |||
3577 | icp = icp->next; | ||
3578 | } | ||
3579 | } | ||
3580 | } else | 3548 | } else |
3581 | { | 3549 | { |
3582 | rc = EventToXI((InternalEvent*)event, &xE, &count); | 3550 | rc = EventToXI((InternalEvent*)event, &xE, &count); |
@@ -3587,23 +3555,6 @@ CheckPassiveGrabsOnWindow( | |||
3587 | "(%d, %d).\n", device->name, event->type, rc); | 3555 | "(%d, %d).\n", device->name, event->type, rc); |
3588 | continue; | 3556 | continue; |
3589 | } | 3557 | } |
3590 | mask = grab->eventMask; | ||
3591 | if (grab->ownerEvents && wOtherInputMasks(grab->window)) | ||
3592 | { | ||
3593 | InputClientsPtr icp = | ||
3594 | wOtherInputMasks(grab->window)->inputClients; | ||
3595 | |||
3596 | while(icp) | ||
3597 | { | ||
3598 | if (rClient(icp) == rClient(grab)) | ||
3599 | { | ||
3600 | mask |= icp->mask[device->id]; | ||
3601 | break; | ||
3602 | } | ||
3603 | |||
3604 | icp = icp->next; | ||
3605 | } | ||
3606 | } | ||
3607 | } | 3558 | } |
3608 | 3559 | ||
3609 | (*grabinfo->ActivateGrab)(device, grab, currentTime, TRUE); | 3560 | (*grabinfo->ActivateGrab)(device, grab, currentTime, TRUE); |
@@ -3612,7 +3563,8 @@ CheckPassiveGrabsOnWindow( | |||
3612 | { | 3563 | { |
3613 | FixUpEventFromWindow(device, xE, grab->window, None, TRUE); | 3564 | FixUpEventFromWindow(device, xE, grab->window, None, TRUE); |
3614 | 3565 | ||
3615 | TryClientEvents(rClient(grab), device, xE, count, mask, | 3566 | TryClientEvents(rClient(grab), device, xE, count, |
3567 | GetEventFilter(device, xE), | ||
3616 | GetEventFilter(device, xE), grab); | 3568 | GetEventFilter(device, xE), grab); |
3617 | } | 3569 | } |
3618 | 3570 | ||