[PATCH libinput 04/11] touchpad: only check keyboards for disable-while-typing

Peter Hutterer peter.hutterer at who-t.net
Mon May 25 15:52:51 PDT 2015


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 at 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



More information about the wayland-devel mailing list