touchpad: only check keyboards for disable-while-typing
authorPeter Hutterer <peter.hutterer@who-t.net>
Fri, 22 May 2015 05:51:18 +0000 (15:51 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Wed, 27 May 2015 07:38:25 +0000 (17:38 +1000)
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.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Tested-by: Benjamin Tissoires <benjamin.tissoires@gmail.com>
src/evdev-mt-touchpad.c
src/evdev.c
src/evdev.h

index 1ea3bcec624619cdbda92c535a3bf17968dc7f35..7a5c363813ebd24b1a8fcab21aa15fae067a7290 100644 (file)
@@ -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 !=
index c6c8102bd9cea36352c9d81e257ac383fdca6021..c552cb04b058b2cb6a910563a6f7a836afe4f708 100644 (file)
@@ -733,6 +733,25 @@ evdev_tag_trackpoint(struct evdev_device *device,
                device->tags |= EVDEV_TAG_TRACKPOINT;
 }
 
+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,
@@ -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
index 22e6b019e7aa1ad91e959ea3c2dee77cefb25bd1..337097b5973c276681e78edab6b953d044419106 100644 (file)
@@ -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 {