aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Laurent Bonnans <laurent.bonnans@here.com>2019-08-22 11:18:38 +0200
committerLibravatar Drew DeVault <sir@cmpwn.com>2019-08-27 09:37:10 +0900
commit26442ad8437d8247a651bd53ead6170660908aa7 (patch)
treef2031a1c613147891773178f61e54f15c4e04850
parentAllow moving a container hidden in scratchpad (diff)
downloadsway-26442ad8437d8247a651bd53ead6170660908aa7.tar.gz
sway-26442ad8437d8247a651bd53ead6170660908aa7.tar.zst
sway-26442ad8437d8247a651bd53ead6170660908aa7.zip
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,
284 free_argv(argc, argv); 284 free_argv(argc, argv);
285 goto cleanup; 285 goto cleanup;
286 } 286 }
287 } else if (views->length == 0) {
288 list_add(res_list,
289 cmd_results_new(CMD_FAILURE, "No matching node."));
287 } else { 290 } else {
291 struct cmd_results *fail_res = NULL;
288 for (int i = 0; i < views->length; ++i) { 292 for (int i = 0; i < views->length; ++i) {
289 struct sway_view *view = views->items[i]; 293 struct sway_view *view = views->items[i];
290 set_config_node(&view->container->node); 294 set_config_node(&view->container->node);
291 struct cmd_results *res = handler->handle(argc-1, argv+1); 295 struct cmd_results *res = handler->handle(argc-1, argv+1);
292 list_add(res_list, res); 296 if (res->status == CMD_SUCCESS) {
293 if (res->status == CMD_INVALID) { 297 free_cmd_results(res);
294 free_argv(argc, argv); 298 } else {
295 goto cleanup; 299 // last failure will take precedence
300 if (fail_res) {
301 free_cmd_results(fail_res);
302 }
303 fail_res = res;
304 if (res->status == CMD_INVALID) {
305 list_add(res_list, fail_res);
306 free_argv(argc, argv);
307 goto cleanup;
308 }
296 } 309 }
297 } 310 }
311 list_add(res_list,
312 fail_res ? fail_res : cmd_results_new(CMD_SUCCESS, NULL));
298 } 313 }
299 free_argv(argc, argv); 314 free_argv(argc, argv);
300 } while(head); 315 } while(head);