From 1cfa1f64cfd610d97643be32e92c67c0ecee23c8 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 22 May 2017 13:34:10 +1000 Subject: 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 ++- 3 files changed, 33 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index 17b14bc..e5f2a5c 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 f7a019c..02ed4f1 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 a5c11fc..b891f90 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), -- cgit v1.2.3