aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sway/commands.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/sway/commands.c b/sway/commands.c
index b841ef09..2c1b2cb9 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -284,17 +284,32 @@ list_t *execute_command(char *_exec, struct sway_seat *seat,
free_argv(argc, argv);
goto cleanup;
}
+ } else if (views->length == 0) {
+ list_add(res_list,
+ cmd_results_new(CMD_FAILURE, "No matching node."));
} else {
+ struct cmd_results *fail_res = NULL;
for (int i = 0; i < views->length; ++i) {
struct sway_view *view = views->items[i];
set_config_node(&view->container->node);
struct cmd_results *res = handler->handle(argc-1, argv+1);
- list_add(res_list, res);
- if (res->status == CMD_INVALID) {
- free_argv(argc, argv);
- goto cleanup;
+ if (res->status == CMD_SUCCESS) {
+ free_cmd_results(res);
+ } else {
+ // last failure will take precedence
+ if (fail_res) {
+ free_cmd_results(fail_res);
+ }
+ fail_res = res;
+ if (res->status == CMD_INVALID) {
+ list_add(res_list, fail_res);
+ free_argv(argc, argv);
+ goto cleanup;
+ }
}
}
+ list_add(res_list,
+ fail_res ? fail_res : cmd_results_new(CMD_SUCCESS, NULL));
}
free_argv(argc, argv);
} while(head);