From 1c4d905920d6889ef1d4407bf5311aa15c9a5a7c Mon Sep 17 00:00:00 2001 From: Kenny Levinsen Date: Fri, 11 Oct 2024 00:13:47 +0200 Subject: [PATCH] commands/create_output: Add name argument Allow specifying a name to be set for the newly created output, which avoids the need for traversing the output list to find out what was created. This is particularly useful for reusing configuration. --- sway/commands/create_output.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/sway/commands/create_output.c b/sway/commands/create_output.c index 79283fd1..2587f73f 100644 --- a/sway/commands/create_output.c +++ b/sway/commands/create_output.c @@ -5,27 +5,26 @@ #if WLR_HAS_X11_BACKEND #include #endif +#include #include "sway/commands.h" +#include "sway/output.h" #include "sway/server.h" #include "log.h" static void create_output(struct wlr_backend *backend, void *data) { - bool *done = data; - if (*done) { + struct wlr_output **result = data; + if (*result) { return; } if (wlr_backend_is_wl(backend)) { - wlr_wl_output_create(backend); - *done = true; + *result = wlr_wl_output_create(backend); } else if (wlr_backend_is_headless(backend)) { - wlr_headless_add_output(backend, 1920, 1080); - *done = true; + *result = wlr_headless_add_output(backend, 1920, 1080); } #if WLR_HAS_X11_BACKEND else if (wlr_backend_is_x11(backend)) { - wlr_x11_output_create(backend); - *done = true; + *result = wlr_x11_output_create(backend); } #endif } @@ -37,13 +36,24 @@ struct cmd_results *cmd_create_output(int argc, char **argv) { sway_assert(wlr_backend_is_multi(server.backend), "Expected a multi backend"); - bool done = false; - wlr_multi_for_each_backend(server.backend, create_output, &done); + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "create_output", EXPECTED_AT_MOST, 1))) { + return error; + } + if (argc > 0 && all_output_by_name_or_id(argv[0])) { + return cmd_results_new(CMD_INVALID, "Output name already in use"); + } + struct wlr_output *result = NULL; + wlr_multi_for_each_backend(server.backend, create_output, &result); - if (!done) { + if (!result) { return cmd_results_new(CMD_INVALID, "Can only create outputs for Wayland, X11 or headless backends"); } + if (argc > 0) { + wlr_output_set_name(result, argv[0]); + } + return cmd_results_new(CMD_SUCCESS, NULL); }