diff --git a/include/sway/config.h b/include/sway/config.h index 8215ff59d..d5467a568 100644 --- a/include/sway/config.h +++ b/include/sway/config.h @@ -515,6 +515,11 @@ bool load_include_configs(const char *path, struct sway_config *config, bool read_config(FILE *file, struct sway_config *config, struct swaynag_instance *swaynag); +/** + * Run the commands that were deferred when reading the config file. + */ +void run_deferred_commands(void); + /** * Adds a warning entry to the swaynag instance used for errors. */ diff --git a/sway/config.c b/sway/config.c index 145b3be6e..7cb27d955 100644 --- a/sway/config.c +++ b/sway/config.c @@ -20,6 +20,7 @@ #include "sway/commands.h" #include "sway/config.h" #include "sway/criteria.h" +#include "sway/desktop/transaction.h" #include "sway/swaynag.h" #include "sway/tree/arrange.h" #include "sway/tree/root.h" @@ -343,6 +344,7 @@ static bool load_config(const char *path, struct sway_config *config, struct stat sb; if (stat(path, &sb) == 0 && S_ISDIR(sb.st_mode)) { + sway_log(SWAY_ERROR, "%s is a directory not a config file", path); return false; } @@ -573,6 +575,29 @@ bool load_include_configs(const char *path, struct sway_config *config, return true; } +void run_deferred_commands(void) { + if (!config->cmd_queue->length) { + return; + } + sway_log(SWAY_DEBUG, "Running deferred commands"); + while (config->cmd_queue->length) { + char *line = config->cmd_queue->items[0]; + list_t *res_list = execute_command(line, NULL, NULL); + for (int i = 0; i < res_list->length; ++i) { + struct cmd_results *res = res_list->items[i]; + if (res->status != CMD_SUCCESS) { + sway_log(SWAY_ERROR, "Error on line '%s': %s", + line, res->error); + } + free_cmd_results(res); + } + list_del(config->cmd_queue, 0); + list_free(res_list); + free(line); + } + transaction_commit_dirty(); +} + // get line, with backslash continuation static ssize_t getline_with_cont(char **lineptr, size_t *line_size, FILE *file, int *nlines) { diff --git a/sway/main.c b/sway/main.c index c824a6fbd..a3198af10 100644 --- a/sway/main.c +++ b/sway/main.c @@ -16,7 +16,6 @@ #include "sway/commands.h" #include "sway/config.h" #include "sway/debug.h" -#include "sway/desktop/transaction.h" #include "sway/server.h" #include "sway/swaynag.h" #include "sway/tree/root.h" @@ -370,55 +369,33 @@ int main(int argc, char **argv) { setenv("WAYLAND_DISPLAY", server.socket, true); if (!load_main_config(config_path, false, false)) { sway_terminate(EXIT_FAILURE); + goto shutdown; } - if (config_path) { - free(config_path); - } - - if (!terminate_request) { - if (!server_start(&server)) { - sway_terminate(EXIT_FAILURE); - } + if (!server_start(&server)) { + sway_terminate(EXIT_FAILURE); + goto shutdown; } config->active = true; load_swaybars(); - // Execute commands until there are none left - sway_log(SWAY_DEBUG, "Running deferred commands"); - while (config->cmd_queue->length) { - char *line = config->cmd_queue->items[0]; - list_t *res_list = execute_command(line, NULL, NULL); - for (int i = 0; i < res_list->length; ++i) { - struct cmd_results *res = res_list->items[i]; - if (res->status != CMD_SUCCESS) { - sway_log(SWAY_ERROR, "Error on line '%s': %s", line, res->error); - } - free_cmd_results(res); - } - list_free(res_list); - free(line); - list_del(config->cmd_queue, 0); - } - transaction_commit_dirty(); + run_deferred_commands(); if (config->swaynag_config_errors.pid > 0) { swaynag_show(&config->swaynag_config_errors); } - if (!terminate_request) { - server_run(&server); - } + server_run(&server); +shutdown: sway_log(SWAY_INFO, "Shutting down sway"); server_fini(&server); root_destroy(root); root = NULL; - if (config) { - free_config(config); - } + free(config_path); + free_config(config); pango_cairo_font_map_set_default(NULL);