aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Laurent Bonnans <laurent.bonnans@here.com>2019-08-22 11:18:38 +0200
committerLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-08-22 13:09:38 -0400
commita074e0f5046244230363c6fa0e5452056bf70038 (patch)
treed64bcc3de84588626ffbc796d5aa0cd319187cc6
parentsway.5: remove mention of floating_scroll (diff)
downloadsway-a074e0f5046244230363c6fa0e5452056bf70038.tar.gz
sway-a074e0f5046244230363c6fa0e5452056bf70038.tar.zst
sway-a074e0f5046244230363c6fa0e5452056bf70038.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);