mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 05:13:10 +00:00
Migrate some env initialization into env_dispatch
This commit is contained in:
parent
b67174b4a3
commit
e7de9cc371
3 changed files with 33 additions and 35 deletions
|
@ -687,7 +687,6 @@ void env_init(const struct config_paths_t *paths /* or NULL */) {
|
||||||
init_curses(vars);
|
init_curses(vars);
|
||||||
init_input();
|
init_input();
|
||||||
init_path_vars();
|
init_path_vars();
|
||||||
guess_emoji_width();
|
|
||||||
|
|
||||||
// Set up the USER and PATH variables
|
// Set up the USER and PATH variables
|
||||||
setup_path();
|
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);
|
vars.set_one(FISH_BIND_MODE_VAR, ENV_GLOBAL, DEFAULT_BIND_MODE);
|
||||||
|
|
||||||
// Allow changes to variables to produce events.
|
// 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.
|
// Set up universal variables. The empty string means to use the default path.
|
||||||
assert(s_universal_variables == NULL);
|
assert(s_universal_variables == NULL);
|
||||||
|
|
|
@ -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
|
// return a new-ly allocated dispatch table, running those dispatch functions which should be
|
||||||
// initialized.
|
// initialized.
|
||||||
static std::unique_ptr<const var_dispatch_table_t> create_dispatch_table();
|
static std::unique_ptr<const var_dispatch_table_t> create_dispatch_table();
|
||||||
|
@ -128,7 +131,12 @@ static std::unique_ptr<const var_dispatch_table_t> create_dispatch_table();
|
||||||
// avoid shutdown destructors. This is set during startup and should not be modified after.
|
// avoid shutdown destructors. This is set during startup and should not be modified after.
|
||||||
static const var_dispatch_table_t *s_var_dispatch_table;
|
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.
|
/// Properly sets all timezone information.
|
||||||
static void handle_timezone(const wchar_t *env_var_name, const environment_t &vars) {
|
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
|
/// 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;
|
wcstring term;
|
||||||
auto &vars = env_stack_t::globals();
|
|
||||||
if (auto term_var = vars.get(L"TERM_PROGRAM")) {
|
if (auto term_var = vars.get(L"TERM_PROGRAM")) {
|
||||||
term = term_var->as_string();
|
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();
|
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,
|
static void handle_change_ambiguous_width(const wcstring &op, const wcstring &var_name,
|
||||||
env_stack_t &vars) {
|
env_stack_t &vars) {
|
||||||
(void)op;
|
(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);
|
fix_colon_delimited_var(var_name, vars);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_locale_change(const wcstring &op, const wcstring &var_name, env_stack_t &vars) {
|
static void handle_locale_change(const environment_t &vars) {
|
||||||
UNUSED(op);
|
|
||||||
UNUSED(var_name);
|
|
||||||
init_locale(vars);
|
init_locale(vars);
|
||||||
// We need to re-guess emoji width because the locale might have changed to a multibyte one.
|
// 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) {
|
static void handle_curses_change(const environment_t &vars) {
|
||||||
UNUSED(op);
|
guess_emoji_width(vars);
|
||||||
UNUSED(var_name);
|
|
||||||
guess_emoji_width();
|
|
||||||
init_curses(vars);
|
init_curses(vars);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,8 +317,8 @@ static std::unique_ptr<const var_dispatch_table_t> create_dispatch_table() {
|
||||||
var_dispatch_table->add(L"CDPATH", handle_magic_colon_var_change);
|
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_term256", handle_fish_term_change);
|
||||||
var_dispatch_table->add(L"fish_term24bit", 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_escape_delay_ms", update_wait_on_escape_ms);
|
||||||
var_dispatch_table->add(L"fish_emoji_width", handle_change_emoji_width);
|
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"fish_ambiguous_width", handle_change_ambiguous_width);
|
||||||
var_dispatch_table->add(L"LINES", handle_term_size_change);
|
var_dispatch_table->add(L"LINES", handle_term_size_change);
|
||||||
var_dispatch_table->add(L"COLUMNS", handle_term_size_change);
|
var_dispatch_table->add(L"COLUMNS", handle_term_size_change);
|
||||||
|
@ -338,3 +329,10 @@ static std::unique_ptr<const var_dispatch_table_t> create_dispatch_table() {
|
||||||
var_dispatch_table->add(L"TZ", handle_tz_change);
|
var_dispatch_table->add(L"TZ", handle_tz_change);
|
||||||
return var_dispatch_table;
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -10,7 +10,8 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
/// Initialize variable dispatch.
|
/// Initialize variable dispatch.
|
||||||
void env_dispatch_init();
|
class environment_t;
|
||||||
|
void env_dispatch_init(const environment_t &vars);
|
||||||
|
|
||||||
class env_stack_t;
|
class env_stack_t;
|
||||||
void env_dispatch_var_change(const wchar_t *op, const wcstring &key, env_stack_t &vars);
|
void env_dispatch_var_change(const wchar_t *op, const wcstring &key, env_stack_t &vars);
|
||||||
|
|
Loading…
Reference in a new issue