summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2010-06-25 09:48:10 +1000
committerKeith Packard <keithp@keithp.com>2010-06-30 06:44:07 -0700
commit018c878e9495b21146c8f38617fdd1bf6d8cc73b (patch)
tree95c38b893f65acfdd41fe89288f1c88fb3b0d98c
parent3b3c77b87070ddcdbb2acb114a81628485e7a129 (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.c52
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