aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Bonnans <laurent.bonnans@here.com>2019-08-22 11:18:38 +0200
committerBrian Ashworth <bosrsf04@gmail.com>2019-08-22 13:09:38 -0400
commita074e0f5046244230363c6fa0e5452056bf70038 (patch)
treed64bcc3de84588626ffbc796d5aa0cd319187cc6
parentaa9ba581691b70ef907cde1539da9227c8b16c33 (diff)
downloadsway-a074e0f5046244230363c6fa0e5452056bf70038.tar.xz
ipc: collapse multi-container command results
Match i3's behavior and only return one status response per command, even if it applies to several nodes. Also returns an error if the criteria returns an empty match. Closes #4483
-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);