Previously, on touch toggle (invoked by the tablet when a pen goes in proximity) the touchpad cleared the state and ignored any events. Since we ignore touches that we didn't see the touch begin for, this handled the cases of a touch remaining after proximity out.
This code pre-dates palm detection, so let's take the bluetack off and instead integrate it with proper palm detectino. --- src/evdev-mt-touchpad.c | 30 +++++++++++++++++++++++------- src/evdev-mt-touchpad.h | 5 ++--- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index fdb7b452..dfc975e7 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -907,6 +907,19 @@ tp_palm_detect_pressure_triggered(struct tp_dispatch *tp, return t->palm.state == PALM_PRESSURE; } +static bool +tp_palm_detect_arbitration_triggered(struct tp_dispatch *tp, + struct tp_touch *t, + uint64_t time) +{ + if (!tp->in_arbitration) + return false; + + t->palm.state = PALM_ARBITRATION; + + return true; +} + static void tp_palm_detect(struct tp_dispatch *tp, struct tp_touch *t, uint64_t time) { @@ -916,6 +929,9 @@ tp_palm_detect(struct tp_dispatch *tp, struct tp_touch *t, uint64_t time) if (tp_palm_detect_pressure_triggered(tp, t, time)) goto out; + if (tp_palm_detect_arbitration_triggered(tp, t, time)) + goto out; + if (tp_palm_detect_dwt_triggered(tp, t, time)) goto out; @@ -965,6 +981,9 @@ out: case PALM_TOUCH_SIZE: palm_state = "touch size"; break; + case PALM_ARBITRATION: + palm_state = "arbitration"; + break; case PALM_NONE: default: abort(); @@ -1600,9 +1619,6 @@ tp_interface_process(struct evdev_dispatch *dispatch, { struct tp_dispatch *tp = tp_dispatch(dispatch); - if (tp->ignore_events) - return; - switch (e->type) { case EV_ABS: if (tp->has_mt) @@ -2291,15 +2307,15 @@ tp_interface_toggle_touch(struct evdev_dispatch *dispatch, bool enable) { struct tp_dispatch *tp = tp_dispatch(dispatch); - bool ignore_events = !enable; + bool arbitrate = !enable; - if (ignore_events == tp->ignore_events) + if (arbitrate == tp->in_arbitration) return; - if (ignore_events) + if (arbitrate) tp_clear_state(tp); - tp->ignore_events = ignore_events; + tp->in_arbitration = arbitrate; } static struct evdev_dispatch_interface tp_interface = { diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h index 8f35ef0a..55244064 100644 --- a/src/evdev-mt-touchpad.h +++ b/src/evdev-mt-touchpad.h @@ -60,6 +60,7 @@ enum touch_palm_state { PALM_TOOL_PALM, PALM_PRESSURE, PALM_TOUCH_SIZE, + PALM_ARBITRATION, }; enum button_event { @@ -239,9 +240,7 @@ struct tp_dispatch { bool has_mt; bool semi_mt; - /* true if we're reading events (i.e. not suspended) but we're - * ignoring them */ - bool ignore_events; + bool in_arbitration; /* pen/touch arbitration */ unsigned int num_slots; /* number of slots */ unsigned int ntouches; /* no slots inc. fakes */ -- 2.14.3 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel