The touchpad carries enough state around that calling release_all_keys() isn't enough to properly suspend it. e.g. a button down after tapping won't be released by trying to release the physical button for it.
We need to clear the state properly, but that's interface-specific so add a new hook for it. Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> --- src/evdev-mt-touchpad.c | 10 ++++++++++ src/evdev.c | 14 ++++++++++++-- src/evdev.h | 4 ++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index c85986e..026f9ee 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -854,6 +854,15 @@ tp_suspend(struct tp_dispatch *tp, struct evdev_device *device) } static void +tp_interface_suspend(struct evdev_dispatch *dispatch, + struct evdev_device *device) +{ + struct tp_dispatch *tp = (struct tp_dispatch *)dispatch; + + tp_clear_state(tp); +} + +static void tp_resume(struct tp_dispatch *tp, struct evdev_device *device) { if (tp->buttons.has_topbuttons) { @@ -1060,6 +1069,7 @@ tp_interface_tag_device(struct evdev_device *device, static struct evdev_dispatch_interface tp_interface = { tp_interface_process, + tp_interface_suspend, tp_interface_remove, tp_interface_destroy, tp_interface_device_added, diff --git a/src/evdev.c b/src/evdev.c index 87c59dc..d45264b 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -813,6 +813,13 @@ release_pressed_keys(struct evdev_device *device) } static void +fallback_suspend(struct evdev_dispatch *dispatch, + struct evdev_device *device) +{ + release_pressed_keys(device); +} + +static void fallback_destroy(struct evdev_dispatch *dispatch) { free(dispatch); @@ -869,6 +876,7 @@ evdev_calibration_get_default_matrix(struct libinput_device *libinput_device, struct evdev_dispatch_interface fallback_interface = { fallback_process, + fallback_suspend, NULL, /* remove */ fallback_destroy, NULL, /* device_added */ @@ -2414,14 +2422,16 @@ evdev_device_suspend(struct evdev_device *device) { evdev_notify_suspended_device(device); + if (device->dispatch->interface->suspend) + device->dispatch->interface->suspend(device->dispatch, + device); + if (device->source) { libinput_remove_source(device->base.seat->libinput, device->source); device->source = NULL; } - release_pressed_keys(device); - if (device->mtdev) { mtdev_close_delete(device->mtdev); device->mtdev = NULL; diff --git a/src/evdev.h b/src/evdev.h index 20c0b55..086e3b7 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -227,6 +227,10 @@ struct evdev_dispatch_interface { struct input_event *event, uint64_t time); + /* Device is being suspended */ + void (*suspend)(struct evdev_dispatch *dispatch, + struct evdev_device *device); + /* Device is being removed (may be NULL) */ void (*remove)(struct evdev_dispatch *dispatch); -- 2.3.5 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel