[PATCH libinput v2 4/5] Pair touchpad and lid_switch for disable
Peter Hutterer
peter.hutterer at who-t.net
Thu Jan 12 03:21:54 UTC 2017
On Tue, Jan 10, 2017 at 12:24:24PM +1100, James Ye wrote:
> Add listener for lid switch events, disable touchpad on switch event.
>
> Signed-off-by: James Ye <jye836 at gmail.com>
> ---
> src/evdev-mt-touchpad.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
> src/evdev-mt-touchpad.h | 5 +++++
> 2 files changed, 52 insertions(+)
>
> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
> index f437c2d..eaf232b 100644
> --- a/src/evdev-mt-touchpad.c
> +++ b/src/evdev-mt-touchpad.c
> @@ -1177,6 +1177,10 @@ tp_remove_sendevents(struct tp_dispatch *tp)
> if (tp->dwt.keyboard)
> libinput_device_remove_event_listener(
> &tp->dwt.keyboard_listener);
> +
> + if (tp->lid_switch.lid_switch)
> + libinput_device_remove_event_listener(
> + &tp->lid_switch.lid_switch_listener);
> }
>
> static void
> @@ -1554,6 +1558,48 @@ tp_pair_trackpoint(struct evdev_device *touchpad,
> }
>
> static void
> +tp_lid_switch_event(uint64_t time, struct libinput_event *event, void *data)
> +{
> + struct tp_dispatch *tp = data;
> + struct libinput_event_switch *swev;
> +
> + swev = libinput_event_get_switch_event(event);
this assumes that the event passed in here is always a switch event. I
don't think we can assume that (even though it's likely given the lid
devices out there). We need an extra condition here to ignore anything but
switch events.
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net> for the rest though
Cheers,
Peter
> +
> + switch (libinput_event_switch_get_switch_state(swev)) {
> + case LIBINPUT_SWITCH_STATE_OFF:
> + tp_resume(tp, tp->device);
> + log_debug(tp_libinput_context(tp), "lid: resume touchpad\n");
> + break;
> + case LIBINPUT_SWITCH_STATE_ON:
> + tp_suspend(tp, tp->device);
> + log_debug(tp_libinput_context(tp), "lid: suspend touchpad\n");
> + break;
> + }
> +}
> +
> +static void
> +tp_pair_lid_switch(struct evdev_device *touchpad,
> + struct evdev_device *lid_switch)
> +{
> + struct tp_dispatch *tp = (struct tp_dispatch*)touchpad->dispatch;
> +
> + if ((lid_switch->tags & EVDEV_TAG_LID_SWITCH) == 0)
> + return;
> +
> + if (tp->lid_switch.lid_switch == NULL) {
> + log_debug(tp_libinput_context(tp),
> + "lid_switch: activated for %s<->%s\n",
> + touchpad->devname,
> + lid_switch->devname);
> +
> + libinput_device_add_event_listener(&lid_switch->base,
> + &tp->lid_switch.lid_switch_listener,
> + tp_lid_switch_event, tp);
> + tp->lid_switch.lid_switch = lid_switch;
> + }
> +}
> +
> +static void
> tp_interface_device_added(struct evdev_device *device,
> struct evdev_device *added_device)
> {
> @@ -1561,6 +1607,7 @@ tp_interface_device_added(struct evdev_device *device,
>
> tp_pair_trackpoint(device, added_device);
> tp_dwt_pair_keyboard(device, added_device);
> + tp_pair_lid_switch(device, added_device);
>
> if (tp->sendevents.current_mode !=
> LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE)
> diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
> index b9ca5bf..f8fc127 100644
> --- a/src/evdev-mt-touchpad.h
> +++ b/src/evdev-mt-touchpad.h
> @@ -376,6 +376,11 @@ struct tp_dispatch {
> */
> unsigned int nonmotion_event_count;
> } quirks;
> +
> + struct {
> + struct libinput_event_listener lid_switch_listener;
> + struct evdev_device *lid_switch;
> + } lid_switch;
> };
>
> #define tp_for_each_touch(_tp, _t) \
> --
> 2.9.3
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
More information about the wayland-devel
mailing list