Tools that are in absolute mode emit left click when the tool touches
the surface. However, tools in relative mode need to locate the object
on the surface before it selects (left click on) the object. That is,
a second event (tap/leave/touch) is needed to trigger a left click for
relative mode tools.

Tools on touchscreen is in absolute mode. So, send left click
down/up when the first finger touches/leaves the tablet.

Signed-off-by: Ping Cheng <[email protected]>
Reviewed-by: Peter Hutterer <[email protected]>
---
 src/wcmUSB.c |   22 ++++++++++++++--------
 1 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/wcmUSB.c b/src/wcmUSB.c
index 82a0195..4dec1a3 100644
--- a/src/wcmUSB.c
+++ b/src/wcmUSB.c
@@ -975,6 +975,12 @@ static int usbParseAbsEvent(WacomCommonPtr common,
        return change;
 }
 
+#define MOD_BUTTONS(bit, value) do { \
+       int shift = 1 << (bit); \
+       ds->buttons = (value ? \
+                       (ds->buttons | (shift)) : (ds->buttons & ~(shift))); \
+       } while (0)
+
 static int usbParseAbsMTEvent(WacomCommonPtr common, struct input_event *event)
 {
        int change = 1;
@@ -996,6 +1002,13 @@ static int usbParseAbsMTEvent(WacomCommonPtr common, 
struct input_event *event)
                        ds->device_id = TOUCH_DEVICE_ID;
                        ds->serial_num = private->wcmMTChannel+1;
                        ds->sample = (int)GetTimeInMillis();
+
+                       /* Send left click down/up for touchscreen
+                        * when the first finger touches/leaves the tablet.
+                        */
+                       if (TabletHasFeature(common, WCM_LCD) &&
+                                       !private->wcmMTChannel)
+                               MOD_BUTTONS(0, event->value != -1);
                        break;
 
                case ABS_MT_POSITION_X:
@@ -1035,17 +1048,10 @@ static struct
        { PAD_ID,    BTN_0              }
 };
 
-#define MOD_BUTTONS(bit, value) do { \
-       shift = 1<<bit; \
-       ds->buttons = (((value) != 0) ? \
-                      (ds->buttons | (shift)) : (ds->buttons & ~(shift))); \
-        } while (0)
-
 static int usbParseKeyEvent(WacomCommonPtr common,
                            struct input_event *event, WacomDeviceState *ds,
                            WacomDeviceState *dslast)
 {
-       int shift;
        int change = 1;
 
        /* BTN_TOOL_* are sent to indicate when a specific tool is going
@@ -1202,7 +1208,7 @@ static int usbParseKeyEvent(WacomCommonPtr common,
 static int usbParseBTNEvent(WacomCommonPtr common,
                            struct input_event *event, WacomDeviceState *ds)
 {
-       int shift, nkeys;
+       int nkeys;
        int change = 1;
 
        switch (event->code)
-- 
1.7.4


------------------------------------------------------------------------------
Enable your software for Intel(R) Active Management Technology to meet the
growing manageability and security demands of your customers. Businesses
are taking advantage of Intel(R) vPro (TM) technology - will your software 
be a part of the solution? Download the Intel(R) Manageability Checker 
today! http://p.sf.net/sfu/intel-dev2devmar
_______________________________________________
Linuxwacom-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to