summaryrefslogtreecommitdiffstats
path: root/sway/input/input-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/input/input-manager.c')
-rw-r--r--sway/input/input-manager.c47
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
108static 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
108static struct sway_input_device *input_sway_device_from_wlr( 139static 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) {
693void input_manager_apply_input_config(struct input_config *input_config) { 726void 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}