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>
This commit is contained in:
Peter Hutterer 2017-05-22 13:34:10 +10:00
parent 782a0661d1
commit 1cfa1f64cf
6 changed files with 55 additions and 7 deletions

View file

@ -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

View file

@ -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),

View file

@ -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),

View file

@ -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
##########################################

View file

@ -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}'"

View file

@ -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