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

Reply via email to