summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFurkan Sahin <furkan-dev@proton.me>2019-08-22 11:18:38 +0200
committerFurkan Sahin <furkan-dev@proton.me>2019-08-22 11:18:38 +0200
commita17d36f12f10358e6df83baeae12f2d6733de048 (patch)
treef2031a1c613147891773178f61e54f15c4e04850
parent1ec96a2c76889db2c313875d5babdc5ada0d70a8 (diff)
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);