diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-06-15 17:16:16 +0930 |
---|---|---|
committer | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-06-15 17:16:16 +0930 |
commit | 3e894974cdd6a75683d4601f71622d1da7ec4395 (patch) | |
tree | b8fcfdf1e28f1ff6f95b7ac0a4cc07cb9dda6d59 | |
parent | 0aaf51546666f71e8d1711978bc7988ec2ecc7d9 (diff) |
Only decrement buttonsDown when the button count is greater than 0.
Device drivers flush their buttons on device init and cause a button down
event to be generated. If we unconditionally decrease the buttons, we won't be
able to ever get a passive device grab.
Format documentation for CheckDeviceGrabs to make it readable.
-rw-r--r-- | Xi/exevents.c | 4 | ||||
-rw-r--r-- | dix/events.c | 31 |
2 files changed, 24 insertions, 11 deletions
diff --git a/Xi/exevents.c b/Xi/exevents.c index 2e9e8267f..622e8cc33 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -279,6 +279,8 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count) SetMaskForEvent(Motion_Filter(b), DeviceMotionNotify); if (!grab) if (CheckDeviceGrabs(device, xE, 0, count)) + /* if a passive grab was activated, the event has been sent + * already */ return; } else if (xE->u.u.type == DeviceButtonRelease) { @@ -289,7 +291,7 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count) *kptr &= ~bit; if (device->valuator) device->valuator->motionHintWindow = NullWindow; - if (!--b->buttonsDown) + if (b->buttonsDown >= 1 && !--b->buttonsDown) b->motionMask = 0; xE->u.u.detail = b->map[key]; if (xE->u.u.detail == 0) diff --git a/dix/events.c b/dix/events.c index ba1463a01..4c5f5b9e2 100644 --- a/dix/events.c +++ b/dix/events.c @@ -2963,6 +2963,7 @@ BorderSizeNotEmpty(DeviceIntPtr pDev, WindowPtr pWin) /** * "CheckPassiveGrabsOnWindow" checks to see if the event passed in causes a * passive grab set on the window to be activated. + * If a passive grab is activated, the event will be delivered to the client. * * @param pWin The window that may be subject to a passive grab. * @param device Device that caused the event. @@ -3064,16 +3065,26 @@ CheckPassiveGrabsOnWindow( } /** -"CheckDeviceGrabs" handles both keyboard and pointer events that may cause -a passive grab to be activated. If the event is a keyboard event, the -ancestors of the focus window are traced down and tried to see if they have -any passive grabs to be activated. If the focus window itself is reached and -it's descendants contain they pointer, the ancestors of the window that the -pointer is in are then traced down starting at the focus window, otherwise no -grabs are activated. If the event is a pointer event, the ancestors of the -window that the pointer is in are traced down starting at the root until -CheckPassiveGrabs causes a passive grab to activate or all the windows are -tried. PRH + * CheckDeviceGrabs handles both keyboard and pointer events that may cause + * a passive grab to be activated. + * + * If the event is a keyboard event, the ancestors of the focus window are + * traced down and tried to see if they have any passive grabs to be + * activated. If the focus window itself is reached and it's descendants + * contain the pointer, the ancestors of the window that the pointer is in + * are then traced down starting at the focus window, otherwise no grabs are + * activated. + * If the event is a pointer event, the ancestors of the window that the + * pointer is in are traced down starting at the root until CheckPassiveGrabs + * causes a passive grab to activate or all the windows are + * tried. PRH + * + * If a grab is activated, the event has been sent to the client already! + * + * @param device The device that caused the event. + * @param xE The event to handle (most likely {Device}ButtonPress). + * @param count Number of events in list. + * @return TRUE if a grab has been activated or false otherwise. */ Bool |