summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/synaptics.man1
-rw-r--r--man/syndaemon.man8
-rw-r--r--src/properties.c2
-rw-r--r--src/synaptics.c13
-rw-r--r--src/synapticsstr.h2
-rw-r--r--tools/synclient.c2
-rw-r--r--tools/syndaemon.c33
7 files changed, 46 insertions, 15 deletions
diff --git a/man/synaptics.man b/man/synaptics.man
index 1b2f000..19b71fb 100644
--- a/man/synaptics.man
+++ b/man/synaptics.man
@@ -263,6 +263,7 @@ l l.
0 Touchpad is enabled
1 Touchpad is switched off
2 Only tapping and scrolling is switched off
+3 Only cursor movement is switched off
.TE
Property: "Synaptics Off"
.TP
diff --git a/man/syndaemon.man b/man/syndaemon.man
index 87691d8..30ea20b 100644
--- a/man/syndaemon.man
+++ b/man/syndaemon.man
@@ -45,9 +45,11 @@ A pid file will only be created if the program is started in daemon
mode.
.LP
.TP
-\fB\-t\fP
-Only disable tapping and scrolling, not mouse movements, in response
-to keyboard activity.
+\fB\-t\fP [off|tapping|click-only]
+ Disable state. "off" for disabling the touchpad entirely, "tapping" for
+ disabling tapping and scrolling only, "click-only" for disabling
+ everything but physical clicks. The default if this option is missing is
+ "off". If this option is given without a mode it defaults to "tapping".
.LP
.TP
\fB\-k\fP
diff --git a/src/properties.c b/src/properties.c
index 886d8c2..d4fd3cb 100644
--- a/src/properties.c
+++ b/src/properties.c
@@ -585,7 +585,7 @@ SetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop,
off = *(CARD8 *) prop->data;
- if (off > 2)
+ if (off > 3)
return BadValue;
para->touchpad_off = off;
diff --git a/src/synaptics.c b/src/synaptics.c
index 282ced7..6eb3ff8 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -1763,7 +1763,8 @@ SelectTapButton(SynapticsPrivate * priv, enum EdgeType edge)
{
enum TapEvent tap;
- if (priv->synpara.touchpad_off == TOUCHPAD_TAP_OFF) {
+ if (priv->synpara.touchpad_off == TOUCHPAD_TAP_OFF ||
+ priv->synpara.touchpad_off == TOUCHPAD_CLICK_ONLY) {
priv->tap_button = 0;
return;
}
@@ -2302,7 +2303,9 @@ HandleScrolling(SynapticsPrivate * priv, struct SynapticsHwState *hw,
SynapticsParameters *para = &priv->synpara;
int delay = 1000000000;
- if ((priv->synpara.touchpad_off == TOUCHPAD_TAP_OFF) || (priv->finger_state == FS_BLOCKED)) {
+ if ((priv->synpara.touchpad_off == TOUCHPAD_TAP_OFF) ||
+ (priv->synpara.touchpad_off == TOUCHPAD_CLICK_ONLY) ||
+ (priv->finger_state == FS_BLOCKED)) {
stop_coasting(priv);
priv->circ_scroll_on = FALSE;
priv->vert_scroll_edge_on = FALSE;
@@ -2909,6 +2912,9 @@ HandleTouches(InputInfoPtr pInfo, struct SynapticsHwState *hw)
Bool restart_touches = FALSE;
int i;
+ if (para->touchpad_off == TOUCHPAD_CLICK_ONLY)
+ goto out;
+
if (para->click_action[F3_CLICK1] || para->tap_action[F3_TAP])
min_touches = 4;
else if (para->click_action[F2_CLICK1] || para->tap_action[F2_TAP] ||
@@ -3130,7 +3136,8 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw, CARD32 now,
}
/* Post events */
- if (finger >= FS_TOUCHED && (dx || dy))
+ if (finger >= FS_TOUCHED && (dx || dy) &&
+ (para->touchpad_off != TOUCHPAD_CLICK_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 a60b3c0..0fc8eac 100644
--- a/src/synapticsstr.h
+++ b/src/synapticsstr.h
@@ -63,6 +63,7 @@ enum OffState {
TOUCHPAD_ON = 0,
TOUCHPAD_OFF = 1,
TOUCHPAD_TAP_OFF = 2,
+ TOUCHPAD_CLICK_ONLY = 3
};
enum TapEvent {
@@ -182,6 +183,7 @@ typedef struct _SynapticsParameters {
* 0 : Not off
* 1 : Off
* 2 : Only tapping and scrolling off
+ * 3 : All but physical clicks off
*/
Bool locked_drags; /* Enable locked drags */
int locked_drag_time; /* timeout for locked drags */
diff --git a/tools/synclient.c b/tools/synclient.c
index ac31a66..98285ac 100644
--- a/tools/synclient.c
+++ b/tools/synclient.c
@@ -105,7 +105,7 @@ static struct Parameter params[] = {
{"UpDownScrollRepeat", PT_BOOL, 0, 1, SYNAPTICS_PROP_BUTTONSCROLLING_REPEAT, 8, 0},
{"LeftRightScrollRepeat", PT_BOOL, 0, 1, SYNAPTICS_PROP_BUTTONSCROLLING_REPEAT, 8, 1},
{"ScrollButtonRepeat", PT_INT, SBR_MIN , SBR_MAX, SYNAPTICS_PROP_BUTTONSCROLLING_TIME, 32, 0},
- {"TouchpadOff", PT_INT, 0, 2, SYNAPTICS_PROP_OFF, 8, 0},
+ {"TouchpadOff", PT_INT, 0, 3, SYNAPTICS_PROP_OFF, 8, 0},
{"LockedDrags", PT_BOOL, 0, 1, SYNAPTICS_PROP_LOCKED_DRAGS, 8, 0},
{"LockedDragTimeout", PT_INT, 0, 30000, SYNAPTICS_PROP_LOCKED_DRAGS_TIMEOUT, 32, 0},
{"RTCornerButton", PT_INT, 0, SYN_MAX_BUTTONS, SYNAPTICS_PROP_TAP_ACTION, 8, 0},
diff --git a/tools/syndaemon.c b/tools/syndaemon.c
index 29e75f5..b181d16 100644
--- a/tools/syndaemon.c
+++ b/tools/syndaemon.c
@@ -50,7 +50,8 @@
enum TouchpadState {
TouchpadOn = 0,
TouchpadOff = 1,
- TappingOff = 2
+ TappingOff = 2,
+ ClickOnly = 3
};
static Bool pad_disabled
@@ -73,7 +74,7 @@ static void
usage(void)
{
fprintf(stderr,
- "Usage: syndaemon [-i idle-time] [-m poll-delay] [-d] [-t] [-k]\n");
+ "Usage: syndaemon [-i idle-time] [-m poll-delay] [-d] [-t [off|tapping|click-only]] [-k]\n");
fprintf(stderr,
" -i How many seconds to wait after the last key press before\n");
fprintf(stderr, " enabling the touchpad. (default is 2.0s)\n");
@@ -82,7 +83,10 @@ usage(void)
fprintf(stderr, " -d Start as a daemon, i.e. in the background.\n");
fprintf(stderr, " -p Create a pid file with the specified name.\n");
fprintf(stderr,
- " -t Only disable tapping and scrolling, not mouse movements.\n");
+ " -t Disable state.\n"
+ " 'off' for disabling the touchpad entirely, \n"
+ " 'tapping' for disabling tapping and scrolling only,\n"
+ " 'click-only' for disabling everything but physical clicks.\n");
fprintf(stderr,
" -k Ignore modifier keys when monitoring keyboard activity.\n");
fprintf(stderr, " -K Like -k but also ignore Modifier+Key combos.\n");
@@ -547,7 +551,7 @@ main(int argc, char *argv[])
int use_xrecord = 0;
/* Parse command line parameters */
- while ((c = getopt(argc, argv, "i:m:dtp:kKR?v")) != EOF) {
+ while ((c = getopt(argc, argv, ":i:m:dp:kKR?v")) != EOF) {
switch (c) {
case 'i':
idle_time = atof(optarg);
@@ -558,9 +562,6 @@ main(int argc, char *argv[])
case 'd':
background = 1;
break;
- case 't':
- disable_state = TappingOff;
- break;
case 'p':
pid_file = optarg;
break;
@@ -578,6 +579,24 @@ main(int argc, char *argv[])
verbose = 1;
break;
case '?':
+ if (optopt != 't')
+ usage();
+ else {
+ if (optind < argc) {
+ if (argv[optind][0] == '-')
+ disable_state = TappingOff;
+ else if (strcmp(argv[optind], "off") == 0)
+ disable_state = TouchpadOff;
+ else if (strcmp(argv[optind], "tapping") == 0)
+ disable_state = TappingOff;
+ else if (strcmp(argv[optind], "click-only") == 0)
+ disable_state = ClickOnly;
+ else
+ usage();
+ } else
+ disable_state = TappingOff;
+ }
+ break;
default:
usage();
break;