From f7f85f696570541e2dd43462675de9e6ee46f545 Mon Sep 17 00:00:00 2001 From: Thomas Jaeger Date: Mon, 22 Dec 2008 00:55:09 +0100 Subject: 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 --- Xi/exevents.c | 8 ++++---- include/inputstr.h | 6 +++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index 5ab9d660f..f3f9d390b 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 039d5bc23..adb7b9a40 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]; -- cgit v1.2.3