From 1cfa1f64cfd610d97643be32e92c67c0ecee23c8 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 22 May 2017 13:34:10 +1000 Subject: [PATCH] evdev: read LIBINPUT_ATTR_KEYBOARD_INTEGRATION property 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 --- 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 @@ -25,6 +25,12 @@ libinput:name:*Lid Switch*:dmi:*:ct10:* 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 ########################################## @@ -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: +ENV{ID_INPUT_KEYBOARD}=="1", \ + IMPORT{builtin}="hwdb --subsystem=input --lookup-prefix=libinput:keyboard:" + # libinput:name::dmi: 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.34.1