[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