diff --git a/sway/commands.c b/sway/commands.c index 64130fdcb..4db254b65 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -39,7 +39,7 @@ int cmd_bindsym(struct sway_config *config, int argc, char **argv) { binding->keys = create_list(); binding->modifiers = 0; binding->command = join_args(argv + 1, argc - 1); - + list_t *split = split_string(argv[0], "+"); int i; for (i = 0; i < split->length; ++i) { @@ -78,6 +78,28 @@ int cmd_exec(struct sway_config *config, int argc, char **argv) { sway_log(L_ERROR, "Invalid exec command (expected at least 1 argument, got %d)", argc); return 1; } + + if (config->reloading) { + sway_log(L_DEBUG, "Ignoring exec %s due to reload", join_args(argv, argc)); + return 0; + } + + if (fork() == 0) { + char *args = join_args(argv, argc); + sway_log(L_DEBUG, "Executing %s", args); + execl("/bin/sh", "sh", "-c", args, (char *)NULL); + free(args); + exit(0); + } + return 0; +} + +int cmd_exec_always(struct sway_config *config, int argc, char **argv) { + if (argc < 1) { + sway_log(L_ERROR, "Invalid exec_always command (expected at least 1 argument, got %d)", argc); + return 1; + } + if (fork() == 0) { char *args = join_args(argv, argc); sway_log(L_DEBUG, "Executing %s", args); @@ -152,6 +174,18 @@ int cmd_layout(struct sway_config *config, int argc, char **argv) { return 0; } +int cmd_reload(struct sway_config *config, int argc, char **argv) { + if (argc != 0) { + sway_log(L_ERROR, "Invalid reload command (expected 0 arguments, got %d)", argc); + return 1; + } + if (!load_config()) { + return 1; + } + + return 0; +} + int cmd_set(struct sway_config *config, int argc, char **argv) { if (argc != 2) { sway_log(L_ERROR, "Invalid set command (expected 2 arguments, got %d)", argc); @@ -232,12 +266,14 @@ int cmd_fullscreen(struct sway_config *config, int argc, char **argv) { struct cmd_handler handlers[] = { { "bindsym", cmd_bindsym }, { "exec", cmd_exec }, + { "exec_always", cmd_exec_always }, { "exit", cmd_exit }, { "focus", cmd_focus }, { "focus_follows_mouse", cmd_focus_follows_mouse }, { "fullscreen", cmd_fullscreen }, { "layout", cmd_layout }, { "log_colors", cmd_log_colors }, + { "reload", cmd_reload }, { "set", cmd_set }, { "splith", cmd_splith }, { "splitv", cmd_splitv } diff --git a/sway/commands.h b/sway/commands.h index f99a5201c..42b39f27e 100644 --- a/sway/commands.h +++ b/sway/commands.h @@ -4,8 +4,8 @@ #include "config.h" struct cmd_handler { - char *command; - int (*handle)(struct sway_config *config, int argc, char **argv); + char *command; + int (*handle)(struct sway_config *config, int argc, char **argv); }; int handle_command(struct sway_config *config, char *command); diff --git a/sway/config.c b/sway/config.c index 26dc88cbb..3c7badec5 100644 --- a/sway/config.c +++ b/sway/config.c @@ -8,6 +8,25 @@ #include "commands.h" #include "config.h" +bool load_config() { + // TODO: Allow use of more config file locations + const char *name = "/.sway/config"; + const char *home = getenv("HOME"); + char *temp = malloc(strlen(home) + strlen(name) + 1); + strcpy(temp, home); + strcat(temp, name); + FILE *f = fopen(temp, "r"); + if (!f) { + fprintf(stderr, "Unable to open %s for reading", temp); + free(temp); + return false; + } + free(temp); + config = read_config(f, false); + fclose(f); + return true; +} + void config_defaults(struct sway_config *config) { config->symbols = create_list(); config->modes = create_list(); @@ -18,12 +37,17 @@ void config_defaults(struct sway_config *config) { // Flags config->focus_follows_mouse = true; config->mouse_warping = true; + config->reloading = false; } -struct sway_config *read_config(FILE *file) { +struct sway_config *read_config(FILE *file, bool is_active) { struct sway_config *config = malloc(sizeof(struct sway_config)); config_defaults(config); + if (is_active) { + config->reloading = true; + } + bool success = true; int temp_depth = 0; // Temporary: skip all config sections with depth @@ -44,7 +68,7 @@ struct sway_config *read_config(FILE *file) { if (!temp_depth && handle_command(config, line) != 0) { success = false; } - + _continue: if (line && line[strlen(line) - 1] == '{') { temp_depth++; @@ -56,6 +80,10 @@ _continue: exit(1); } + if (is_active) { + config->reloading = true; + } + return config; } diff --git a/sway/config.h b/sway/config.h index 6802a3418..62b65723e 100644 --- a/sway/config.h +++ b/sway/config.h @@ -6,32 +6,35 @@ #include "list.h" struct sway_variable { - char *name; - char *value; + char *name; + char *value; }; struct sway_binding { - list_t *keys; - uint32_t modifiers; - char *command; + list_t *keys; + uint32_t modifiers; + char *command; }; struct sway_mode { - char *name; - list_t *bindings; + char *name; + list_t *bindings; }; struct sway_config { - list_t *symbols; - list_t *modes; - struct sway_mode *current_mode; + list_t *symbols; + list_t *modes; + struct sway_mode *current_mode; - // Flags - bool focus_follows_mouse; - bool mouse_warping; + // Flags + bool focus_follows_mouse; + bool mouse_warping; + + bool reloading; }; -struct sway_config *read_config(FILE *file); +bool load_config(); +struct sway_config *read_config(FILE *file, bool is_active); char *do_var_replacement(struct sway_config *config, char *str); extern struct sway_config *config; diff --git a/sway/layout.h b/sway/layout.h index b0aec42f0..3a8f89025 100644 --- a/sway/layout.h +++ b/sway/layout.h @@ -5,38 +5,38 @@ #include "list.h" struct sway_container { - wlc_handle handle; + wlc_handle handle; - enum { - C_ROOT, - C_OUTPUT, - C_WORKSPACE, - C_CONTAINER, - C_VIEW - } type; + enum { + C_ROOT, + C_OUTPUT, + C_WORKSPACE, + C_CONTAINER, + C_VIEW + } type; - enum { - L_NONE, - L_HORIZ, - L_VERT, - L_STACKED, - L_TABBED, - L_FLOATING - } layout; + enum { + L_NONE, + L_HORIZ, + L_VERT, + L_STACKED, + L_TABBED, + L_FLOATING + } layout; - // Not including borders or margins - int width, height; + // Not including borders or margins + int width, height; - int x, y; + int x, y; - int weight; + int weight; - char *name; + char *name; - list_t *children; + list_t *children; - struct sway_container *parent; - struct sway_container *focused; + struct sway_container *parent; + struct sway_container *focused; }; typedef struct sway_container swayc_t; diff --git a/sway/list.h b/sway/list.h index 93649fd5b..e035ec4c0 100644 --- a/sway/list.h +++ b/sway/list.h @@ -2,9 +2,9 @@ #define _SWAY_LIST_H typedef struct { - int capacity; - int length; - void **items; + int capacity; + int length; + void **items; } list_t; list_t *create_list(); diff --git a/sway/log.c b/sway/log.c index f439e3b28..188461eba 100644 --- a/sway/log.c +++ b/sway/log.c @@ -18,7 +18,7 @@ void init_log(int verbosity) { } void sway_log_colors(int mode) { - colored = (mode == 1) ? 1 : 0; + colored = (mode == 1) ? 1 : 0; } void sway_abort(char *format, ...) { diff --git a/sway/log.h b/sway/log.h index 038365133..e5075a39f 100644 --- a/sway/log.h +++ b/sway/log.h @@ -2,10 +2,10 @@ #define _SWAY_LOG_H typedef enum { - L_SILENT = 0, - L_ERROR = 1, - L_INFO = 2, - L_DEBUG = 3, + L_SILENT = 0, + L_ERROR = 1, + L_INFO = 2, + L_DEBUG = 3, } log_importance_t; void init_log(int verbosity); diff --git a/sway/main.c b/sway/main.c index 248beae71..900e6e5dc 100644 --- a/sway/main.c +++ b/sway/main.c @@ -9,24 +9,6 @@ struct sway_config *config; -void load_config() { - // TODO: Allow use of more config file locations - const char *name = "/.sway/config"; - const char *home = getenv("HOME"); - char *temp = malloc(strlen(home) + strlen(name) + 1); - strcpy(temp, home); - strcat(temp, name); - FILE *f = fopen(temp, "r"); - if (!f) { - fprintf(stderr, "Unable to open %s for reading", temp); - free(temp); - exit(1); - } - free(temp); - config = read_config(f); - fclose(f); -} - int main(int argc, char **argv) { init_log(L_DEBUG); // TODO: Control this with command line arg init_layout(); @@ -52,6 +34,7 @@ int main(int argc, char **argv) { .motion = handle_pointer_motion, .button = handle_pointer_button } + }; setenv("WLC_DIM", "0", 0); @@ -60,7 +43,9 @@ int main(int argc, char **argv) { } setenv("DISPLAY", ":1", 1); - load_config(); + if (load_config()) { + exit(1); + } wlc_run(); return 0;