summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2014-03-17 14:55:37 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2014-04-30 12:54:29 +1000
commit11b2814c17c17cc43cf1b22f56998b100e59cf04 (patch)
tree5a44991bd9e07a6f211317570d97874fdaef4346
parented84731b72692c648b48d00b84bb680446e265b6 (diff)
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 trackstick. 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. https://bugs.freedesktop.org/show_bug.cgi?id=76156 Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Hans de Goede <hdegoede@redhat.com> (cherry picked from commit dc5474964d4ec73b5c324961026e1037bb344946)
-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);