Signed-off-by: Chase Douglas <[email protected]>
---
Xi/exevents.c | 17 +++++++++++++----
dix/events.c | 2 +-
dix/inpututils.c | 10 ++++++----
include/inpututils.h | 5 +++--
4 files changed, 23 insertions(+), 11 deletions(-)
diff --git a/Xi/exevents.c b/Xi/exevents.c
index e99bf6c..dfc89df 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1417,8 +1417,15 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev,
TouchPointInfoPtr ti,
ptrev = &button;
kbd = GetMaster(dev, KEYBOARD_OR_FLOAT);
- event_set_state(dev, kbd, &ptrev->device_event);
- ptrev->device_event.corestate = event_get_corestate(dev, kbd);
+
+ /* Don't include touch state for touch begin events that are emulated as
+ * button press events. The touch state already includes the button press
+ * for the touch, but the button press event state is supposed to represent
+ * the state of the buttons *before* the event occurred */
+ event_set_state(dev, kbd, &ptrev->device_event,
+ ev->any.type != ET_TouchBegin);
+ ptrev->device_event.corestate =
+ event_get_corestate(dev, kbd, ev->any.type != ET_TouchBegin);
if (grab) {
/* this side-steps the usual activation mechansims, but... */
@@ -1673,8 +1680,10 @@ ProcessDeviceEvent(InternalEvent *ev, DeviceIntPtr
device)
mouse = NULL;
}
- corestate = event_get_corestate(mouse, kbd);
- event_set_state(mouse, kbd, event);
+ corestate = event_get_corestate(mouse, kbd,
+ ev->device_event.flags !=
XIPointerEmulated);
+ event_set_state(mouse, kbd, event,
+ ev->device_event.flags != XIPointerEmulated);
ret = UpdateDeviceState(device, event);
if (ret == DONT_PROCESS)
diff --git a/dix/events.c b/dix/events.c
index 89877a1..e328b40 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5142,7 +5142,7 @@ ProcQueryPointer(ClientPtr client)
memset(&rep, 0, sizeof(xQueryPointerReply));
rep.type = X_Reply;
rep.sequenceNumber = client->sequence;
- rep.mask = event_get_corestate(mouse, keyboard);
+ rep.mask = event_get_corestate(mouse, keyboard, TRUE);
rep.length = 0;
rep.root = (GetCurrentRootWindow(mouse))->drawable.id;
rep.rootX = pSprite->hot.x;
diff --git a/dix/inpututils.c b/dix/inpututils.c
index 223d547..b483e71 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -662,7 +662,7 @@ init_device_event(DeviceEvent *event, DeviceIntPtr dev,
Time ms)
}
int
-event_get_corestate(DeviceIntPtr mouse, DeviceIntPtr kbd)
+event_get_corestate(DeviceIntPtr mouse, DeviceIntPtr kbd, Bool include_touch)
{
int corestate;
@@ -671,13 +671,15 @@ event_get_corestate(DeviceIntPtr mouse, DeviceIntPtr kbd)
kbd->key) ? XkbStateFieldFromRec(&kbd->key->xkbInfo->
state) : 0;
corestate |= (mouse && mouse->button) ? (mouse->button->state) : 0;
- corestate |= (mouse && mouse->touch) ? (mouse->touch->state) : 0;
+ corestate |= (include_touch && mouse && mouse->touch) ?
+ (mouse->touch->state) : 0;
return corestate;
}
void
-event_set_state(DeviceIntPtr mouse, DeviceIntPtr kbd, DeviceEvent *event)
+event_set_state(DeviceIntPtr mouse, DeviceIntPtr kbd, DeviceEvent *event,
+ Bool include_touch)
{
int i;
@@ -685,7 +687,7 @@ event_set_state(DeviceIntPtr mouse, DeviceIntPtr kbd,
DeviceEvent *event)
if (BitIsOn(mouse->button->down, i))
SetBit(event->buttons, mouse->button->map[i]);
- if (mouse && mouse->touch && mouse->touch->buttonsDown > 0)
+ if (include_touch && mouse && mouse->touch && mouse->touch->buttonsDown >
0)
SetBit(event->buttons, mouse->button->map[1]);
if (kbd && kbd->key) {
diff --git a/include/inpututils.h b/include/inpututils.h
index cd9a4de..1eac13d 100644
--- a/include/inpututils.h
+++ b/include/inpututils.h
@@ -42,9 +42,10 @@ struct _ValuatorMask {
extern void verify_internal_event(const InternalEvent *ev);
extern void init_device_event(DeviceEvent *event, DeviceIntPtr dev, Time ms);
-extern int event_get_corestate(DeviceIntPtr mouse, DeviceIntPtr kbd);
+extern int event_get_corestate(DeviceIntPtr mouse, DeviceIntPtr kbd,
+ Bool include_touch);
extern void event_set_state(DeviceIntPtr mouse, DeviceIntPtr kbd,
- DeviceEvent *event);
+ DeviceEvent *event, Bool include_touch);
extern Mask event_get_filter_from_type(DeviceIntPtr dev, int evtype);
extern Mask event_get_filter_from_xi2type(int evtype);