diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2017-05-22 13:34:10 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2017-05-23 15:10:10 +1000 |
commit | 1cfa1f64cfd610d97643be32e92c67c0ecee23c8 (patch) | |
tree | fc27d686275f10e0702cb38246c070701bfb476d /src | |
parent | 782a0661d110bf1cb348a4acf5858e385f0dc0f2 (diff) |
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 <peter.hutterer@who-t.net>
Diffstat (limited to 'src')
-rw-r--r-- | src/evdev-mt-touchpad.c | 3 | ||||
-rw-r--r-- | src/evdev.c | 31 | ||||
-rw-r--r-- | src/evdev.h | 3 |
3 files changed, 33 insertions, 4 deletions
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), |