[PATCH] Don't include touch state for emulated button press events

Chase Douglas chase.douglas at canonical.com
Tue Jul 3 17:30:43 PDT 2012


When a touch begin is pointer emulated, do not include touch state when
calculating the button state for the initial motion and button press
events. This ensures the logical state of the buttons prior to the
events is set properly.

Signed-off-by: Chase Douglas <chase.douglas at canonical.com>
---
 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);
 
-- 
1.7.10.4



More information about the xorg-devel mailing list