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.
This commit is contained in:
Simon Ser 2023-11-16 14:56:46 +01:00 committed by Kenny Levinsen
parent caa92ddee8
commit 7036769bea
6 changed files with 38 additions and 5 deletions

View file

@ -47,6 +47,8 @@ void input_manager_apply_input_config(struct input_config *input_config);
void input_manager_configure_all_inputs(void); void input_manager_configure_all_inputs(void);
void input_manager_configure_all_input_mappings(void);
void input_manager_reset_input(struct sway_input_device *input_device); void input_manager_reset_input(struct sway_input_device *input_device);
void input_manager_reset_all_inputs(void); void input_manager_reset_all_inputs(void);

View file

@ -168,6 +168,9 @@ void seat_add_device(struct sway_seat *seat,
void seat_configure_device(struct sway_seat *seat, void seat_configure_device(struct sway_seat *seat,
struct sway_input_device *device); struct sway_input_device *device);
void seat_configure_device_mapping(struct sway_seat *seat,
struct sway_input_device *input_device);
void seat_reset_device(struct sway_seat *seat, void seat_reset_device(struct sway_seat *seat,
struct sway_input_device *input_device); struct sway_input_device *input_device);

View file

@ -590,7 +590,7 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output) {
// Reconfigure all devices, since input config may have been applied before // Reconfigure all devices, since input config may have been applied before
// this output came online, and some config items (like map_to_output) are // this output came online, and some config items (like map_to_output) are
// dependent on an output being present. // dependent on an output being present.
input_manager_configure_all_inputs(); input_manager_configure_all_input_mappings();
// Reconfigure the cursor images, since the scale may have changed. // Reconfigure the cursor images, since the scale may have changed.
input_manager_configure_xcursor(); input_manager_configure_xcursor();
return true; return true;

View file

@ -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) { void input_manager_apply_input_config(struct input_config *input_config) {
struct sway_input_device *input_device = NULL; struct sway_input_device *input_device = NULL;
bool wildcard = strcmp(input_config->identifier, "*") == 0; bool wildcard = strcmp(input_config->identifier, "*") == 0;

View file

@ -710,6 +710,15 @@ static void seat_apply_input_mapping(struct sway_seat *seat,
struct input_config *ic = struct input_config *ic =
input_device_get_config(sway_device->input_device); 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_log(SWAY_DEBUG, "Applying input mapping to %s",
sway_device->input_device->identifier); 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, wlr_cursor_attach_input_device(seat->cursor->cursor,
sway_device->input_device->wlr_device); sway_device->input_device->wlr_device);
seat_apply_input_mapping(seat, sway_device);
wl_event_source_timer_update( wl_event_source_timer_update(
seat->cursor->hide_source, cursor_get_timeout(seat->cursor)); 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) { struct sway_seat_device *sway_device) {
wlr_cursor_attach_input_device(seat->cursor->cursor, wlr_cursor_attach_input_device(seat->cursor->cursor,
sway_device->input_device->wlr_device); sway_device->input_device->wlr_device);
seat_apply_input_mapping(seat, sway_device);
} }
static void seat_configure_tablet_tool(struct sway_seat *seat, 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); sway_configure_tablet(sway_device->tablet);
wlr_cursor_attach_input_device(seat->cursor->cursor, wlr_cursor_attach_input_device(seat->cursor->cursor,
sway_device->input_device->wlr_device); sway_device->input_device->wlr_device);
seat_apply_input_mapping(seat, sway_device);
} }
static void seat_configure_tablet_pad(struct sway_seat *seat, 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); seat_configure_tablet_pad(seat, seat_device);
break; 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, void seat_reset_device(struct sway_seat *seat,

View file

@ -277,7 +277,7 @@ void output_disable(struct sway_output *output) {
// Reconfigure all devices, since devices with map_to_output directives for // Reconfigure all devices, since devices with map_to_output directives for
// an output that goes offline should stop sending events as long as the // an output that goes offline should stop sending events as long as the
// output remains offline. // output remains offline.
input_manager_configure_all_inputs(); input_manager_configure_all_input_mappings();
} }
void output_begin_destroy(struct sway_output *output) { void output_begin_destroy(struct sway_output *output) {