[PATCH libinput 2/5] evdev: read LIBINPUT_ATTR_KEYBOARD_INTEGRATION property

Peter Hutterer peter.hutterer at who-t.net
Wed May 24 00:04:01 UTC 2017


We have heuristics for detecting whether a keyboard is internal or external,
but in some cases (e.g. Surface 3) these heuristics fail. Add a udev property
that we can apply to these cases so we have something that's reliable.

This will likely eventually become ID_INPUT_KEYBOARD_INTEGRATION as shipped by
systemd, similar to the touchpad property.

https://bugs.freedesktop.org/show_bug.cgi?id=101101

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev-mt-touchpad.c                |  3 +--
 src/evdev.c                            | 31 ++++++++++++++++++++++++++++++-
 src/evdev.h                            |  3 ++-
 udev/90-libinput-model-quirks.hwdb     | 12 +++++++++++-
 udev/90-libinput-model-quirks.rules.in |  4 ++++
 udev/parse_hwdb.py                     |  9 +++++++--
 6 files changed, 55 insertions(+), 7 deletions(-)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index 17b14bc8..e5f2a5ce 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -1601,8 +1601,7 @@ tp_want_dwt(struct evdev_device *touchpad,
 	/* For Apple touchpads, always use its internal keyboard */
 	if (vendor_tp == VENDOR_ID_APPLE) {
 		return vendor_kbd == vendor_tp &&
-		       keyboard->model_flags &
-				EVDEV_MODEL_APPLE_INTERNAL_KEYBOARD;
+		       keyboard->tags & EVDEV_TAG_INTERNAL_KEYBOARD;
 	}
 
 	/* everything else we don't really know, so we have to assume
diff --git a/src/evdev.c b/src/evdev.c
index f7a019c6..02ed4f1a 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -1089,10 +1089,25 @@ evdev_tag_trackpoint(struct evdev_device *device,
 		device->tags |= EVDEV_TAG_TRACKPOINT;
 }
 
+static inline void
+evdev_tag_keyboard_internal(struct evdev_device *device)
+{
+	device->tags |= EVDEV_TAG_INTERNAL_KEYBOARD;
+	device->tags &= ~EVDEV_TAG_EXTERNAL_KEYBOARD;
+}
+
+static inline void
+evdev_tag_keyboard_external(struct evdev_device *device)
+{
+	device->tags |= EVDEV_TAG_EXTERNAL_KEYBOARD;
+	device->tags &= ~EVDEV_TAG_INTERNAL_KEYBOARD;
+}
+
 static void
 evdev_tag_keyboard(struct evdev_device *device,
 		   struct udev_device *udev_device)
 {
+	const char *prop;
 	int code;
 
 	if (!libevdev_has_event_type(device->evdev, EV_KEY))
@@ -1105,6 +1120,21 @@ evdev_tag_keyboard(struct evdev_device *device,
 			return;
 	}
 
+	/* This should eventually become ID_INPUT_KEYBOARD_INTEGRATION */
+	prop = udev_device_get_property_value(udev_device,
+					      "LIBINPUT_ATTR_KEYBOARD_INTEGRATION");
+	if (prop) {
+		if (streq(prop, "internal")) {
+			evdev_tag_keyboard_internal(device);
+		} else if (streq(prop, "external")) {
+			evdev_tag_keyboard_external(device);
+		} else {
+			evdev_log_info(device,
+				       "tagged with unknown value %s\n",
+				       prop);
+		}
+	}
+
 	device->tags |= EVDEV_TAG_KEYBOARD;
 }
 
@@ -2251,7 +2281,6 @@ evdev_read_model_flags(struct evdev_device *device)
 		MODEL(ALPS_TOUCHPAD),
 		MODEL(SYNAPTICS_SERIAL_TOUCHPAD),
 		MODEL(JUMPING_SEMI_MT),
-		MODEL(APPLE_INTERNAL_KEYBOARD),
 		MODEL(CYBORG_RAT),
 		MODEL(HP_STREAM11_TOUCHPAD),
 		MODEL(LENOVO_T450_TOUCHPAD),
diff --git a/src/evdev.h b/src/evdev.h
index a5c11fc3..b891f906 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -73,6 +73,8 @@ enum evdev_device_tags {
 	EVDEV_TAG_TRACKPOINT = (1 << 3),
 	EVDEV_TAG_KEYBOARD = (1 << 4),
 	EVDEV_TAG_LID_SWITCH = (1 << 5),
+	EVDEV_TAG_INTERNAL_KEYBOARD = (1 << 6),
+	EVDEV_TAG_EXTERNAL_KEYBOARD = (1 << 7),
 };
 
 enum evdev_middlebutton_state {
@@ -112,7 +114,6 @@ enum evdev_device_model {
 	EVDEV_MODEL_SYNAPTICS_SERIAL_TOUCHPAD = (1 << 9),
 	EVDEV_MODEL_JUMPING_SEMI_MT = (1 << 10),
 	EVDEV_MODEL_LENOVO_X220_TOUCHPAD_FW81 = (1 << 12),
-	EVDEV_MODEL_APPLE_INTERNAL_KEYBOARD = (1 << 13),
 	EVDEV_MODEL_CYBORG_RAT = (1 << 14),
 	EVDEV_MODEL_HP_STREAM11_TOUCHPAD = (1 << 16),
 	EVDEV_MODEL_LENOVO_T450_TOUCHPAD= (1 << 17),
diff --git a/udev/90-libinput-model-quirks.hwdb b/udev/90-libinput-model-quirks.hwdb
index 3f048092..229fb1de 100644
--- a/udev/90-libinput-model-quirks.hwdb
+++ b/udev/90-libinput-model-quirks.hwdb
@@ -26,6 +26,12 @@ libinput:name:*Lid Switch*:dmi:*:ct9:*
  LIBINPUT_ATTR_LID_SWITCH_RELIABILITY=reliable
 
 ##########################################
+# Serial keyboards are internal
+##########################################
+libinput:keyboard:input:b0011v*
+ LIBINPUT_ATTR_KEYBOARD_INTEGRATION=internal
+
+##########################################
 # ALPS
 ##########################################
 libinput:name:*AlpsPS/2 ALPS DualPoint TouchPad:dmi:*
@@ -45,7 +51,7 @@ libinput:touchpad:input:b0005v05ACp*
  LIBINPUT_ATTR_SIZE_HINT=104x75
 
 libinput:name:*Apple Inc. Apple Internal Keyboard*:dmi:*
- LIBINPUT_MODEL_APPLE_INTERNAL_KEYBOARD=1
+ LIBINPUT_ATTR_KEYBOARD_INTEGRATION=internal
 
 libinput:mouse:input:b0005v05ACp030D*
  LIBINPUT_MODEL_APPLE_MAGICMOUSE=1
@@ -186,6 +192,10 @@ libinput:mouse:input:b0003v046DpC408*
 libinput:name:*Lid Switch*:dmi:*svnMicrosoftCorporation:pnSurface3:*
  LIBINPUT_ATTR_LID_SWITCH_RELIABILITY=write_open
 
+# Surface 3 Type Cover keyboard
+libinput:name:*Microsoft Surface Type Cover Keyboard*:dmi:*svnMicrosoftCorporation:pnSurface3:*
+ LIBINPUT_ATTR_KEYBOARD_INTEGRATION=internal
+
 ##########################################
 # Synaptics
 ##########################################
diff --git a/udev/90-libinput-model-quirks.rules.in b/udev/90-libinput-model-quirks.rules.in
index 8bff192d..ace2bf07 100644
--- a/udev/90-libinput-model-quirks.rules.in
+++ b/udev/90-libinput-model-quirks.rules.in
@@ -33,6 +33,10 @@ ENV{ID_INPUT_TOUCHPAD}=="1", \
 ENV{ID_INPUT_MOUSE}=="1", \
   IMPORT{builtin}="hwdb --subsystem=input --lookup-prefix=libinput:mouse:"
 
+# libinput:touchpad:<modalias>
+ENV{ID_INPUT_KEYBOARD}=="1", \
+  IMPORT{builtin}="hwdb --subsystem=input --lookup-prefix=libinput:keyboard:"
+
 # libinput:name:<name>:dmi:<dmi string>
 KERNELS=="input*", \
   IMPORT{builtin}="hwdb 'libinput:name:$attr{name}:$attr{[dmi/id]modalias}'"
diff --git a/udev/parse_hwdb.py b/udev/parse_hwdb.py
index b4f0b1bf..8ac64010 100755
--- a/udev/parse_hwdb.py
+++ b/udev/parse_hwdb.py
@@ -60,7 +60,7 @@ REAL = Combine((INTEGER + Optional('.' + Optional(INTEGER))) ^ ('.' + INTEGER))
 UDEV_TAG = Word(string.ascii_uppercase, alphanums + '_')
 
 TYPES = {
-         'libinput': ('name', 'touchpad', 'mouse'),
+         'libinput': ('name', 'touchpad', 'mouse', 'keyboard'),
          }
 
 @functools.lru_cache()
@@ -117,8 +117,13 @@ def property_grammar():
                       Suppress('=') -
                       Group(pressure_range('SETTINGS*')) ]
 
+    kbintegration_tags = Or(('internal', 'external'))
+    kbintegration = [Literal('LIBINPUT_ATTR_KEYBOARD_INTEGRATION')('NAME') -
+                         Suppress('=') -
+                         kbintegration_tags('VALUE')]
+
     grammar = Or(model_props + size_props + reliability + tpkbcombo +
-                 pressure_prop)
+                 pressure_prop + kbintegration)
 
     return grammar
 
-- 
2.13.0



More information about the wayland-devel mailing list