From 5a18344bbc0a47f13752d8e39a22450f89624980 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 22 May 2015 15:51:18 +1000 Subject: [PATCH libinput 04/10] touchpad: only check keyboards for disable-while-typing The keyboard test is a simple one, if we have the first row of alphabetic keys, we assume it's a full keyboard. Signed-off-by: Peter Hutterer Reviewed-by: Hans de Goede Tested-by: Benjamin Tissoires --- src/evdev-mt-touchpad.c | 22 ++++++++++++---------- src/evdev.c | 20 ++++++++++++++++++++ src/evdev.h | 1 + 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index 6c0daf0..5a05129 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -962,16 +962,18 @@ tp_device_added(struct evdev_device *device, tp_trackpoint_event, tp); } - /* FIXME: detect external keyboard better */ - kbd_is_internal = bus_tp != BUS_BLUETOOTH && - bus_kbd == bus_tp; - if (tp_is_internal && kbd_is_internal && - tp->dwt.keyboard == NULL) { - libinput_device_add_event_listener(&added_device->base, - &tp->dwt.keyboard_listener, - tp_keyboard_event, tp); - tp->dwt.keyboard = added_device; - tp->dwt.keyboard_active = false; + if (added_device->tags & EVDEV_TAG_KEYBOARD) { + /* FIXME: detect external keyboard better */ + kbd_is_internal = bus_tp != BUS_BLUETOOTH && + bus_kbd == bus_tp; + if (tp_is_internal && kbd_is_internal && + tp->dwt.keyboard == NULL) { + libinput_device_add_event_listener(&added_device->base, + &tp->dwt.keyboard_listener, + tp_keyboard_event, tp); + tp->dwt.keyboard = added_device; + tp->dwt.keyboard_active = false; + } } if (tp->sendevents.current_mode != diff --git a/src/evdev.c b/src/evdev.c index 4ce9250..a98e801 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -734,6 +734,25 @@ evdev_tag_trackpoint(struct evdev_device *device, } static void +evdev_tag_keyboard(struct evdev_device *device, + struct udev_device *udev_device) +{ + int code; + + if (!libevdev_has_event_type(device->evdev, EV_KEY)) + return; + + for (code = KEY_Q; code <= KEY_P; code++) { + if (!libevdev_has_event_code(device->evdev, + EV_KEY, + code)) + return; + } + + device->tags |= EVDEV_TAG_KEYBOARD; +} + +static void fallback_process(struct evdev_dispatch *dispatch, struct evdev_device *device, struct input_event *event, @@ -772,6 +791,7 @@ fallback_tag_device(struct evdev_device *device, { evdev_tag_external_mouse(device, udev_device); evdev_tag_trackpoint(device, udev_device); + evdev_tag_keyboard(device, udev_device); } static int diff --git a/src/evdev.h b/src/evdev.h index 20c0b55..bd398de 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -68,6 +68,7 @@ enum evdev_device_tags { EVDEV_TAG_INTERNAL_TOUCHPAD = (1 << 1), EVDEV_TAG_TRACKPOINT = (1 << 2), EVDEV_TAG_TOUCHPAD_TRACKPOINT = (1 << 3), + EVDEV_TAG_KEYBOARD = (1 << 4), }; enum evdev_middlebutton_state { -- 2.4.1