summaryrefslogtreecommitdiff
authorThomas Jaeger <ThJaeger@gmail.com>2008-12-21 23:55:09 (GMT)
committer Peter Hutterer <peter.hutterer@who-t.net>2009-01-16 00:43:53 (GMT)
commitf7f85f696570541e2dd43462675de9e6ee46f545 (patch) (side-by-side diff)
treeeb05b5dfa373ba42db768ba4c0dc48ea2f487a5e
parent6f065a26db62aaf1d7aab9f9a3d0e6cd09d1c1dd (diff)
downloadxserver-f7f85f696570541e2dd43462675de9e6ee46f545.zip
xserver-f7f85f696570541e2dd43462675de9e6ee46f545.tar.gz
Count the number of logically down buttons in buttonsDown
This fixes the following bug. Assuming your window manager grabs Alt+Button1 to move windows, map Button3 to 0 via XSetPointerMapping, then press the physical button 3 (this shouldn't have any effect), press Alt and then button 1. The press event is delivered to the application instead of firing the grab. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--Xi/exevents.c8
-rw-r--r--include/inputstr.h6
2 files changed, 9 insertions, 5 deletions
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 5ab9d66..f3f9d39 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -946,10 +946,10 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
*kptr |= bit;
if (device->valuator)
device->valuator->motionHintWindow = NullWindow;
- b->buttonsDown++;
- b->motionMask = DeviceButtonMotionMask;
if (!b->map[key])
return DONT_PROCESS;
+ b->buttonsDown++;
+ b->motionMask = DeviceButtonMotionMask;
if (b->map[key] <= 5)
b->state |= (Button1Mask >> 1) << b->map[key];
SetMaskForEvent(device->id, Motion_Filter(b), DeviceMotionNotify);
@@ -978,10 +978,10 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
*kptr &= ~bit;
if (device->valuator)
device->valuator->motionHintWindow = NullWindow;
- if (b->buttonsDown >= 1 && !--b->buttonsDown)
- b->motionMask = 0;
if (!b->map[key])
return DONT_PROCESS;
+ if (b->buttonsDown >= 1 && !--b->buttonsDown)
+ b->motionMask = 0;
if (b->map[key] <= 5)
b->state &= ~((Button1Mask >> 1) << b->map[key]);
SetMaskForEvent(device->id, Motion_Filter(b), DeviceMotionNotify);
diff --git a/include/inputstr.h b/include/inputstr.h
index 039d5bc..adb7b9a 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -185,7 +185,11 @@ typedef struct _ValuatorClassRec {
typedef struct _ButtonClassRec {
CARD8 numButtons;
- CARD8 buttonsDown; /* number of buttons currently down */
+ CARD8 buttonsDown; /* number of buttons currently down
+ This counts logical buttons, not
+ physical ones, i.e if some buttons
+ are mapped to 0, they're not counted
+ here */
unsigned short state;
Mask motionMask;
CARD8 down[DOWN_LENGTH];