mirror of
https://github.com/swaywm/sway.git
synced 2025-11-14 06:59:47 -05:00
Implement input type configs (#3784)
Add support for configurations that apply to a type of inputs (i.e. natural scrolling on all touchpads). A type config is differentiated by a `type:` prefix followed by the type it corresponds to. When new devices appear, the device config is merged on top of its type config (if it exists). New type configs are applied on top of existing configs.
This commit is contained in:
parent
6737b90cb9
commit
bd3720585e
5 changed files with 109 additions and 6 deletions
|
|
@ -105,6 +105,37 @@ const char *input_device_get_type(struct sway_input_device *device) {
|
|||
return "unknown";
|
||||
}
|
||||
|
||||
static void apply_input_type_config(struct sway_input_device *input_device) {
|
||||
const char *device_type = input_device_get_type(input_device);
|
||||
struct input_config *type_config = NULL;
|
||||
for (int i = 0; i < config->input_type_configs->length; i++) {
|
||||
struct input_config *ic = config->input_type_configs->items[i];
|
||||
if (strcmp(ic->identifier + 5, device_type) == 0) {
|
||||
type_config = ic;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (type_config == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < config->input_configs->length; i++) {
|
||||
struct input_config *ic = config->input_configs->items[i];
|
||||
if (strcmp(input_device->identifier, ic->identifier) == 0) {
|
||||
struct input_config *current = new_input_config(ic->identifier);
|
||||
merge_input_config(current, type_config);
|
||||
merge_input_config(current, ic);
|
||||
|
||||
current->input_type = device_type;
|
||||
config->input_configs->items[i] = current;
|
||||
free_input_config(ic);
|
||||
ic = NULL;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static struct sway_input_device *input_sway_device_from_wlr(
|
||||
struct wlr_input_device *device) {
|
||||
struct sway_input_device *input_device = NULL;
|
||||
|
|
@ -541,6 +572,8 @@ static void handle_new_input(struct wl_listener *listener, void *data) {
|
|||
sway_log(SWAY_DEBUG, "adding device: '%s'",
|
||||
input_device->identifier);
|
||||
|
||||
apply_input_type_config(input_device);
|
||||
|
||||
if (input_device->wlr_device->type == WLR_INPUT_DEVICE_POINTER ||
|
||||
input_device->wlr_device->type == WLR_INPUT_DEVICE_TABLET_TOOL) {
|
||||
input_manager_libinput_config_pointer(input_device);
|
||||
|
|
@ -693,9 +726,13 @@ void input_manager_set_focus(struct sway_node *node) {
|
|||
void input_manager_apply_input_config(struct input_config *input_config) {
|
||||
struct sway_input_device *input_device = NULL;
|
||||
bool wildcard = strcmp(input_config->identifier, "*") == 0;
|
||||
bool type_wildcard = strncmp(input_config->identifier, "type:", 5) == 0;
|
||||
wl_list_for_each(input_device, &server.input->devices, link) {
|
||||
bool type_matches = type_wildcard &&
|
||||
strcmp(input_device_get_type(input_device), input_config->identifier + 5) == 0;
|
||||
if (strcmp(input_device->identifier, input_config->identifier) == 0
|
||||
|| wildcard) {
|
||||
|| wildcard
|
||||
|| type_matches) {
|
||||
if (input_device->wlr_device->type == WLR_INPUT_DEVICE_POINTER ||
|
||||
input_device->wlr_device->type == WLR_INPUT_DEVICE_TABLET_TOOL) {
|
||||
input_manager_libinput_config_pointer(input_device);
|
||||
|
|
@ -829,5 +866,13 @@ struct input_config *input_device_get_config(struct sway_input_device *device) {
|
|||
}
|
||||
}
|
||||
|
||||
const char *device_type = input_device_get_type(device);
|
||||
for (int i = 0; i < config->input_type_configs->length; ++i) {
|
||||
input_config = config->input_type_configs->items[i];
|
||||
if (strcmp(input_config->identifier + 5, device_type) == 0) {
|
||||
return input_config;
|
||||
}
|
||||
}
|
||||
|
||||
return wildcard_config;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue