Even if the button state differs, only send events if we claim we have a button press or release queued up. Otherwise, skip over the event. This cannot happen in the current code, it's prep-work for an upcoming patch.
Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> --- src/evdev-mt-touchpad-buttons.c | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/evdev-mt-touchpad-buttons.c b/src/evdev-mt-touchpad-buttons.c index 2d4b2b9..b0a89ae 100644 --- a/src/evdev-mt-touchpad-buttons.c +++ b/src/evdev-mt-touchpad-buttons.c @@ -618,7 +618,7 @@ tp_post_clickfinger_buttons(struct tp_dispatch *tp, uint64_t time) if (current == old) return 0; - if (current) { + if (current && (tp->queued & TOUCHPAD_EVENT_BUTTON_PRESS)) { switch (tp->nfingers_down) { case 1: button = BTN_LEFT; break; case 2: button = BTN_RIGHT; break; @@ -628,11 +628,12 @@ tp_post_clickfinger_buttons(struct tp_dispatch *tp, uint64_t time) } tp->buttons.active = button; state = LIBINPUT_BUTTON_STATE_PRESSED; - } else { + } else if (!current && (tp->queued & TOUCHPAD_EVENT_BUTTON_RELEASE)) { button = tp->buttons.active; tp->buttons.active = 0; state = LIBINPUT_BUTTON_STATE_RELEASED; - } + } else + return 0; if (button) { evdev_pointer_notify_button(tp->device, @@ -649,34 +650,45 @@ tp_post_clickfinger_buttons(struct tp_dispatch *tp, uint64_t time) static int tp_post_physical_buttons(struct tp_dispatch *tp, uint64_t time) { - uint32_t current, old, button; + uint32_t current, old, button, mask; current = tp->buttons.state; old = tp->buttons.old_state; button = BTN_LEFT; + mask = 0x1; while (current || old) { enum libinput_button_state state; if ((current & 0x1) ^ (old & 0x1)) { - if (!!(current & 0x1)) + bool skip = false; + if (!!(current & 0x1) && + tp->queued & TOUCHPAD_EVENT_BUTTON_PRESS) state = LIBINPUT_BUTTON_STATE_PRESSED; - else + else if (!(current & 0x1) && + tp->queued & TOUCHPAD_EVENT_BUTTON_RELEASE) state = LIBINPUT_BUTTON_STATE_RELEASED; + else + skip = true; - evdev_pointer_notify_button(tp->device, - time, - button, - state); + if (!skip) { + evdev_pointer_notify_button(tp->device, + time, + button, + state); + if (state == LIBINPUT_BUTTON_STATE_PRESSED) + tp->buttons.old_state |= mask; + else + tp->buttons.old_state &= ~mask; + } } button++; current >>= 1; old >>= 1; + mask <<= 1; } - tp->buttons.old_state = tp->buttons.state; - return 0; } -- 1.9.3 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel