diff options
Diffstat (limited to 'sway/config.c')
-rw-r--r-- | sway/config.c | 104 |
1 files changed, 40 insertions, 64 deletions
diff --git a/sway/config.c b/sway/config.c index bd282541..4464b006 100644 --- a/sway/config.c +++ b/sway/config.c @@ -25,6 +25,7 @@ #include "sway/commands.h" #include "sway/config.h" #include "sway/criteria.h" +#include "sway/swaynag.h" #include "sway/tree/arrange.h" #include "sway/tree/layout.h" #include "sway/tree/workspace.h" @@ -72,6 +73,8 @@ void free_config(struct sway_config *config) { memset(&config->handler_context, 0, sizeof(config->handler_context)); + free(config->swaynag_command); + // TODO: handle all currently unhandled lists as we add implementations if (config->symbols) { for (int i = 0; i < config->symbols->length; ++i) { @@ -158,7 +161,17 @@ static void set_color(float dest[static 4], uint32_t color) { } static void config_defaults(struct sway_config *config) { - config->swaynag_pid = -1; + config->swaynag_command = strdup("swaynag"); + config->swaynag_config_errors = (struct swaynag_instance){ + .args = "--type error " + "--message 'There are errors in your config file' " + "--detailed-message " + "--button 'Exit sway' 'swaymsg exit' " + "--button 'Reload sway' 'swaymsg reload'", + .pid = -1, + .detailed = true, + }; + if (!(config->symbols = create_list())) goto cleanup; if (!(config->modes = create_list())) goto cleanup; if (!(config->bars = create_list())) goto cleanup; @@ -205,6 +218,7 @@ static void config_defaults(struct sway_config *config) { config->focus_follows_mouse = true; config->mouse_warping = true; config->focus_wrapping = WRAP_YES; + config->validating = false; config->reloading = false; config->active = false; config->failed = false; @@ -321,7 +335,7 @@ static char *get_config_path(void) { } static bool load_config(const char *path, struct sway_config *config, - char **errors) { + struct swaynag_instance *swaynag) { if (path == NULL) { wlr_log(WLR_ERROR, "Unable to find a config file!"); return false; @@ -340,7 +354,7 @@ static bool load_config(const char *path, struct sway_config *config, return false; } - bool config_load_success = read_config(f, config, errors); + bool config_load_success = read_config(f, config, swaynag); fclose(f); if (!config_load_success) { @@ -350,7 +364,7 @@ static bool load_config(const char *path, struct sway_config *config, return true; } -bool load_main_config(const char *file, bool is_active, char **errors) { +bool load_main_config(const char *file, bool is_active, bool validating) { char *path; if (file != NULL) { path = strdup(file); @@ -365,11 +379,16 @@ bool load_main_config(const char *file, bool is_active, char **errors) { } config_defaults(config); + config->validating = validating; if (is_active) { wlr_log(WLR_DEBUG, "Performing configuration file reload"); - config->swaynag_pid = old_config->swaynag_pid; config->reloading = true; config->active = true; + + swaynag_kill(&old_config->swaynag_config_errors); + swaynag_clone(&config->swaynag_config_errors, + &old_config->swaynag_config_errors); + create_default_output_configs(); } @@ -426,13 +445,17 @@ bool load_main_config(const char *file, bool is_active, char **errors) { } */ - success = success && load_config(path, config, errors); + success = success && load_config(path, config, + &config->swaynag_config_errors); if (is_active) { for (int i = 0; i < config->output_configs->length; i++) { apply_output_config_to_outputs(config->output_configs->items[i]); } config->reloading = false; + if (config->swaynag_config_errors.pid > 0) { + swaynag_show(&config->swaynag_config_errors); + } } if (old_config) { @@ -444,7 +467,7 @@ bool load_main_config(const char *file, bool is_active, char **errors) { } static bool load_include_config(const char *path, const char *parent_dir, - struct sway_config *config, char **errors) { + struct sway_config *config, struct swaynag_instance *swaynag) { // save parent config const char *parent_config = config->current_config_path; @@ -488,7 +511,7 @@ static bool load_include_config(const char *path, const char *parent_dir, list_add(config->config_chain, real_path); int index = config->config_chain->length - 1; - if (!load_config(real_path, config, errors)) { + if (!load_config(real_path, config, swaynag)) { free(real_path); config->current_config_path = parent_config; list_del(config->config_chain, index); @@ -501,7 +524,7 @@ static bool load_include_config(const char *path, const char *parent_dir, } bool load_include_configs(const char *path, struct sway_config *config, - char **errors) { + struct swaynag_instance *swaynag) { char *wd = getcwd(NULL, 0); char *parent_path = strdup(config->current_config_path); const char *parent_dir = dirname(parent_path); @@ -523,7 +546,7 @@ bool load_include_configs(const char *path, struct sway_config *config, char **w = p.we_wordv; size_t i; for (i = 0; i < p.we_wordc; ++i) { - load_include_config(w[i], parent_dir, config, errors); + load_include_config(w[i], parent_dir, config, swaynag); } free(parent_path); wordfree(&p); @@ -579,26 +602,8 @@ static char *expand_line(const char *block, const char *line, bool add_brace) { return expanded; } -static void log_error(char **errors, const char *fmt, ...) { - va_list args; - va_start(args, fmt); - size_t length = vsnprintf(NULL, 0, fmt, args) + 1; - va_end(args); - - int offset = *errors ? strlen(*errors) : 0; - char *temp = realloc(*errors, offset + length + 1); - if (!temp) { - wlr_log(WLR_ERROR, "Failed to realloc error log"); - return; - } - *errors = temp; - - va_start(args, fmt); - vsnprintf(*errors + offset, length, fmt, args); - va_end(args); -} - -bool read_config(FILE *file, struct sway_config *config, char **errors) { +bool read_config(FILE *file, struct sway_config *config, + struct swaynag_instance *swaynag) { bool reading_main_config = false; char *this_config = NULL; size_t config_size = 0; @@ -688,8 +693,11 @@ bool read_config(FILE *file, struct sway_config *config, char **errors) { case CMD_INVALID: wlr_log(WLR_ERROR, "Error on line %i '%s': %s (%s)", line_number, line, res->error, config->current_config_path); - log_error(errors, "Error on line %i (%s) '%s': %s\n", line_number, - config->current_config_path, line, res->error); + if (!config->validating) { + swaynag_log(config->swaynag_command, swaynag, + "Error on line %i (%s) '%s': %s", line_number, + config->current_config_path, line, res->error); + } success = false; break; @@ -738,38 +746,6 @@ bool read_config(FILE *file, struct sway_config *config, char **errors) { return success; } -void spawn_swaynag_config_errors(struct sway_config *config, char *errors) { - char *command = "swaynag " - "--type error " - "--message 'There are errors in your config file' " - "--detailed-message " - "--button 'Exit sway' 'swaymsg exit' " - "--button 'Reload sway' 'swaymsg reload'"; - - int fd[2]; - if (pipe(fd) != 0) { - wlr_log(WLR_ERROR, "Failed to create pipe for swaynag"); - return; - } - - pid_t pid; - if ((pid = fork()) == 0) { - close(fd[1]); - dup2(fd[0], STDIN_FILENO); - close(fd[0]); - execl("/bin/sh", "/bin/sh", "-c", command, NULL); - _exit(0); - } else if (pid < 0) { - wlr_log(WLR_ERROR, "Failed to create fork for swaynag"); - } - - close(fd[0]); - write(fd[1], errors, strlen(errors)); - close(fd[1]); - - config->swaynag_pid = pid; -} - char *do_var_replacement(char *str) { int i; char *find = str; |