[PATCH libinput 2/2] evdev: switch to using udev's device tagging system
Benjamin Tissoires
benjamin.tissoires at gmail.com
Fri Feb 6 14:17:58 PST 2015
On Thu, Feb 5, 2015 at 6:03 AM, Peter Hutterer <peter.hutterer at who-t.net> wrote:
> Use ID_INPUT_FOO to assume a device is a FOO, don't decide ourselves based on
> whatever bits are available. This moves the categorization out to udev's
> input_id builtin by default and other bits that tag the device. libwacom tags
> all known devices as ID_INPUT_TABLET and (for touch-enabled ones)
> ID_INPUT_TOUCH - we can re-use that knowledge then.
>
> Ignore anything that doesn't have ID_INPUT set, this provides for an easy way
> of making devices "invisible" to libinput.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
There are tiny differences between how libinput and udev handle the
various categories of devices.
I think for most of the cases, the result is the same. Anyway, having
an external way to assign the type of the device that the users can
change is a much better solution.
Both patches are Reviewed-by: Benjamin Tissoires <benjamin.tissoires at gmail.com>
Cheers,
Benjamin
> src/evdev.c | 116 ++++++++++++++++++------------------------------------------
> 1 file changed, 34 insertions(+), 82 deletions(-)
>
> diff --git a/src/evdev.c b/src/evdev.c
> index 1fcda58..057b543 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -1375,47 +1375,37 @@ evdev_configure_device(struct evdev_device *device)
> struct libinput *libinput = device->base.seat->libinput;
> struct libevdev *evdev = device->evdev;
> const struct input_absinfo *absinfo;
> - int has_abs, has_rel, has_mt;
> - int has_button, has_keyboard, has_touch, has_joystick_button;
> struct mt_slot *slots;
> int num_slots;
> int active_slot;
> int slot;
> - unsigned int i;
> const char *devnode = udev_device_get_devnode(device->udev_device);
> enum evdev_device_udev_tags udev_tags;
>
> udev_tags = evdev_device_get_udev_tags(device, device->udev_device);
>
> - has_rel = 0;
> - has_abs = 0;
> - has_mt = 0;
> - has_button = 0;
> - has_joystick_button = 0;
> - has_keyboard = 0;
> - has_touch = 0;
> -
> - if (udev_tags)
> + if ((udev_tags & EVDEV_UDEV_TAG_INPUT) == 0 ||
> + (udev_tags & ~EVDEV_UDEV_TAG_INPUT) == 0) {
> log_info(libinput,
> - "input device '%s', %s is tagged by udev as:%s%s%s%s%s%s\n",
> - device->devname, devnode,
> - udev_tags & EVDEV_UDEV_TAG_KEYBOARD ? " Keyboard" : "",
> - udev_tags & EVDEV_UDEV_TAG_MOUSE ? " Mouse" : "",
> - udev_tags & EVDEV_UDEV_TAG_TOUCHPAD ? " Touchpad" : "",
> - udev_tags & EVDEV_UDEV_TAG_TOUCHSCREEN ? " Touchscreen" : "",
> - udev_tags & EVDEV_UDEV_TAG_TABLET ? " Tablet" : "",
> - udev_tags & EVDEV_UDEV_TAG_JOYSTICK ? " Joystick" : "",
> - udev_tags & EVDEV_UDEV_TAG_ACCELEROMETER ? " Accelerometer" : "");
> + "input device '%s', %s not tagged as input device\n",
> + device->devname, devnode);
> + return -1;
> + }
>
> - for (i = BTN_JOYSTICK; i <= BTN_PINKIE; i++)
> - if (libevdev_has_event_code(evdev, EV_KEY, i))
> - has_joystick_button = 1;
> + log_info(libinput,
> + "input device '%s', %s is tagged by udev as:%s%s%s%s%s%s\n",
> + device->devname, devnode,
> + udev_tags & EVDEV_UDEV_TAG_KEYBOARD ? " Keyboard" : "",
> + udev_tags & EVDEV_UDEV_TAG_MOUSE ? " Mouse" : "",
> + udev_tags & EVDEV_UDEV_TAG_TOUCHPAD ? " Touchpad" : "",
> + udev_tags & EVDEV_UDEV_TAG_TOUCHSCREEN ? " Touchscreen" : "",
> + udev_tags & EVDEV_UDEV_TAG_TABLET ? " Tablet" : "",
> + udev_tags & EVDEV_UDEV_TAG_JOYSTICK ? " Joystick" : "",
> + udev_tags & EVDEV_UDEV_TAG_ACCELEROMETER ? " Accelerometer" : "");
>
> - for (i = BTN_GAMEPAD; i <= BTN_TR2; i++)
> - if (libevdev_has_event_code(evdev, EV_KEY, i))
> - has_joystick_button = 1;
> -
> - if (has_joystick_button) {
> + /* libwacom *adds* TABLET, TOUCHPAD but leaves JOYSTICK in place, so
> + make sure we only ignore real joystick devices */
> + if ((udev_tags & EVDEV_UDEV_TAG_JOYSTICK) == udev_tags) {
> log_info(libinput,
> "input device '%s', %s is a joystick, ignoring\n",
> device->devname, devnode);
> @@ -1430,7 +1420,6 @@ evdev_configure_device(struct evdev_device *device)
> absinfo))
> device->abs.fake_resolution = 1;
> device->abs.absinfo_x = absinfo;
> - has_abs = 1;
> }
> if ((absinfo = libevdev_get_abs_info(evdev, ABS_Y))) {
> if (evdev_fix_abs_resolution(evdev,
> @@ -1438,7 +1427,6 @@ evdev_configure_device(struct evdev_device *device)
> absinfo))
> device->abs.fake_resolution = 1;
> device->abs.absinfo_y = absinfo;
> - has_abs = 1;
> }
>
> /* Fake MT devices have the ABS_MT_SLOT bit set because of
> @@ -1446,8 +1434,7 @@ evdev_configure_device(struct evdev_device *device)
> just have too many ABS_ axes */
> if (libevdev_has_event_code(evdev, EV_ABS, ABS_MT_SLOT) &&
> libevdev_get_num_slots(evdev) == -1) {
> - has_mt = 0;
> - has_touch = 0;
> + udev_tags &= ~EVDEV_UDEV_TAG_TOUCHSCREEN;
> } else if (libevdev_has_event_code(evdev, EV_ABS, ABS_MT_POSITION_X) &&
> libevdev_has_event_code(evdev, EV_ABS, ABS_MT_POSITION_Y)) {
> absinfo = libevdev_get_abs_info(evdev, ABS_MT_POSITION_X);
> @@ -1464,8 +1451,6 @@ evdev_configure_device(struct evdev_device *device)
> device->abs.fake_resolution = 1;
> device->abs.absinfo_y = absinfo;
> device->is_mt = 1;
> - has_touch = 1;
> - has_mt = 1;
>
> /* We only handle the slotted Protocol B in libinput.
> Devices with ABS_MT_POSITION_* but not ABS_MT_SLOT
> @@ -1500,75 +1485,42 @@ evdev_configure_device(struct evdev_device *device)
> }
> }
>
> - if (libevdev_has_event_code(evdev, EV_REL, REL_X) ||
> - libevdev_has_event_code(evdev, EV_REL, REL_Y))
> - has_rel = 1;
> -
> - if (libevdev_has_event_type(evdev, EV_KEY)) {
> - if (!libevdev_has_property(evdev, INPUT_PROP_DIRECT) &&
> - libevdev_has_event_code(evdev, EV_KEY, BTN_TOOL_FINGER) &&
> - !libevdev_has_event_code(evdev, EV_KEY, BTN_TOOL_PEN) &&
> - (has_abs || has_mt)) {
> - device->dispatch = evdev_mt_touchpad_create(device);
> - log_info(libinput,
> - "input device '%s', %s is a touchpad\n",
> - device->devname, devnode);
> - return device->dispatch == NULL ? -1 : 0;
> - }
> -
> - for (i = 0; i < KEY_MAX; i++) {
> - if (libevdev_has_event_code(evdev, EV_KEY, i)) {
> - switch (get_key_type(i)) {
> - case EVDEV_KEY_TYPE_NONE:
> - break;
> - case EVDEV_KEY_TYPE_KEY:
> - has_keyboard = 1;
> - break;
> - case EVDEV_KEY_TYPE_BUTTON:
> - has_button = 1;
> - break;
> - }
> - }
> - }
> -
> - if (libevdev_has_event_code(evdev, EV_KEY, BTN_TOUCH))
> - has_touch = 1;
> + if (udev_tags & EVDEV_UDEV_TAG_TOUCHPAD) {
> + device->dispatch = evdev_mt_touchpad_create(device);
> + log_info(libinput,
> + "input device '%s', %s is a touchpad\n",
> + device->devname, devnode);
> + return device->dispatch == NULL ? -1 : 0;
> }
> - if (libevdev_has_event_type(evdev, EV_LED))
> - has_keyboard = 1;
>
> - if ((has_abs || has_rel) && has_button) {
> - if (has_rel &&
> + if (udev_tags & EVDEV_UDEV_TAG_MOUSE) {
> + if (!libevdev_has_event_code(evdev, EV_ABS, ABS_X) &&
> + !libevdev_has_event_code(evdev, EV_ABS, ABS_Y) &&
> evdev_device_init_pointer_acceleration(device) == -1)
> return -1;
>
> device->seat_caps |= EVDEV_DEVICE_POINTER;
>
> log_info(libinput,
> - "input device '%s', %s is a pointer caps =%s%s%s\n",
> - device->devname, devnode,
> - has_abs ? " absolute-motion" : "",
> - has_rel ? " relative-motion": "",
> - has_button ? " button" : "");
> + "input device '%s', %s is a pointer caps\n",
> + device->devname, devnode);
>
> /* want left-handed config option */
> device->left_handed.want_enabled = true;
> /* want natural-scroll config option */
> device->scroll.natural_scrolling_enabled = true;
> - }
> -
> - if (has_rel && has_button) {
> /* want button scrolling config option */
> device->scroll.want_button = 1;
> }
>
> - if (has_keyboard) {
> + if (udev_tags & EVDEV_UDEV_TAG_KEYBOARD) {
> device->seat_caps |= EVDEV_DEVICE_KEYBOARD;
> log_info(libinput,
> "input device '%s', %s is a keyboard\n",
> device->devname, devnode);
> }
> - if (has_touch && !has_button) {
> +
> + if (udev_tags & EVDEV_UDEV_TAG_TOUCHSCREEN) {
> device->seat_caps |= EVDEV_DEVICE_TOUCH;
> log_info(libinput,
> "input device '%s', %s is a touch device\n",
> --
> 2.1.0
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list