Add touchpad device type

It is nice to have finer granularity for device types to allow for
configurations such as using `naturalScroll` on touchpads, but not on
regular pointer devices such as mice.
This commit is contained in:
Jared Baur 2023-12-15 07:36:29 -08:00 committed by Johan Malm
parent e3cd189769
commit 6faee17d20
6 changed files with 30 additions and 15 deletions

View file

@ -435,11 +435,11 @@ windows using the mouse.
*<libinput><device category="">* *<libinput><device category="">*
Define a category of devices to use the configuration values that Define a category of devices to use the configuration values that
follow. The category can be set to touch (devices that define a width follow. The category can be set to touch (devices that define a width
and height), non-touch, default, or the name of a device. You can obtain and height), touchpad, non-touch, default, or the name of a device. You
your devices name by running *libinput list-devices* (you may need to can obtain your devices name by running *libinput list-devices* (you may
be root or a part of the input group to perform this.) Any members of need to be root or a part of the input group to perform this.) Any
this category that are not set use the default for the device. With the members of this category that are not set use the default for the
exception of tap-to-click, which is enabled by default. device. With the exception of tap-to-click, which is enabled by default.
*<libinput><device category=""><naturalScroll>* [yes|no] *<libinput><device category=""><naturalScroll>* [yes|no]
Use natural scrolling for this category if available. Use natural scrolling for this category if available.

View file

@ -394,9 +394,9 @@
</mouse> </mouse>
<!-- <!--
The *category* element can be set to touch, non-touch, default or the name The *category* element can be set to touch, touchpad, non-touch, default or
of a device. You can obtain device names by running *libinput list-devices* the name of a device. You can obtain device names by running *libinput
as root or member of the input group. list-devices* as root or member of the input group.
Tap is set to *yes* be default. All others are left blank in order to use Tap is set to *yes* be default. All others are left blank in order to use
device defaults. device defaults.

View file

@ -9,6 +9,7 @@
enum device_type { enum device_type {
DEFAULT_DEVICE, DEFAULT_DEVICE,
TOUCH_DEVICE, TOUCH_DEVICE,
TOUCHPAD_DEVICE,
NON_TOUCH_DEVICE, NON_TOUCH_DEVICE,
}; };

View file

@ -32,6 +32,9 @@ get_device_type(const char *s)
if (!strcasecmp(s, "touch")) { if (!strcasecmp(s, "touch")) {
return TOUCH_DEVICE; return TOUCH_DEVICE;
} }
if (!strcasecmp(s, "touchpad")) {
return TOUCHPAD_DEVICE;
}
if (!strcasecmp(s, "non-touch")) { if (!strcasecmp(s, "non-touch")) {
return NON_TOUCH_DEVICE; return NON_TOUCH_DEVICE;
} }

View file

@ -460,6 +460,7 @@ fill_libinput_category(char *nodename, char *content)
if (!strcmp(nodename, "category")) { if (!strcmp(nodename, "category")) {
if (!strcmp(content, "touch") if (!strcmp(content, "touch")
|| !strcmp(content, "touchpad")
|| !strcmp(content, "non-touch") || !strcmp(content, "non-touch")
|| !strcmp(content, "default")) { || !strcmp(content, "default")) {
current_libinput_category->type = get_device_type(content); current_libinput_category->type = get_device_type(content);

View file

@ -33,17 +33,28 @@ input_device_destroy(struct wl_listener *listener, void *data)
free(input); free(input);
} }
static bool static enum device_type
is_touch_device(struct wlr_input_device *wlr_input_device) device_type_from_wlr_device(struct wlr_input_device *wlr_input_device)
{ {
switch (wlr_input_device->type) { switch (wlr_input_device->type) {
case WLR_INPUT_DEVICE_TOUCH: case WLR_INPUT_DEVICE_TOUCH:
case WLR_INPUT_DEVICE_TABLET_TOOL: case WLR_INPUT_DEVICE_TABLET_TOOL:
return true; return TOUCH_DEVICE;
default: default:
break; break;
} }
return false;
if (wlr_input_device->type == WLR_INPUT_DEVICE_POINTER &&
wlr_input_device_is_libinput(wlr_input_device)) {
struct libinput_device *libinput_device =
wlr_libinput_get_device_handle(wlr_input_device);
if (libinput_device_config_tap_get_finger_count(libinput_device) > 0) {
return TOUCHPAD_DEVICE;
}
}
return NON_TOUCH_DEVICE;
} }
static void static void
@ -64,9 +75,8 @@ configure_libinput(struct wlr_input_device *wlr_input_device)
return; return;
} }
enum device_type current_type; enum device_type current_type =
current_type = is_touch_device(wlr_input_device) device_type_from_wlr_device(wlr_input_device);
? TOUCH_DEVICE : NON_TOUCH_DEVICE;
struct libinput_category *device_category, *dc = NULL; struct libinput_category *device_category, *dc = NULL;
wl_list_for_each(device_category, &rc.libinput_categories, link) { wl_list_for_each(device_category, &rc.libinput_categories, link) {