aboutsummaryrefslogtreecommitdiff
path: root/sway/commands
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands')
-rw-r--r--sway/commands/bar.c14
-rw-r--r--sway/commands/bar/status_command.c18
-rw-r--r--sway/commands/bind.c49
-rw-r--r--sway/commands/client.c15
-rw-r--r--sway/commands/opacity.c4
-rw-r--r--sway/commands/popup_during_fullscreen.c25
-rw-r--r--sway/commands/reload.c36
-rw-r--r--sway/commands/seat/attach.c4
-rw-r--r--sway/commands/seat/fallback.c4
-rw-r--r--sway/commands/swaybg_command.c15
-rw-r--r--sway/commands/swaynag_command.c15
-rw-r--r--sway/commands/urgent.c3
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");