aboutsummaryrefslogtreecommitdiff
path: root/sway/input
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2023-11-16 14:56:46 +0100
committerKenny Levinsen <kl@kl.wtf>2023-11-16 16:29:07 +0100
commit7036769bea886ab1f9d627785f14cea9e25b16f7 (patch)
tree73df7ae212c8f2587abd9860bcb54be3c831a6fb /sway/input
parentcaa92ddee81b4af121773abc048ab79ea6df0a98 (diff)
Only reconfigure input mappings on output change
Fully reconfiguring all input devices on output change takes a loooong time. Let's just reconfigure what we need: only mappings depend on outputs.
Diffstat (limited to 'sway/input')
-rw-r--r--sway/input/input-manager.c10
-rw-r--r--sway/input/seat.c24
2 files changed, 31 insertions, 3 deletions
diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c
index db82bb4c..5300919a 100644
--- a/sway/input/input-manager.c
+++ b/sway/input/input-manager.c
@@ -571,6 +571,16 @@ void input_manager_configure_all_inputs(void) {
}
}
+void input_manager_configure_all_input_mappings(void) {
+ struct sway_input_device *input_device;
+ wl_list_for_each(input_device, &server.input->devices, link) {
+ struct sway_seat *seat;
+ wl_list_for_each(seat, &server.input->seats, link) {
+ seat_configure_device_mapping(seat, input_device);
+ }
+ }
+}
+
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;
diff --git a/sway/input/seat.c b/sway/input/seat.c
index bafdbcf3..f73946b1 100644
--- a/sway/input/seat.c
+++ b/sway/input/seat.c
@@ -710,6 +710,15 @@ static void seat_apply_input_mapping(struct sway_seat *seat,
struct input_config *ic =
input_device_get_config(sway_device->input_device);
+ switch (sway_device->input_device->wlr_device->type) {
+ case WLR_INPUT_DEVICE_POINTER:
+ case WLR_INPUT_DEVICE_TOUCH:
+ case WLR_INPUT_DEVICE_TABLET_TOOL:
+ break;
+ default:
+ return; // these devices don't support mappings
+ }
+
sway_log(SWAY_DEBUG, "Applying input mapping to %s",
sway_device->input_device->identifier);
@@ -799,7 +808,6 @@ static void seat_configure_pointer(struct sway_seat *seat,
}
wlr_cursor_attach_input_device(seat->cursor->cursor,
sway_device->input_device->wlr_device);
- seat_apply_input_mapping(seat, sway_device);
wl_event_source_timer_update(
seat->cursor->hide_source, cursor_get_timeout(seat->cursor));
}
@@ -841,7 +849,6 @@ static void seat_configure_touch(struct sway_seat *seat,
struct sway_seat_device *sway_device) {
wlr_cursor_attach_input_device(seat->cursor->cursor,
sway_device->input_device->wlr_device);
- seat_apply_input_mapping(seat, sway_device);
}
static void seat_configure_tablet_tool(struct sway_seat *seat,
@@ -852,7 +859,6 @@ static void seat_configure_tablet_tool(struct sway_seat *seat,
sway_configure_tablet(sway_device->tablet);
wlr_cursor_attach_input_device(seat->cursor->cursor,
sway_device->input_device->wlr_device);
- seat_apply_input_mapping(seat, sway_device);
}
static void seat_configure_tablet_pad(struct sway_seat *seat,
@@ -909,6 +915,18 @@ void seat_configure_device(struct sway_seat *seat,
seat_configure_tablet_pad(seat, seat_device);
break;
}
+
+ seat_apply_input_mapping(seat, seat_device);
+}
+
+void seat_configure_device_mapping(struct sway_seat *seat,
+ struct sway_input_device *input_device) {
+ struct sway_seat_device *seat_device = seat_get_device(seat, input_device);
+ if (!seat_device) {
+ return;
+ }
+
+ seat_apply_input_mapping(seat, seat_device);
}
void seat_reset_device(struct sway_seat *seat,