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) {