patches/xf86-input-synaptics-01-alps-tap.diff
author jurikm
Sun, 12 Feb 2012 14:04:10 +0000
changeset 8245 383896da4129
parent 2212 82f60d1f7c90
permissions -rw-r--r--
SFEsauerbraten.spec: add IPS package name

diff -ur xf86-input-synaptics-1.0.0.orig/src/synapticsstr.h xf86-input-synaptics-1.0.0/src/synapticsstr.h
--- xf86-input-synaptics-1.0.0.orig/src/synapticsstr.h	Mon Jan 26 05:45:41 2009
+++ xf86-input-synaptics-1.0.0/src/synapticsstr.h	Sun Mar  8 16:19:21 2009
@@ -63,6 +63,7 @@
 enum TapState {
     TS_START,			/* No tap/drag in progress */
     TS_1,			/* After first touch */
+    TS_HW_TAP,			/* After first hardware tap */
     TS_MOVE,			/* Pointer movement enabled */
     TS_2A,			/* After first release */
     TS_2B,			/* After second/third/... release */
--- xf86-input-synaptics-1.1.99.1.orig/src/synaptics.c	2009-09-03 18:10:37.000000000 -0400
+++ xf86-input-synaptics-1.1.99.1/src/synaptics.c	2009-09-25 01:45:22.814867651 -0400
@@ -1241,7 +1241,7 @@
     /* finger detection thru pressure and threshold */
     if (hw->z > para->finger_press && priv->finger_state < FS_PRESSED)
         finger = FS_PRESSED;
-    else if (hw->z > para->finger_high && priv->finger_state < FS_TOUCHED)
+    else if ((hw->z > para->finger_high || hw->z < 0) && priv->finger_state < FS_TOUCHED)
         finger = FS_TOUCHED;
     else if (hw->z < para->finger_low &&  priv->finger_state > FS_UNTOUCHED)
         finger = FS_UNTOUCHED;
@@ -1348,6 +1348,7 @@
 	priv->tap_max_fingers = 0;
 	break;
     case TS_1:
+    case TS_HW_TAP:
 	priv->tap_button_state = TBS_BUTTON_UP;
 	break;
     case TS_2A:
@@ -1398,6 +1399,7 @@
 
     switch (priv->tap_state) {
     case TS_1:
+    case TS_HW_TAP:
     case TS_3:
     case TS_5:
 	return para->tap_time;
@@ -1450,7 +1452,7 @@
     switch (priv->tap_state) {
     case TS_START:
 	if (touch)
-	    SetTapState(priv, TS_1, hw->millis);
+	    SetTapState(priv, (hw->z < 0) ? TS_HW_TAP : TS_1, hw->millis);
 	break;
     case TS_1:
 	if (move) {
@@ -1474,6 +1476,27 @@
 	    SetTapState(priv, TS_2A, hw->millis);
 	}
 	break;
+    case TS_HW_TAP:
+	SelectTapButton(priv, edge);
+	if (move) {
+	    SetMovingState(priv, MS_TOUCHPAD_RELATIVE, hw->millis);
+	    SetTapState(priv, TS_DRAG, hw->millis);
+	    priv->tap_button_state = TBS_BUTTON_DOWN;
+	    goto restart;
+	} else if (is_timeout) {
+	    if (finger == FS_TOUCHED) {
+		SetMovingState(priv, MS_TOUCHPAD_RELATIVE, hw->millis);
+	    } else if (finger == FS_PRESSED) {
+		SetMovingState(priv, MS_TRACKSTICK, hw->millis);
+	    }
+	    SetTapState(priv, TS_DRAG, hw->millis);
+	    priv->tap_button_state = TBS_BUTTON_DOWN;
+	    goto restart;
+	} else if (release) {
+	    SetTapState(priv, TS_2B, hw->millis);
+	    priv->tap_button_state = TBS_BUTTON_DOWN;
+	}
+	break;
     case TS_MOVE:
 	if (move && priv->moving_state == MS_TRACKSTICK) {
 	    SetMovingState(priv, MS_TOUCHPAD_RELATIVE, hw->millis);
@@ -1611,6 +1634,7 @@
 	    moving_state = MS_TOUCHPAD_RELATIVE;
 	    break;
 	case TS_1:
+	case TS_HW_TAP:
 	case TS_3:
 	case TS_5:
 	    if (hw->numFingers == 1)
--- xf86-input-synaptics-1.1.99.1.orig/src/alpscomm.c	2009-08-21 05:11:56.000000000 -0400
+++ xf86-input-synaptics-1.1.99.1/src/alpscomm.c	2009-09-25 01:42:46.547317852 -0400
@@ -153,6 +153,7 @@
 {
     int x = 0, y = 0, z = 0;
     int left = 0, right = 0, middle = 0;
+    int gesture;
     int i;
 
     /* Handle guest packets */
@@ -175,7 +176,11 @@
     y = (packet[4] & 0x7f) | ((packet[3] & 0x70) << (7-4));
     z = packet[5];
 
-    if (z == 127) {    /* DualPoint stick is relative, not absolute */
+    /* Hardware tap mode uses the fin and ges bits */
+    gesture = packet[2] & 3;
+    z = (gesture == 1) ? -1 : packet[5];
+
+    if (z == 127 && !gesture) {  /* DualPoint stick is relative, not absolute */
 	if (x > 383)
 	    x = x - 768;
 	if (y > 255)
@@ -193,15 +198,12 @@
     for (i = 0; i < 8; i++)
 	hw->multi[i] = FALSE;
 
-    if (z > 0) {
-	hw->x = x;
-	hw->y = y;
-    }
+    hw->x = x;
+    hw->y = y;
     hw->z = z;
     hw->numFingers = (z > 0) ? 1 : 0;
     hw->fingerWidth = 5;
 
-    left  |= (packet[2]     ) & 1;
     left  |= (packet[3]     ) & 1;
     right |= (packet[3] >> 1) & 1;
     if (packet[0] == 0xff) {