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 <peter.hutte...@who-t.net> --- 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 1ea3bce..7a5c363 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -1006,16 +1006,18 @@ tp_interface_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 1a71e4c..6fc5bbc 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, @@ -831,6 +850,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 22e6b01..337097b 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 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel