aboutsummaryrefslogtreecommitdiffstats
path: root/sway/input/input-manager.c
diff options
context:
space:
mode:
authorLibravatar Benjamin Cheng <ben@bcheng.me>2019-03-25 22:05:49 -0400
committerLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-04-14 19:31:36 -0400
commitbd3720585e91ae0dfcc4be30149ae4f8f5218174 (patch)
tree3a44b51a2c5a78bfbde227180c3853875a2258a4 /sway/input/input-manager.c
parentAdd heuristics to differentiate touchpads (diff)
downloadsway-bd3720585e91ae0dfcc4be30149ae4f8f5218174.tar.gz
sway-bd3720585e91ae0dfcc4be30149ae4f8f5218174.tar.zst
sway-bd3720585e91ae0dfcc4be30149ae4f8f5218174.zip
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.
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}