diff options
-rw-r--r-- | man/synaptics.man | 1 | ||||
-rw-r--r-- | man/syndaemon.man | 8 | ||||
-rw-r--r-- | src/properties.c | 2 | ||||
-rw-r--r-- | src/synaptics.c | 13 | ||||
-rw-r--r-- | src/synapticsstr.h | 2 | ||||
-rw-r--r-- | tools/synclient.c | 2 | ||||
-rw-r--r-- | tools/syndaemon.c | 33 |
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; |