aboutsummaryrefslogtreecommitdiffstats
path: root/sway/commands.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands.c')
-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);