diff options
-rw-r--r-- | sway/commands.c | 23 |
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); |