From 1bbca68cffc6df0a420aa58988335627d33cb8e9 Mon Sep 17 00:00:00 2001 From: iguanajuice Date: Tue, 30 Jul 2024 20:10:53 -0400 Subject: [PATCH] Replace expensive seat_get_config() functions with pointer --- include/sway/input/cursor.h | 4 ---- include/sway/input/seat.h | 5 +---- sway/commands/seat/hide_cursor.c | 6 ------ sway/input/cursor.c | 29 ++++--------------------- sway/input/input-manager.c | 36 ++++++++++++++++---------------- sway/input/keyboard.c | 11 ++-------- sway/input/seat.c | 35 ++++--------------------------- 7 files changed, 29 insertions(+), 97 deletions(-) diff --git a/include/sway/input/cursor.h b/include/sway/input/cursor.h index 527d0350..d0da0641 100644 --- a/include/sway/input/cursor.h +++ b/include/sway/input/cursor.h @@ -74,10 +74,6 @@ struct sway_cursor { struct wl_event_source *hide_source; bool hidden; - // This field is just a cache of the field in seat_config in order to avoid - // costly seat_config lookups on every keypress. HIDE_WHEN_TYPING_DEFAULT - // indicates that there is no cached value. - enum seat_config_hide_cursor_when_typing hide_when_typing; size_t pressed_button_count; }; diff --git a/include/sway/input/seat.h b/include/sway/input/seat.h index 428f9679..0adec3e1 100644 --- a/include/sway/input/seat.h +++ b/include/sway/input/seat.h @@ -83,6 +83,7 @@ struct sway_drag { struct sway_seat { struct wlr_seat *wlr_seat; struct sway_cursor *cursor; + struct seat_config *config; // Seat scene tree structure // - scene_tree @@ -243,10 +244,6 @@ void seat_for_each_node(struct sway_seat *seat, void seat_apply_config(struct sway_seat *seat, struct seat_config *seat_config); -struct seat_config *seat_get_config(struct sway_seat *seat); - -struct seat_config *seat_get_config_by_name(const char *name); - void seat_idle_notify_activity(struct sway_seat *seat, enum sway_input_idle_source source); diff --git a/sway/commands/seat/hide_cursor.c b/sway/commands/seat/hide_cursor.c index f5177a47..2ad74e7b 100644 --- a/sway/commands/seat/hide_cursor.c +++ b/sway/commands/seat/hide_cursor.c @@ -37,12 +37,6 @@ struct cmd_results *seat_cmd_hide_cursor(int argc, char **argv) { } seat_config->hide_cursor_when_typing = parse_boolean(argv[1], true) ? HIDE_WHEN_TYPING_ENABLE : HIDE_WHEN_TYPING_DISABLE; - - // Invalidate all the caches for this config - struct sway_seat *seat = NULL; - wl_list_for_each(seat, &server.input->seats, link) { - seat->cursor->hide_when_typing = HIDE_WHEN_TYPING_DEFAULT; - } } return cmd_results_new(CMD_SUCCESS, NULL); diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 235951d4..f7f03857 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -198,10 +198,8 @@ int cursor_get_timeout(struct sway_cursor *cursor) { return 0; } - struct seat_config *sc = seat_get_config(cursor->seat); - if (!sc) { - sc = seat_get_config_by_name("*"); - } + struct seat_config *sc = cursor->seat->config; + int timeout = sc ? sc->hide_cursor_timeout : 0; if (timeout < 0) { timeout = 0; @@ -214,23 +212,7 @@ void cursor_notify_key_press(struct sway_cursor *cursor) { return; } - if (cursor->hide_when_typing == HIDE_WHEN_TYPING_DEFAULT) { - // No cached value, need to lookup in the seat_config - const struct seat_config *seat_config = seat_get_config(cursor->seat); - if (!seat_config) { - seat_config = seat_get_config_by_name("*"); - if (!seat_config) { - return; - } - } - cursor->hide_when_typing = seat_config->hide_cursor_when_typing; - // The default is currently disabled - if (cursor->hide_when_typing == HIDE_WHEN_TYPING_DEFAULT) { - cursor->hide_when_typing = HIDE_WHEN_TYPING_DISABLE; - } - } - - if (cursor->hide_when_typing == HIDE_WHEN_TYPING_ENABLE) { + if (cursor->seat->config->hide_cursor_when_typing == HIDE_WHEN_TYPING_ENABLE) { cursor_hide(cursor); } } @@ -1339,10 +1321,7 @@ void handle_pointer_constraint(struct wl_listener *listener, void *data) { void sway_cursor_constrain(struct sway_cursor *cursor, struct wlr_pointer_constraint_v1 *constraint) { - struct seat_config *config = seat_get_config(cursor->seat); - if (!config) { - config = seat_get_config_by_name("*"); - } + struct seat_config *config = cursor->seat->config; if (!config || config->allow_constrain == CONSTRAIN_DISABLE) { return; diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index 248ca34e..e6922170 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -175,7 +175,15 @@ static struct sway_input_device *input_sway_device_from_wlr( static bool input_has_seat_fallback_configuration(void) { struct sway_seat *seat = NULL; wl_list_for_each(seat, &server.input->seats, link) { - struct seat_config *seat_config = seat_get_config(seat); + struct seat_config *seat_config = NULL; + struct seat_config *sc = NULL; + for (int i = 0; i < config->seat_configs->length; ++i ) { + sc = config->seat_configs->items[i]; + if (strcmp(seat->wlr_seat->name, sc->name) == 0) { + seat_config = sc; + break; + } + } if (seat_config && strcmp(seat_config->name, "*") != 0 && seat_config->fallback != -1) { return true; @@ -257,10 +265,9 @@ static void handle_new_input(struct wl_listener *listener, void *data) { bool added = false; struct sway_seat *seat = NULL; wl_list_for_each(seat, &input->seats, link) { - struct seat_config *seat_config = seat_get_config(seat); - bool has_attachment = seat_config && - (seat_config_get_attachment(seat_config, input_device->identifier) || - seat_config_get_attachment(seat_config, "*")); + bool has_attachment = seat->config && + (seat_config_get_attachment(seat->config, input_device->identifier) || + seat_config_get_attachment(seat->config, "*")); if (has_attachment) { seat_add_device(seat, input_device); @@ -270,8 +277,7 @@ static void handle_new_input(struct wl_listener *listener, void *data) { if (!added) { wl_list_for_each(seat, &input->seats, link) { - struct seat_config *seat_config = seat_get_config(seat); - if (seat_config && seat_config->fallback == 1) { + if (seat->config && seat->config->fallback == 1) { seat_add_device(seat, input_device); added = true; } @@ -336,13 +342,8 @@ static void handle_keyboard_shortcuts_inhibit_new_inhibitor( } if (inhibit == SHORTCUTS_INHIBIT_DEFAULT) { - struct seat_config *config = seat_get_config(seat); - if (!config) { - config = seat_get_config_by_name("*"); - } - - if (config) { - inhibit = config->shortcuts_inhibit; + if (seat->config) { + inhibit = seat->config->shortcuts_inhibit; } } @@ -633,7 +634,7 @@ void input_manager_apply_seat_config(struct seat_config *seat_config) { wl_list_for_each(seat, &server.input->seats, link) { // Only apply the wildcard config directly if there is no seat // specific config - struct seat_config *sc = seat_get_config(seat); + struct seat_config *sc = seat->config; if (!sc) { sc = seat_config; } @@ -655,7 +656,7 @@ void input_manager_apply_seat_config(struct seat_config *seat_config) { list_t *seat_list = create_list(); struct sway_seat *seat = NULL; wl_list_for_each(seat, &server.input->seats, link) { - struct seat_config *seat_config = seat_get_config(seat); + struct seat_config *seat_config = seat->config; if (!seat_config) { continue; } @@ -683,8 +684,7 @@ void input_manager_apply_seat_config(struct seat_config *seat_config) { } } else { wl_list_for_each(seat, &server.input->seats, link) { - struct seat_config *seat_config = seat_get_config(seat); - if (seat_config && seat_config->fallback == 1) { + if (seat->config && seat->config->fallback == 1) { seat_add_device(seat, input_device); } else { seat_remove_device(seat, input_device); diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index efb9ac39..2d3f83d3 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -831,10 +831,7 @@ static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) { } struct sway_seat *seat = keyboard->seat_device->sway_seat; - struct seat_config *sc = seat_get_config(seat); - if (!sc) { - sc = seat_get_config_by_name("*"); - } + struct seat_config *sc = seat->config; switch (sc ? sc->keyboard_grouping : KEYBOARD_GROUP_DEFAULT) { case KEYBOARD_GROUP_NONE: @@ -854,17 +851,13 @@ static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) { static void sway_keyboard_group_add(struct sway_keyboard *keyboard) { struct sway_input_device *device = keyboard->seat_device->input_device; struct sway_seat *seat = keyboard->seat_device->sway_seat; - struct seat_config *sc = seat_get_config(seat); + struct seat_config *sc = seat->config; if (device->is_virtual) { // Virtual devices should not be grouped return; } - if (!sc) { - sc = seat_get_config_by_name("*"); - } - if (sc && sc->keyboard_grouping == KEYBOARD_GROUP_NONE) { // Keyboard grouping is disabled for the seat return; diff --git a/sway/input/seat.c b/sway/input/seat.c index 9a00a3e2..0fc899bc 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -984,13 +984,9 @@ void seat_configure_xcursor(struct sway_seat *seat) { unsigned cursor_size = 24; const char *cursor_theme = NULL; - const struct seat_config *seat_config = seat_get_config(seat); - if (!seat_config) { - seat_config = seat_get_config_by_name("*"); - } - if (seat_config) { - cursor_size = seat_config->xcursor_theme.size; - cursor_theme = seat_config->xcursor_theme.name; + if (seat->config) { + cursor_size = seat->config->xcursor_theme.size; + cursor_theme = seat->config->xcursor_theme.name; } if (seat == input_manager_get_default_seat()) { @@ -1493,6 +1489,7 @@ void seat_apply_config(struct sway_seat *seat, return; } + seat->config = seat_config; seat->idle_inhibit_sources = seat_config->idle_inhibit_sources; seat->idle_wake_sources = seat_config->idle_wake_sources; @@ -1503,30 +1500,6 @@ void seat_apply_config(struct sway_seat *seat, } } -struct seat_config *seat_get_config(struct sway_seat *seat) { - struct seat_config *seat_config = NULL; - for (int i = 0; i < config->seat_configs->length; ++i ) { - seat_config = config->seat_configs->items[i]; - if (strcmp(seat->wlr_seat->name, seat_config->name) == 0) { - return seat_config; - } - } - - return NULL; -} - -struct seat_config *seat_get_config_by_name(const char *name) { - struct seat_config *seat_config = NULL; - for (int i = 0; i < config->seat_configs->length; ++i ) { - seat_config = config->seat_configs->items[i]; - if (strcmp(name, seat_config->name) == 0) { - return seat_config; - } - } - - return NULL; -} - void seat_pointer_notify_button(struct sway_seat *seat, uint32_t time_msec, uint32_t button, enum wl_pointer_button_state state) { seat->last_button_serial = wlr_seat_pointer_notify_button(seat->wlr_seat,