From e7de9cc37109c4cb05dcbaa79abbe39b96ecf282 Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Sun, 31 Mar 2019 19:51:08 -0700 Subject: [PATCH] Migrate some env initialization into env_dispatch --- src/env.cpp | 3 +-- src/env_dispatch.cpp | 62 +++++++++++++++++++++----------------------- src/env_dispatch.h | 3 ++- 3 files changed, 33 insertions(+), 35 deletions(-) diff --git a/src/env.cpp b/src/env.cpp index c0a00fec7..a3aaf68d2 100644 --- a/src/env.cpp +++ b/src/env.cpp @@ -687,7 +687,6 @@ void env_init(const struct config_paths_t *paths /* or NULL */) { init_curses(vars); init_input(); init_path_vars(); - guess_emoji_width(); // Set up the USER and PATH variables setup_path(); @@ -789,7 +788,7 @@ void env_init(const struct config_paths_t *paths /* or NULL */) { vars.set_one(FISH_BIND_MODE_VAR, ENV_GLOBAL, DEFAULT_BIND_MODE); // Allow changes to variables to produce events. - env_dispatch_init(); + env_dispatch_init(vars); // Set up universal variables. The empty string means to use the default path. assert(s_universal_variables == NULL); diff --git a/src/env_dispatch.cpp b/src/env_dispatch.cpp index 74ca13788..ddadc8427 100644 --- a/src/env_dispatch.cpp +++ b/src/env_dispatch.cpp @@ -120,6 +120,9 @@ class var_dispatch_table_t { } }; +// Run those dispatch functions which want to be run at startup. +static void run_inits(const environment_t &vars); + // return a new-ly allocated dispatch table, running those dispatch functions which should be // initialized. static std::unique_ptr create_dispatch_table(); @@ -128,7 +131,12 @@ static std::unique_ptr create_dispatch_table(); // avoid shutdown destructors. This is set during startup and should not be modified after. static const var_dispatch_table_t *s_var_dispatch_table; -void env_dispatch_init() { s_var_dispatch_table = create_dispatch_table().release(); } +void env_dispatch_init(const environment_t &vars) { + run_inits(vars); + // Note this deliberately leaks; the dispatch table is immortal. + // Via this construct we can avoid invoking destructors at shutdown. + s_var_dispatch_table = create_dispatch_table().release(); +} /// Properly sets all timezone information. static void handle_timezone(const wchar_t *env_var_name, const environment_t &vars) { @@ -146,9 +154,15 @@ static void handle_timezone(const wchar_t *env_var_name, const environment_t &va } /// Update the value of g_guessed_fish_emoji_width -void guess_emoji_width() { +static void guess_emoji_width(const environment_t &vars) { + if (auto width_str = vars.get(L"fish_emoji_width")) { + int new_width = fish_wcstol(width_str->as_string().c_str()); + g_fish_emoji_width = std::max(0, new_width); + debug(2, "'fish_emoji_width' preference: %d, overwriting default", g_fish_emoji_width); + return; + } + wcstring term; - auto &vars = env_stack_t::globals(); if (auto term_var = vars.get(L"TERM_PROGRAM")) { term = term_var->as_string(); } @@ -215,25 +229,6 @@ static void handle_fish_term_change(const wcstring &op, const wcstring &var_name reader_react_to_color_change(); } -static void handle_escape_delay_change(const wcstring &op, const wcstring &var_name, - env_stack_t &vars) { - UNUSED(op); - UNUSED(var_name); - update_wait_on_escape_ms(vars); -} - -static void handle_change_emoji_width(const wcstring &op, const wcstring &var_name, - env_stack_t &vars) { - (void)op; - (void)var_name; - int new_width = 0; - if (auto width_str = vars.get(L"fish_emoji_width")) { - new_width = fish_wcstol(width_str->as_string().c_str()); - } - g_fish_emoji_width = std::max(0, new_width); - debug(2, "'fish_emoji_width' preference: %d, overwriting default", g_fish_emoji_width); -} - static void handle_change_ambiguous_width(const wcstring &op, const wcstring &var_name, env_stack_t &vars) { (void)op; @@ -294,18 +289,14 @@ static void handle_magic_colon_var_change(const wcstring &op, const wcstring &va fix_colon_delimited_var(var_name, vars); } -static void handle_locale_change(const wcstring &op, const wcstring &var_name, env_stack_t &vars) { - UNUSED(op); - UNUSED(var_name); +static void handle_locale_change(const environment_t &vars) { init_locale(vars); // We need to re-guess emoji width because the locale might have changed to a multibyte one. - guess_emoji_width(); + guess_emoji_width(vars); } -static void handle_curses_change(const wcstring &op, const wcstring &var_name, env_stack_t &vars) { - UNUSED(op); - UNUSED(var_name); - guess_emoji_width(); +static void handle_curses_change(const environment_t &vars) { + guess_emoji_width(vars); init_curses(vars); } @@ -326,8 +317,8 @@ static std::unique_ptr create_dispatch_table() { var_dispatch_table->add(L"CDPATH", handle_magic_colon_var_change); var_dispatch_table->add(L"fish_term256", handle_fish_term_change); var_dispatch_table->add(L"fish_term24bit", handle_fish_term_change); - var_dispatch_table->add(L"fish_escape_delay_ms", handle_escape_delay_change); - var_dispatch_table->add(L"fish_emoji_width", handle_change_emoji_width); + var_dispatch_table->add(L"fish_escape_delay_ms", update_wait_on_escape_ms); + var_dispatch_table->add(L"fish_emoji_width", guess_emoji_width); var_dispatch_table->add(L"fish_ambiguous_width", handle_change_ambiguous_width); var_dispatch_table->add(L"LINES", handle_term_size_change); var_dispatch_table->add(L"COLUMNS", handle_term_size_change); @@ -338,3 +329,10 @@ static std::unique_ptr create_dispatch_table() { var_dispatch_table->add(L"TZ", handle_tz_change); return var_dispatch_table; } + +static void run_inits(const environment_t &vars) { + // This is the subset of those dispatch functions which want to be run at startup. + handle_locale_change(vars); + handle_curses_change(vars); + update_wait_on_escape_ms(vars); +} diff --git a/src/env_dispatch.h b/src/env_dispatch.h index b862b7445..ca12cf97f 100644 --- a/src/env_dispatch.h +++ b/src/env_dispatch.h @@ -10,7 +10,8 @@ #include /// Initialize variable dispatch. -void env_dispatch_init(); +class environment_t; +void env_dispatch_init(const environment_t &vars); class env_stack_t; void env_dispatch_var_change(const wchar_t *op, const wcstring &key, env_stack_t &vars);