mirror of
https://github.com/swaywm/sway.git
synced 2024-11-17 13:42:36 +00:00
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
This commit is contained in:
parent
aa9ba58169
commit
a074e0f504
|
@ -284,18 +284,33 @@ list_t *execute_command(char *_exec, struct sway_seat *seat,
|
||||||
free_argv(argc, argv);
|
free_argv(argc, argv);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
} else if (views->length == 0) {
|
||||||
|
list_add(res_list,
|
||||||
|
cmd_results_new(CMD_FAILURE, "No matching node."));
|
||||||
} else {
|
} else {
|
||||||
|
struct cmd_results *fail_res = NULL;
|
||||||
for (int i = 0; i < views->length; ++i) {
|
for (int i = 0; i < views->length; ++i) {
|
||||||
struct sway_view *view = views->items[i];
|
struct sway_view *view = views->items[i];
|
||||||
set_config_node(&view->container->node);
|
set_config_node(&view->container->node);
|
||||||
struct cmd_results *res = handler->handle(argc-1, argv+1);
|
struct cmd_results *res = handler->handle(argc-1, argv+1);
|
||||||
list_add(res_list, res);
|
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) {
|
if (res->status == CMD_INVALID) {
|
||||||
|
list_add(res_list, fail_res);
|
||||||
free_argv(argc, argv);
|
free_argv(argc, argv);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
list_add(res_list,
|
||||||
|
fail_res ? fail_res : cmd_results_new(CMD_SUCCESS, NULL));
|
||||||
|
}
|
||||||
free_argv(argc, argv);
|
free_argv(argc, argv);
|
||||||
} while(head);
|
} while(head);
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|
Loading…
Reference in a new issue