diff options
Diffstat (limited to 'sway/commands')
-rw-r--r-- | sway/commands/bar.c | 14 | ||||
-rw-r--r-- | sway/commands/bar/status_command.c | 18 | ||||
-rw-r--r-- | sway/commands/bind.c | 49 | ||||
-rw-r--r-- | sway/commands/client.c | 15 | ||||
-rw-r--r-- | sway/commands/opacity.c | 4 | ||||
-rw-r--r-- | sway/commands/popup_during_fullscreen.c | 25 | ||||
-rw-r--r-- | sway/commands/reload.c | 36 | ||||
-rw-r--r-- | sway/commands/seat/attach.c | 4 | ||||
-rw-r--r-- | sway/commands/seat/fallback.c | 4 | ||||
-rw-r--r-- | sway/commands/swaybg_command.c | 15 | ||||
-rw-r--r-- | sway/commands/swaynag_command.c | 15 | ||||
-rw-r--r-- | sway/commands/urgent.c | 3 |
12 files changed, 117 insertions, 85 deletions
diff --git a/sway/commands/bar.c b/sway/commands/bar.c index f760888e..03f4c557 100644 --- a/sway/commands/bar.c +++ b/sway/commands/bar.c @@ -46,14 +46,14 @@ struct cmd_results *cmd_bar(int argc, char **argv) { return error; } - if (!config->reading) { - if (!find_handler(argv[0], bar_config_handlers, - sizeof(bar_config_handlers))) { - return cmd_results_new(CMD_FAILURE, "bar", - "Can only be used in config file."); + if (find_handler(argv[0], bar_config_handlers, + sizeof(bar_config_handlers))) { + if (config->reading) { + return config_subcommand(argv, argc, bar_config_handlers, + sizeof(bar_config_handlers)); } - return config_subcommand(argv, argc, bar_config_handlers, - sizeof(bar_config_handlers)); + return cmd_results_new(CMD_FAILURE, "bar", + "Can only be used in config file."); } if (argc > 1) { diff --git a/sway/commands/bar/status_command.c b/sway/commands/bar/status_command.c index 6f6f81a3..5b4fdc87 100644 --- a/sway/commands/bar/status_command.c +++ b/sway/commands/bar/status_command.c @@ -13,8 +13,20 @@ struct cmd_results *bar_cmd_status_command(int argc, char **argv) { "status_command", "No bar defined."); } free(config->current_bar->status_command); - config->current_bar->status_command = join_args(argv, argc); - wlr_log(WLR_DEBUG, "Feeding bar with status command: %s", - config->current_bar->status_command); + config->current_bar->status_command = NULL; + + char *new_command = join_args(argv, argc); + if (strcmp(new_command, "-") != 0) { + config->current_bar->status_command = new_command; + wlr_log(WLR_DEBUG, "Feeding bar with status command: %s", + config->current_bar->status_command); + } else { + free(new_command); + } + + if (config->active && !config->validating) { + load_swaybars(); + } + return cmd_results_new(CMD_SUCCESS, NULL, NULL); } diff --git a/sway/commands/bind.c b/sway/commands/bind.c index 820c2a6a..701d9746 100644 --- a/sway/commands/bind.c +++ b/sway/commands/bind.c @@ -30,33 +30,6 @@ void free_sway_binding(struct sway_binding *binding) { free(binding); } -static struct sway_binding *sway_binding_dup(struct sway_binding *sb) { - struct sway_binding *new_sb = calloc(1, sizeof(struct sway_binding)); - if (!new_sb) { - return NULL; - } - - new_sb->type = sb->type; - new_sb->order = sb->order; - new_sb->flags = sb->flags; - new_sb->modifiers = sb->modifiers; - new_sb->command = strdup(sb->command); - - new_sb->keys = create_list(); - int i; - for (i = 0; i < sb->keys->length; ++i) { - xkb_keysym_t *key = malloc(sizeof(xkb_keysym_t)); - if (!key) { - free_sway_binding(new_sb); - return NULL; - } - *key = *(xkb_keysym_t *)sb->keys->items[i]; - list_add(new_sb->keys, key); - } - - return new_sb; -} - /** * Returns true if the bindings have the same key and modifier combinations. * Note that keyboard layout is not considered, so the bindings might actually @@ -214,9 +187,6 @@ static struct cmd_results *cmd_bindsym_or_bindcode(int argc, char **argv, } binding->command = join_args(argv + 1, argc - 1); - if (strcasestr(binding->command, "reload")) { - binding->flags |= BINDING_RELOAD; - } list_t *split = split_string(argv[0], "+"); for (int i = 0; i < split->length; ++i) { @@ -306,31 +276,16 @@ struct cmd_results *cmd_bindcode(int argc, char **argv) { * Execute the command associated to a binding */ void seat_execute_command(struct sway_seat *seat, struct sway_binding *binding) { - wlr_log(WLR_DEBUG, "running command for binding: %s", - binding->command); - - struct sway_binding *binding_copy = binding; - // if this is a reload command we need to make a duplicate of the - // binding since it will be gone after the reload has completed. - if (binding->flags & BINDING_RELOAD) { - binding_copy = sway_binding_dup(binding); - if (!binding_copy) { - wlr_log(WLR_ERROR, "Failed to duplicate binding during reload"); - return; - } - } + wlr_log(WLR_DEBUG, "running command for binding: %s", binding->command); config->handler_context.seat = seat; struct cmd_results *results = execute_command(binding->command, NULL, NULL); if (results->status == CMD_SUCCESS) { - ipc_event_binding(binding_copy); + ipc_event_binding(binding); } else { wlr_log(WLR_DEBUG, "could not run command for binding: %s (%s)", binding->command, results->error); } - if (binding_copy->flags & BINDING_RELOAD) { - free_sway_binding(binding_copy); - } free_cmd_results(results); } diff --git a/sway/commands/client.c b/sway/commands/client.c index 6e5f08a2..9f54fa94 100644 --- a/sway/commands/client.c +++ b/sway/commands/client.c @@ -64,27 +64,27 @@ static struct cmd_results *handle_command(int argc, char **argv, if (!parse_color_float(argv[0], class->border)) { return cmd_results_new(CMD_INVALID, cmd_name, - "Unable to parse border color"); + "Unable to parse border color '%s'", argv[0]); } if (!parse_color_float(argv[1], class->background)) { return cmd_results_new(CMD_INVALID, cmd_name, - "Unable to parse background color"); + "Unable to parse background color '%s'", argv[1]); } if (!parse_color_float(argv[2], class->text)) { return cmd_results_new(CMD_INVALID, cmd_name, - "Unable to parse text color"); + "Unable to parse text color '%s'", argv[2]); } if (!parse_color_float(argv[3], class->indicator)) { return cmd_results_new(CMD_INVALID, cmd_name, - "Unable to parse indicator color"); + "Unable to parse indicator color '%s'", argv[3]); } if (!parse_color_float(argv[4], class->child_border)) { return cmd_results_new(CMD_INVALID, cmd_name, - "Unable to parse child border color"); + "Unable to parse child border color '%s'", argv[4]); } if (config->active) { @@ -114,3 +114,8 @@ struct cmd_results *cmd_client_unfocused(int argc, char **argv) { struct cmd_results *cmd_client_urgent(int argc, char **argv) { return handle_command(argc, argv, &config->border_colors.urgent, "client.urgent"); } + +struct cmd_results *cmd_client_noop(int argc, char **argv) { + wlr_log(WLR_INFO, "Warning: %s is ignored by sway", argv[-1]); + return cmd_results_new(CMD_SUCCESS, NULL, NULL); +} diff --git a/sway/commands/opacity.c b/sway/commands/opacity.c index 9cdaad7f..4e4fc994 100644 --- a/sway/commands/opacity.c +++ b/sway/commands/opacity.c @@ -21,6 +21,10 @@ struct cmd_results *cmd_opacity(int argc, char **argv) { struct sway_container *con = config->handler_context.container; + if (con == NULL) { + return cmd_results_new(CMD_FAILURE, "opacity", "No current container"); + } + float opacity = 0.0f; if (!parse_opacity(argv[0], &opacity)) { diff --git a/sway/commands/popup_during_fullscreen.c b/sway/commands/popup_during_fullscreen.c new file mode 100644 index 00000000..da1904b6 --- /dev/null +++ b/sway/commands/popup_during_fullscreen.c @@ -0,0 +1,25 @@ +#include <strings.h> +#include "sway/commands.h" +#include "sway/config.h" + +struct cmd_results *cmd_popup_during_fullscreen(int argc, char **argv) { + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "popup_during_fullscreen", + EXPECTED_EQUAL_TO, 1))) { + return error; + } + + if (strcasecmp(argv[0], "smart") == 0) { + config->popup_during_fullscreen = POPUP_SMART; + } else if (strcasecmp(argv[0], "ignore") == 0) { + config->popup_during_fullscreen = POPUP_IGNORE; + } else if (strcasecmp(argv[0], "leave_fullscreen") == 0) { + config->popup_during_fullscreen = POPUP_LEAVE; + } else { + return cmd_results_new(CMD_INVALID, "popup_during_fullscreen", + "Expected " + "'popup_during_fullscreen smart|ignore|leave_fullscreen'"); + } + + return cmd_results_new(CMD_SUCCESS, NULL, NULL); +} diff --git a/sway/commands/reload.c b/sway/commands/reload.c index 36fb9092..9e136d48 100644 --- a/sway/commands/reload.c +++ b/sway/commands/reload.c @@ -3,15 +3,12 @@ #include "sway/commands.h" #include "sway/config.h" #include "sway/ipc-server.h" +#include "sway/server.h" #include "sway/tree/arrange.h" #include "list.h" +#include "log.h" -struct cmd_results *cmd_reload(int argc, char **argv) { - struct cmd_results *error = NULL; - if ((error = checkarg(argc, "reload", EXPECTED_EQUAL_TO, 0))) { - return error; - } - +static void do_reload(void *data) { // store bar ids to check against new bars for barconfig_update events list_t *bar_ids = create_list(); for (int i = 0; i < config->bars->length; ++i) { @@ -20,9 +17,12 @@ struct cmd_results *cmd_reload(int argc, char **argv) { } if (!load_main_config(config->current_config_path, true, false)) { - return cmd_results_new(CMD_FAILURE, "reload", - "Error(s) reloading config."); + wlr_log(WLR_ERROR, "Error(s) reloading config"); + list_foreach(bar_ids, free); + list_free(bar_ids); + return; } + ipc_event_workspace(NULL, NULL, "reload"); load_swaybars(); @@ -37,12 +37,26 @@ struct cmd_results *cmd_reload(int argc, char **argv) { } } - for (int i = 0; i < bar_ids->length; ++i) { - free(bar_ids->items[i]); - } + list_foreach(bar_ids, free); list_free(bar_ids); arrange_root(); +} + +struct cmd_results *cmd_reload(int argc, char **argv) { + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "reload", EXPECTED_EQUAL_TO, 0))) { + return error; + } + + if (!load_main_config(config->current_config_path, true, true)) { + return cmd_results_new(CMD_FAILURE, "reload", + "Error(s) reloading config."); + } + + // The reload command frees a lot of stuff, so to avoid use-after-frees + // we schedule the reload to happen using an idle event. + wl_event_loop_add_idle(server.wl_event_loop, do_reload, NULL); return cmd_results_new(CMD_SUCCESS, NULL, NULL); } diff --git a/sway/commands/seat/attach.c b/sway/commands/seat/attach.c index 3e771c00..6b4bcf1f 100644 --- a/sway/commands/seat/attach.c +++ b/sway/commands/seat/attach.c @@ -23,6 +23,8 @@ struct cmd_results *seat_cmd_attach(int argc, char **argv) { new_attachment->identifier = strdup(argv[0]); list_add(new_config->attachments, new_attachment); - apply_seat_config(new_config); + if (!config->validating) { + apply_seat_config(new_config); + } return cmd_results_new(CMD_SUCCESS, NULL, NULL); } diff --git a/sway/commands/seat/fallback.c b/sway/commands/seat/fallback.c index 56feaab5..11f5a08c 100644 --- a/sway/commands/seat/fallback.c +++ b/sway/commands/seat/fallback.c @@ -27,6 +27,8 @@ struct cmd_results *seat_cmd_fallback(int argc, char **argv) { "Expected 'fallback <true|false>'"); } - apply_seat_config(new_config); + if (!config->validating) { + apply_seat_config(new_config); + } return cmd_results_new(CMD_SUCCESS, NULL, NULL); } diff --git a/sway/commands/swaybg_command.c b/sway/commands/swaybg_command.c index 36f7fdcd..b184b193 100644 --- a/sway/commands/swaybg_command.c +++ b/sway/commands/swaybg_command.c @@ -9,12 +9,17 @@ struct cmd_results *cmd_swaybg_command(int argc, char **argv) { return error; } - if (config->swaybg_command) { - free(config->swaybg_command); + free(config->swaybg_command); + config->swaybg_command = NULL; + + char *new_command = join_args(argv, argc); + if (strcmp(new_command, "-") != 0) { + config->swaybg_command = new_command; + wlr_log(WLR_DEBUG, "Using custom swaybg command: %s", + config->swaybg_command); + } else { + free(new_command); } - config->swaybg_command = join_args(argv, argc); - wlr_log(WLR_DEBUG, "Using custom swaybg command: %s", - config->swaybg_command); return cmd_results_new(CMD_SUCCESS, NULL, NULL); } diff --git a/sway/commands/swaynag_command.c b/sway/commands/swaynag_command.c index c57a80a6..6c86f1a7 100644 --- a/sway/commands/swaynag_command.c +++ b/sway/commands/swaynag_command.c @@ -9,12 +9,17 @@ struct cmd_results *cmd_swaynag_command(int argc, char **argv) { return error; } - if (config->swaynag_command) { - free(config->swaynag_command); + free(config->swaynag_command); + config->swaynag_command = NULL; + + char *new_command = join_args(argv, argc); + if (strcmp(new_command, "-") != 0) { + config->swaybg_command = new_command; + wlr_log(WLR_DEBUG, "Using custom swaynag command: %s", + config->swaynag_command); + } else { + free(new_command); } - config->swaynag_command = join_args(argv, argc); - wlr_log(WLR_DEBUG, "Using custom swaynag command: %s", - config->swaynag_command); return cmd_results_new(CMD_SUCCESS, NULL, NULL); } diff --git a/sway/commands/urgent.c b/sway/commands/urgent.c index 53c37d4d..4f283c55 100644 --- a/sway/commands/urgent.c +++ b/sway/commands/urgent.c @@ -12,6 +12,9 @@ struct cmd_results *cmd_urgent(int argc, char **argv) { return error; } struct sway_container *container = config->handler_context.container; + if (!container) { + return cmd_results_new(CMD_FAILURE, "urgent", "No current container"); + } if (!container->view) { return cmd_results_new(CMD_INVALID, "urgent", "Only views can be urgent"); |