summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/synaptics.man7
-rw-r--r--src/synaptics.c17
2 files changed, 13 insertions, 11 deletions
diff --git a/man/synaptics.man b/man/synaptics.man
index e42f647..2b8d1d9 100644
--- a/man/synaptics.man
+++ b/man/synaptics.man
@@ -261,9 +261,14 @@ Valid values are:
.TS
l l.
0 Touchpad is enabled
-1 Touchpad is switched off
+1 Touchpad is switched off (physical clicks still work)
2 Only tapping and scrolling is switched off
.TE
+When the touchpad is switched off, button events caused by a physical
+button press are still interpreted. On a ClickPad, this includes
+software-emulated middle and right buttons as defined by
+the SoftButtonAreas setting.
+.TP
Property: "Synaptics Off"
.TP
.BI "Option \*qLockedDrags\*q \*q" boolean \*q
diff --git a/src/synaptics.c b/src/synaptics.c
index 618de6b..21bfb6b 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -1930,7 +1930,8 @@ HandleTapProcessing(SynapticsPrivate * priv, struct SynapticsHwState *hw,
enum EdgeType edge;
int delay = 1000000000;
- if (priv->finger_state == FS_BLOCKED)
+ if (para->touchpad_off == TOUCHPAD_OFF ||
+ priv->finger_state == FS_BLOCKED)
return delay;
touch = finger >= FS_TOUCHED && priv->finger_state == FS_UNTOUCHED;
@@ -2348,7 +2349,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_OFF ||
+ priv->finger_state == FS_BLOCKED) {
stop_coasting(priv);
priv->circ_scroll_on = FALSE;
priv->vert_scroll_edge_on = FALSE;
@@ -3064,12 +3067,6 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw, CARD32 now,
Bool using_cumulative_coords = FALSE;
Bool ignore_motion;
- /* If touchpad is switched off, we skip the whole thing and return delay */
- if (para->touchpad_off == TOUCHPAD_OFF) {
- UpdateTouchState(pInfo, hw);
- return delay;
- }
-
/* We need both and x/y, the driver can't handle just one of the two
* yet. But since it's possible to hit a phys button on non-clickpads
* without ever getting motion data first, we must continue with 0/0 for
@@ -3108,8 +3105,8 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw, CARD32 now,
current_button_area(para, hw->x, hw->y) == NO_BUTTON_AREA)
priv->last_button_area = NO_BUTTON_AREA;
- ignore_motion =
- !using_cumulative_coords && priv->last_button_area != NO_BUTTON_AREA;
+ ignore_motion = para->touchpad_off == TOUCHPAD_OFF ||
+ (!using_cumulative_coords && priv->last_button_area != NO_BUTTON_AREA);
/* these two just update hw->left, right, etc. */
update_hw_button_state(pInfo, hw, now, &delay);