From c0ee2a64065f3a9953e977e517a466361444c144 Mon Sep 17 00:00:00 2001 From: Luminarys Date: Mon, 10 Aug 2015 13:53:43 -0500 Subject: [PATCH] Added in reload and exec_always handling --- sway/commands.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++- sway/config.c | 9 ++++++++- sway/config.h | 4 +++- sway/main.c | 3 ++- 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/sway/commands.c b/sway/commands.c index 64130fdcb..df394901e 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,31 @@ 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 1 arguments, got %d)", argc); + return 1; + } + + // 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, true); + fclose(f); + + 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 +279,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/config.c b/sway/config.c index 26dc88cbb..ee6c324c0 100644 --- a/sway/config.c +++ b/sway/config.c @@ -18,12 +18,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 @@ -56,6 +61,8 @@ _continue: exit(1); } + config->reloading = false; + return config; } diff --git a/sway/config.h b/sway/config.h index 6802a3418..6a50c4454 100644 --- a/sway/config.h +++ b/sway/config.h @@ -29,9 +29,11 @@ struct sway_config { // Flags bool focus_follows_mouse; bool mouse_warping; + + bool reloading; }; -struct sway_config *read_config(FILE *file); +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/main.c b/sway/main.c index 248beae71..298e530d9 100644 --- a/sway/main.c +++ b/sway/main.c @@ -23,7 +23,7 @@ void load_config() { exit(1); } free(temp); - config = read_config(f); + config = read_config(f, false); fclose(f); } @@ -52,6 +52,7 @@ int main(int argc, char **argv) { .motion = handle_pointer_motion, .button = handle_pointer_button } + }; setenv("WLC_DIM", "0", 0);