diff --git a/sway/commands/backend.c b/sway/commands/backend.c index 10bf05334..ee0198f9b 100644 --- a/sway/commands/backend.c +++ b/sway/commands/backend.c @@ -1,6 +1,7 @@ #include #include "sway/commands.h" #include "sway/server.h" +#include "sway/output.h" #include "log.h" static struct cmd_results *backend_cmd_del(int argc, char **argv) { @@ -46,14 +47,33 @@ static struct cmd_results *backend_cmd_add(int argc, char **argv) { static struct cmd_results *backend_cmd_add_output(int argc, char **argv, struct sway_subbackend *backend) { - wlr_log(L_DEBUG, "TODO: backend cmd add_output"); - return NULL; + // TODO allow to name the output + sway_subbackend_add_output(&server, backend, NULL); + return cmd_results_new(CMD_SUCCESS, NULL, NULL); } static struct cmd_results *backend_cmd_del_output(int argc, char **argv, struct sway_subbackend *backend) { - wlr_log(L_DEBUG, "TODO: backend cmd del_output"); - return NULL; + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "backend", EXPECTED_AT_LEAST, 1))) { + return error; + } + + for (int i = 0; i < root_container.children->length; ++i) { + swayc_t *output = root_container.children->items[i]; + if (output->type != C_OUTPUT) { + continue; + } + + const char *name = output->sway_output->wlr_output->name; + + if (output->sway_output->wlr_output->backend == backend->backend && + strcmp(argv[0], name) == 0) { + wlr_output_destroy(output->sway_output->wlr_output); + } + } + + return cmd_results_new(CMD_SUCCESS, NULL, NULL); } static struct cmd_results *backend_cmd_add_input(int argc, char **argv, @@ -64,7 +84,11 @@ static struct cmd_results *backend_cmd_add_input(int argc, char **argv, static struct cmd_results *backend_cmd_del_input(int argc, char **argv, struct sway_subbackend *backend) { - wlr_log(L_DEBUG, "TODO: backend cmd del_input"); + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "backend", EXPECTED_AT_LEAST, 1))) { + return error; + } + return NULL; } @@ -74,8 +98,8 @@ struct cmd_results *cmd_backend(int argc, char **argv) { return error; } - int argc_new = argc-1; - char **argv_new = argv+1; + int argc_new = argc-2; + char **argv_new = argv+2; if (strcasecmp("add", argv[0]) == 0) { return backend_cmd_add(argc_new, argv_new); diff --git a/sway/server.c b/sway/server.c index 5772b8522..efbbdd1cd 100644 --- a/sway/server.c +++ b/sway/server.c @@ -52,6 +52,7 @@ bool server_init(struct sway_server *server, bool headless) { struct sway_subbackend *subbackend = sway_subbackend_create(SWAY_SUBBACKEND_HEADLESS, "headless"); sway_server_add_subbackend(server, subbackend); + sway_subbackend_add_output(server, subbackend, "headless"); } else { // TODO add whatever this function creates to the subbackends server->backend = wlr_backend_autocreate(server->wl_display); @@ -234,6 +235,8 @@ void sway_server_add_subbackend(struct sway_server *server, return; } + subbackend->backend = backend; + wl_list_remove(&subbackend->link); wl_list_insert(&server->subbackends, &subbackend->link); @@ -295,7 +298,7 @@ void sway_subbackend_add_output(struct sway_server *server, case SWAY_SUBBACKEND_HEADLESS: // TODO allow to name the output wlr_output = - wlr_headless_add_output(subbackend->backend, 500, 500); + wlr_headless_add_output(subbackend->backend, 1280, 960); break; } diff --git a/sway/tree/container.c b/sway/tree/container.c index fafbdb03c..6abf57e31 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -249,6 +249,7 @@ swayc_t *destroy_output(swayc_t *output) { } wl_list_remove(&output->sway_output->output_destroy.link); + wl_list_remove(&output->sway_output->frame.link); wlr_log(L_DEBUG, "OUTPUT: Destroying output '%s'", output->name); free_swayc(output);