This reverts commit f38dd5736e2df7c3eec0338bd0c7bef8c562b979.
---
 src/wcmCommon.c      |  8 +------
 src/wcmTouchFilter.c | 59 ++++++++++++++++++++++++++++++++++++++--------------
 2 files changed, 44 insertions(+), 23 deletions(-)

diff --git a/src/wcmCommon.c b/src/wcmCommon.c
index 7ffab2a..943f34d 100644
--- a/src/wcmCommon.c
+++ b/src/wcmCommon.c
@@ -995,14 +995,8 @@ void wcmEvent(WacomCommonPtr common, unsigned int channel,
        }
 
        if ((ds.device_type == TOUCH_ID) && common->wcmTouch)
-       {
                wcmGestureFilter(priv, ds.serial_num - 1);
-#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 16
-               /* When using XI 1.2 multitouch events don't do common 
dispatching */
-               if (!common->wcmGesture)
-                 return;
-#endif
-       }
+
        /* For touch, only first finger moves the cursor */
        if ((common->wcmTouch && ds.device_type == TOUCH_ID && ds.serial_num == 
1) ||
            (ds.device_type != TOUCH_ID))
diff --git a/src/wcmTouchFilter.c b/src/wcmTouchFilter.c
index 8a761c6..3310560 100644
--- a/src/wcmTouchFilter.c
+++ b/src/wcmTouchFilter.c
@@ -38,6 +38,7 @@
 #define GESTURE_PREDRAG_MODE         16
 #define GESTURE_DRAG_MODE            32
 #define GESTURE_CANCEL_MODE          64
+#define GESTURE_MULTITOUCH_MODE     128
 
 #define WCM_SCROLL_UP                 5        /* vertical up */
 #define WCM_SCROLL_DOWN               4        /* vertical down */
@@ -103,9 +104,12 @@ static void getStateHistory(WacomCommonPtr common, 
WacomDeviceState states[], in
  *
  * @param[in] priv
  * @param[in] channel    Channel to send a touch event for
+ * @param[in] no_update  If 'true', TouchUpdate events will not be created.
+ * This should be used when entering multitouch mode to ensure TouchBegin
+ * events are sent for already-in-prox contacts.
  */
 static void
-wcmSendTouchEvent(WacomDevicePtr priv, WacomChannelPtr channel)
+wcmSendTouchEvent(WacomDevicePtr priv, WacomChannelPtr channel, Bool no_update)
 {
 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 16
        ValuatorMask *mask = priv->common->touch_mask;
@@ -122,7 +126,7 @@ wcmSendTouchEvent(WacomDevicePtr priv, WacomChannelPtr 
channel)
                DBG(6, priv->common, "This is a touch end event\n");
                type = XI_TouchEnd;
        }
-       else if (!oldstate.proximity) {
+       else if (!oldstate.proximity || no_update) {
                DBG(6, priv->common, "This is a touch begin event\n");
                type = XI_TouchBegin;
        }
@@ -136,26 +140,45 @@ wcmSendTouchEvent(WacomDevicePtr priv, WacomChannelPtr 
channel)
 }
 
 /**
- * Send multitouch data to X server when ABI_XINPUT_VERSION >= 16 and
- * in driver gesture is not enabled.
+ * Send multitouch events. If entering multitouch mode (indicated by
+ * GESTURE_LAG_MODE), then touch events are sent for all in-prox
+ * contacts. Otherwise, only the specified contact has a touch event
+ * generated.
  *
  * @param[in] priv
- * @param[in] contact_id  ID of the contact to send event for
+ * @param[in] contact_id  ID of the contact to send event for (at minimum)
  */
 static void
 wcmFingerMultitouch(WacomDevicePtr priv, int contact_id) {
+       Bool lag_mode = priv->common->wcmGestureMode == GESTURE_LAG_MODE;
+       Bool prox = FALSE;
        int i;
 
+       if (lag_mode && TabletHasFeature(priv->common, WCM_LCD)) {
+               /* wcmSingleFingerPress triggers a button press as
+                * soon as a single finger appears. ensure we release
+                * that button before getting too far along
+                */
+               wcmSendButtonClick(priv, 1, 0);
+       }
+
        for (i = 0; i < MAX_CHANNELS; i++) {
                WacomChannelPtr channel = priv->common->wcmChannel+i;
                WacomDeviceState state  = channel->valid.state;
                if (state.device_type != TOUCH_ID)
                        continue;
 
-               if (state.serial_num == contact_id + 1) {
-                       wcmSendTouchEvent(priv, channel);
+               if (lag_mode || state.serial_num == contact_id + 1) {
+                       wcmSendTouchEvent(priv, channel, lag_mode);
                }
+
+               prox |= state.proximity;
        }
+
+       if (!prox)
+               priv->common->wcmGestureMode = GESTURE_NONE_MODE;
+       else if (lag_mode)
+               priv->common->wcmGestureMode = GESTURE_MULTITOUCH_MODE;
 }
 
 static double touchDistance(WacomDeviceState ds0, WacomDeviceState ds1)
@@ -371,15 +394,6 @@ void wcmGestureFilter(WacomDevicePtr priv, int touch_id)
        WacomCommonPtr common = priv->common;
        WacomDeviceState ds[2] = {{0}}, dsLast[2] = {{0}};
 
-#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 16
-       /* Send multitouch data to X if appropriate */
-       if (!common->wcmGesture)
-       {
-               wcmFingerMultitouch(priv, touch_id);
-               return;
-       }
-#endif
-
        getStateHistory(common, ds, ARRAY_SIZE(ds), 0);
        getStateHistory(common, dsLast, ARRAY_SIZE(dsLast), 1);
 
@@ -404,6 +418,9 @@ void wcmGestureFilter(WacomDevicePtr priv, int touch_id)
                        common->wcmGestureMode = GESTURE_NONE_MODE;
        }
 
+       if (common->wcmGestureMode == GESTURE_MULTITOUCH_MODE)
+               goto ret;
+
        /* When 2 fingers are in proximity, it must always be in one of
         * the valid 2 fingers modes: LAG, SCROLL, or ZOOM.
         * LAG mode is used while deciding between SCROLL and ZOOM and
@@ -536,6 +553,16 @@ void wcmGestureFilter(WacomDevicePtr priv, int touch_id)
        }
 ret:
 
+#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 16
+       /* Send multitouch data to X if appropriate */
+       if (!common->wcmGesture && ds[1].proximity && common->wcmGestureMode == 
GESTURE_NONE_MODE)
+               common->wcmGestureMode = GESTURE_LAG_MODE;
+       if (!common->wcmGesture && (common->wcmGestureMode == GESTURE_LAG_MODE 
||
+           common->wcmGestureMode == GESTURE_MULTITOUCH_MODE)) {
+               wcmFingerMultitouch(priv, touch_id);
+       }
+#endif
+
        if ((common->wcmGestureMode == GESTURE_NONE_MODE || 
common->wcmGestureMode == GESTURE_DRAG_MODE) &&
            touch_id == 0)
        {
-- 
2.1.0


------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to