summarylogtreecommitdiffstats
path: root/14393-gestures-only.patch
blob: e390c2869592df806cdee02e3c227e2ffd3e2cb2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
diff --git a/include/synaptics-properties.h b/include/synaptics-properties.h
index 0f79b64..d74dc2e 100644
--- a/include/synaptics-properties.h
+++ b/include/synaptics-properties.h
@@ -158,4 +158,7 @@
 /* 32 Bit Integer, 2 values, horizontal hysteresis, vertical hysteresis */
 #define SYNAPTICS_PROP_NOISE_CANCELLATION "Synaptics Noise Cancellation"
 
+/* 8 bit (BOOL) */
+#define SYNAPTICS_PROP_GESTURES_ONLY "Synaptics Gestures Only"
+
 #endif                          /* _SYNAPTICS_PROPERTIES_H_ */
diff --git a/man/synaptics.man b/man/synaptics.man
index 4f87b01..1b00e42 100644
--- a/man/synaptics.man
+++ b/man/synaptics.man
@@ -518,6 +518,15 @@ initialized if
 .B Option \*qHasSecondarySoftButtons\*q 
 is enabled and this option is set in the __xconfigfile__(__filemansuffix__).
 .
+.TP
+.BI "Option \*qGesturesOnly\*q \*q" boolean \*q
+Disable pointer motion events.
+
+The option is disabled by default. If set, the driver will report gesture and
+button events but no pointer events.
+Property: "Synaptics Gestures Only"
+.
+
 
 .SH CONFIGURATION DETAILS
 .SS Area handling
@@ -905,6 +914,10 @@ disables the button area.
 
 32 bit, 8 values, RBL, RBR, RBT, RBB, MBL, MBR, MBT, MBB.
 
+.TP 7
+.BI "Synaptics Gestures Only"
+8 bit (BOOL).
+
 .TP 7
 .BI "Synaptics Capabilities"
 This read-only property expresses the physical capability of the touchpad,
diff --git a/src/properties.c b/src/properties.c
index c776e6c..05c3c2b 100644
--- a/src/properties.c
+++ b/src/properties.c
@@ -95,6 +95,7 @@ Atom prop_secondary_softbutton_areas = 0;
 Atom prop_noise_cancellation = 0;
 Atom prop_product_id = 0;
 Atom prop_device_node = 0;
+Atom prop_gestures_only = 0;
 
 static Atom
 InitTypedAtom(DeviceIntPtr dev, char *name, Atom type, int format, int nvalues,
@@ -382,6 +383,10 @@ InitDeviceProperties(InputInfoPtr pInfo)
                                        SYNAPTICS_PROP_NOISE_CANCELLATION, 32, 2,
                                        values);
 
+    prop_gestures_only =
+        InitAtom(pInfo->dev, SYNAPTICS_PROP_GESTURES_ONLY, 8, 1,
+                &para->gestures_only);
+
     /* only init product_id property if we actually know them */
     if (priv->id_vendor || priv->id_product) {
         values[0] = priv->id_vendor;
@@ -815,6 +820,12 @@ SetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop,
         para->hyst_x = hyst[0];
         para->hyst_y = hyst[1];
     }
+    else if (property == prop_gestures_only) {
+        if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER)
+            return BadMatch;
+
+        para->gestures_only = *(BOOL *) prop->data;
+    }
     else if (property == prop_product_id || property == prop_device_node)
         return BadValue;        /* read-only */
     else { /* unknown property */
diff --git a/src/synaptics.c b/src/synaptics.c
index 1df1ca7..603c752 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -673,6 +673,7 @@ set_default_parameters(InputInfoPtr pInfo)
     pars->tap_move = xf86SetIntOption(opts, "MaxTapMove", tapMove);
     pars->tap_time_2 = xf86SetIntOption(opts, "MaxDoubleTapTime", 180);
     pars->click_time = xf86SetIntOption(opts, "ClickTime", 100);
+    pars->gestures_only = xf86SetBoolOption(opts, "GesturesOnly", pars->gestures_only);
     pars->clickpad = xf86SetBoolOption(opts, "ClickPad", pars->clickpad);       /* Probed */
     if (pars->clickpad)
         pars->has_secondary_buttons = xf86SetBoolOption(opts,
@@ -3120,7 +3121,7 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw, CARD32 now,
         buttons |= 1 << (priv->tap_button - 1);
 
     /* Post events */
-    if (finger >= FS_TOUCHED && (dx || dy) && !ignore_motion)
+    if (finger >= FS_TOUCHED && (dx || dy) && !ignore_motion && !para->gestures_only)
         xf86PostMotionEvent(pInfo->dev, 0, 0, 2, dx, dy);
 
     if (priv->mid_emu_state == MBE_LEFT_CLICK) {
diff --git a/src/synapticsstr.h b/src/synapticsstr.h
index 33524e5..b23ec3c 100644
--- a/src/synapticsstr.h
+++ b/src/synapticsstr.h
@@ -229,6 +229,7 @@ typedef struct _SynapticsParameters {
     int area_left_edge, area_right_edge, area_top_edge, area_bottom_edge;       /* area coordinates absolute */
     int softbutton_areas[4][4]; /* soft button area coordinates, 0 => right, 1 => middle , 2 => secondary right, 3 => secondary middle button */
     int hyst_x, hyst_y;         /* x and y width of hysteresis box */
+    Bool gestures_only;         /* do not post mouse input events */
 
     int maxDeltaMM;               /* maximum delta movement (vector length) in mm */
 } SynapticsParameters;