diff options
Diffstat (limited to 'sway/input/input-manager.c')
-rw-r--r-- | sway/input/input-manager.c | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index 0c5254bd..a2a1e274 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c | |||
@@ -105,6 +105,37 @@ const char *input_device_get_type(struct sway_input_device *device) { | |||
105 | return "unknown"; | 105 | return "unknown"; |
106 | } | 106 | } |
107 | 107 | ||
108 | static void apply_input_type_config(struct sway_input_device *input_device) { | ||
109 | const char *device_type = input_device_get_type(input_device); | ||
110 | struct input_config *type_config = NULL; | ||
111 | for (int i = 0; i < config->input_type_configs->length; i++) { | ||
112 | struct input_config *ic = config->input_type_configs->items[i]; | ||
113 | if (strcmp(ic->identifier + 5, device_type) == 0) { | ||
114 | type_config = ic; | ||
115 | break; | ||
116 | } | ||
117 | } | ||
118 | if (type_config == NULL) { | ||
119 | return; | ||
120 | } | ||
121 | |||
122 | for (int i = 0; i < config->input_configs->length; i++) { | ||
123 | struct input_config *ic = config->input_configs->items[i]; | ||
124 | if (strcmp(input_device->identifier, ic->identifier) == 0) { | ||
125 | struct input_config *current = new_input_config(ic->identifier); | ||
126 | merge_input_config(current, type_config); | ||
127 | merge_input_config(current, ic); | ||
128 | |||
129 | current->input_type = device_type; | ||
130 | config->input_configs->items[i] = current; | ||
131 | free_input_config(ic); | ||
132 | ic = NULL; | ||
133 | |||
134 | break; | ||
135 | } | ||
136 | } | ||
137 | } | ||
138 | |||
108 | static struct sway_input_device *input_sway_device_from_wlr( | 139 | static struct sway_input_device *input_sway_device_from_wlr( |
109 | struct wlr_input_device *device) { | 140 | struct wlr_input_device *device) { |
110 | struct sway_input_device *input_device = NULL; | 141 | struct sway_input_device *input_device = NULL; |
@@ -541,6 +572,8 @@ static void handle_new_input(struct wl_listener *listener, void *data) { | |||
541 | sway_log(SWAY_DEBUG, "adding device: '%s'", | 572 | sway_log(SWAY_DEBUG, "adding device: '%s'", |
542 | input_device->identifier); | 573 | input_device->identifier); |
543 | 574 | ||
575 | apply_input_type_config(input_device); | ||
576 | |||
544 | if (input_device->wlr_device->type == WLR_INPUT_DEVICE_POINTER || | 577 | if (input_device->wlr_device->type == WLR_INPUT_DEVICE_POINTER || |
545 | input_device->wlr_device->type == WLR_INPUT_DEVICE_TABLET_TOOL) { | 578 | input_device->wlr_device->type == WLR_INPUT_DEVICE_TABLET_TOOL) { |
546 | input_manager_libinput_config_pointer(input_device); | 579 | input_manager_libinput_config_pointer(input_device); |
@@ -693,9 +726,13 @@ void input_manager_set_focus(struct sway_node *node) { | |||
693 | void input_manager_apply_input_config(struct input_config *input_config) { | 726 | void input_manager_apply_input_config(struct input_config *input_config) { |
694 | struct sway_input_device *input_device = NULL; | 727 | struct sway_input_device *input_device = NULL; |
695 | bool wildcard = strcmp(input_config->identifier, "*") == 0; | 728 | bool wildcard = strcmp(input_config->identifier, "*") == 0; |
729 | bool type_wildcard = strncmp(input_config->identifier, "type:", 5) == 0; | ||
696 | wl_list_for_each(input_device, &server.input->devices, link) { | 730 | wl_list_for_each(input_device, &server.input->devices, link) { |
731 | bool type_matches = type_wildcard && | ||
732 | strcmp(input_device_get_type(input_device), input_config->identifier + 5) == 0; | ||
697 | if (strcmp(input_device->identifier, input_config->identifier) == 0 | 733 | if (strcmp(input_device->identifier, input_config->identifier) == 0 |
698 | || wildcard) { | 734 | || wildcard |
735 | || type_matches) { | ||
699 | if (input_device->wlr_device->type == WLR_INPUT_DEVICE_POINTER || | 736 | if (input_device->wlr_device->type == WLR_INPUT_DEVICE_POINTER || |
700 | input_device->wlr_device->type == WLR_INPUT_DEVICE_TABLET_TOOL) { | 737 | input_device->wlr_device->type == WLR_INPUT_DEVICE_TABLET_TOOL) { |
701 | input_manager_libinput_config_pointer(input_device); | 738 | input_manager_libinput_config_pointer(input_device); |
@@ -829,5 +866,13 @@ struct input_config *input_device_get_config(struct sway_input_device *device) { | |||
829 | } | 866 | } |
830 | } | 867 | } |
831 | 868 | ||
869 | const char *device_type = input_device_get_type(device); | ||
870 | for (int i = 0; i < config->input_type_configs->length; ++i) { | ||
871 | input_config = config->input_type_configs->items[i]; | ||
872 | if (strcmp(input_config->identifier + 5, device_type) == 0) { | ||
873 | return input_config; | ||
874 | } | ||
875 | } | ||
876 | |||
832 | return wildcard_config; | 877 | return wildcard_config; |
833 | } | 878 | } |