[PATCH xf86-input-synaptics 2/2] Don't report motion inside soft-button areas
Hans de Goede
hdegoede at redhat.com
Wed Feb 19 09:30:36 PST 2014
Unless the motion has started outside the soft-button area.
This fixes my #1 anoyance with clickpads, where 2 out of 3 clicks turn into
a click + drag unless I hold my finger really really still.
Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
src/synaptics.c | 33 ++++++++++++++++++++++++++++++++-
src/synapticsstr.h | 1 +
2 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/src/synaptics.c b/src/synaptics.c
index 8064844..e06c735 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -1027,6 +1027,7 @@ SynapticsReset(SynapticsPrivate * priv)
priv->count_packet_finger = 0;
priv->finger_state = FS_UNTOUCHED;
priv->last_motion_millis = 0;
+ priv->ignore_motion = FALSE;
priv->tap_state = TS_START;
priv->tap_button = 0;
priv->tap_button_state = TBS_BUTTON_UP;
@@ -1487,6 +1488,28 @@ is_inside_topmiddlebutton_area(SynapticsParameters * para, int x, int y)
return is_inside_button_area(para, 3, x, y);
}
+static Bool
+is_inside_anybutton_area(SynapticsParameters * para, int x, int y)
+{
+ enum {
+ TOP = 2,
+ BOTTOM = 3
+ };
+
+ /* We don't have a left button area, so we simply check for
+ * y > bottomrightbuttonarea top or y < toprightbuttonarea bottom,
+ * assuming that all soft buttons have the same height */
+
+ if (para->softbutton_areas[0][TOP] && y > para->softbutton_areas[0][TOP])
+ return TRUE;
+
+ if (para->softbutton_areas[2][BOTTOM] &&
+ y < para->softbutton_areas[2][BOTTOM])
+ return TRUE;
+
+ return FALSE;
+}
+
static CARD32
timerFunc(OsTimerPtr timer, CARD32 now, pointer arg)
{
@@ -3024,6 +3047,14 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw, CARD32 now,
inside_active_area = is_inside_active_area(priv, hw->x, hw->y);
+ /* Ignore motion *starting* inside softbuttonareas */
+ if (priv->finger_state < FS_TOUCHED)
+ priv->ignore_motion = is_inside_anybutton_area(para, hw->x, hw->y);
+ /* If we already have a finger down, clear ignore motion if it goes
+ outside of the softbuttonareas */
+ else if (!is_inside_anybutton_area(para, hw->x, hw->y))
+ priv->ignore_motion = FALSE;
+
/* these two just update hw->left, right, etc. */
update_hw_button_state(pInfo, hw, priv->old_hw_state, now, &delay);
if (priv->has_scrollbuttons)
@@ -3095,7 +3126,7 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw, CARD32 now,
}
/* Post events */
- if (finger >= FS_TOUCHED && (dx || dy) &&
+ if (finger >= FS_TOUCHED && (dx || dy) && !priv->ignore_motion &&
(para->touchpad_off != TOUCHPAD_CLICK_ONLY))
xf86PostMotionEvent(pInfo->dev, 0, 0, 2, dx, dy);
diff --git a/src/synapticsstr.h b/src/synapticsstr.h
index dee155f..d2fabdf 100644
--- a/src/synapticsstr.h
+++ b/src/synapticsstr.h
@@ -249,6 +249,7 @@ struct _SynapticsPrivateRec {
Bool prev_up; /* Previous up button value, for double click emulation */
enum FingerState finger_state; /* previous finger state */
CARD32 last_motion_millis; /* time of the last motion */
+ Bool ignore_motion; /* ignore motion (inside softbutton area) */
enum TapState tap_state; /* State of tap processing */
int tap_max_fingers; /* Max number of fingers seen since entering start state */
--
1.8.5.3
More information about the xorg-devel
mailing list