diff options
author | Andri Yngvason <andri@yngvason.is> | 2022-09-29 23:18:39 +0000 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2022-10-07 19:17:39 +0200 |
commit | b00b05f792c4b5095d5aa08547e1502a24785e20 (patch) | |
tree | 089b54be41403a17f07bdeddc17be8346f5e63f4 /sway/commands | |
parent | 04f8a655e7cf555ddf068756916346b8246395d1 (diff) |
sway/commands/output: Add command for unplugging non-physical outputs
Diffstat (limited to 'sway/commands')
-rw-r--r-- | sway/commands/output.c | 1 | ||||
-rw-r--r-- | sway/commands/output/unplug.c | 54 |
2 files changed, 55 insertions, 0 deletions
diff --git a/sway/commands/output.c b/sway/commands/output.c index c102344d..df32c673 100644 --- a/sway/commands/output.c +++ b/sway/commands/output.c @@ -27,6 +27,7 @@ static const struct cmd_handler output_handlers[] = { { "subpixel", output_cmd_subpixel }, { "toggle", output_cmd_toggle }, { "transform", output_cmd_transform }, + { "unplug", output_cmd_unplug }, }; struct cmd_results *cmd_output(int argc, char **argv) { diff --git a/sway/commands/output/unplug.c b/sway/commands/output/unplug.c new file mode 100644 index 00000000..dfef626f --- /dev/null +++ b/sway/commands/output/unplug.c @@ -0,0 +1,54 @@ +#include <strings.h> +#include <wlr/config.h> +#include <wlr/backend/headless.h> +#include <wlr/backend/wayland.h> +#if WLR_HAS_X11_BACKEND +#include <wlr/backend/x11.h> +#endif +#include "sway/commands.h" +#include "sway/config.h" +#include "sway/output.h" + +static bool is_backend_allowed(struct wlr_backend *backend) { + if (wlr_backend_is_headless(backend)) { + return true; + } + if (wlr_backend_is_wl(backend)) { + return true; + } +#if WLR_HAS_X11_BACKEND + if (wlr_backend_is_x11(backend)) { + return true; + } +#endif + return false; +} + +/** + * This command is intended for developer use only. + */ +struct cmd_results *output_cmd_unplug(int argc, char **argv) { + if (!config->handler_context.output_config) { + return cmd_results_new(CMD_FAILURE, "Missing output config"); + } + + const char *oc_name = config->handler_context.output_config->name; + if (strcmp(oc_name, "*") == 0) { + return cmd_results_new(CMD_INVALID, "Won't unplug all outputs"); + } + + struct sway_output *sway_output = all_output_by_name_or_id(oc_name); + if (!sway_output) { + return cmd_results_new(CMD_INVALID, + "Cannot unplug unknown output %s", oc_name); + } + + if (!is_backend_allowed(sway_output->wlr_output->backend)) { + return cmd_results_new(CMD_INVALID, + "Can only unplug outputs with headless, wayland or x11 backend"); + } + + wlr_output_destroy(sway_output->wlr_output); + + return cmd_results_new(CMD_SUCCESS, NULL); +} |