summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2017-05-22 13:34:10 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2017-05-23 15:10:10 +1000
commit1cfa1f64cfd610d97643be32e92c67c0ecee23c8 (patch)
treefc27d686275f10e0702cb38246c070701bfb476d /src
parent782a0661d110bf1cb348a4acf5858e385f0dc0f2 (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.c3
-rw-r--r--src/evdev.c31
-rw-r--r--src/evdev.h3
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),