Commit dc547496 authored by Peter Hutterer's avatar Peter Hutterer

If the touchpad is in TOUCHPAD_OFF mode, allow physical clicks

Enabling clicks in off mode also allows for the new Lenovo *40 series to use
the top software buttons while the touchpad is disabled. This benefits those
that usually disable touchpads altogether but still need the buttons for the

This changes existing behaviour, but TouchpadOff was always intended to stop
erroneous events while typing. Physical button presses are hard to trigger
accidentally. On the touchpads that TouchpadOff concept was originally
designed for the buttons are nowhere near the keyboard and are physically
separated from the touchpad anyway. On Clickpads, triggering a physical
click requires more force than accidentally touching the surface. Peter Hutterer's avatarPeter Hutterer <>
Reviewed-by: default avatarHans de Goede <>
parent 4122db68
......@@ -261,9 +261,14 @@ Valid values are:
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
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.
Property: "Synaptics Off"
.BI "Option \*qLockedDrags\*q \*q" boolean \*q
......@@ -1934,7 +1934,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;
......@@ -2349,7 +2350,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) {
priv->circ_scroll_on = FALSE;
priv->vert_scroll_edge_on = FALSE;
......@@ -3080,12 +3083,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
......@@ -3124,8 +3121,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);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment