From 26442ad8437d8247a651bd53ead6170660908aa7 Mon Sep 17 00:00:00 2001
From: Laurent Bonnans <laurent.bonnans@here.com>
Date: Thu, 22 Aug 2019 11:18:38 +0200
Subject: [PATCH] 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
---
 sway/commands.c | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/sway/commands.c b/sway/commands.c
index b841ef09e..2c1b2cb98 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);