Implement output toggle

discussed in #4136, this can't handle wildcard but won't crash.
This commit is contained in:
Moelf 2019-05-10 23:57:53 -07:00 committed by Brian Ashworth
parent 18ce0eec60
commit ed2e553b8d
7 changed files with 60 additions and 0 deletions

View file

@ -270,6 +270,7 @@ sway_cmd output_cmd_mode;
sway_cmd output_cmd_position; sway_cmd output_cmd_position;
sway_cmd output_cmd_scale; sway_cmd output_cmd_scale;
sway_cmd output_cmd_subpixel; sway_cmd output_cmd_subpixel;
sway_cmd output_cmd_toggle;
sway_cmd output_cmd_transform; sway_cmd output_cmd_transform;
sway_cmd seat_cmd_attach; sway_cmd seat_cmd_attach;

View file

@ -82,8 +82,12 @@ void output_damage_box(struct sway_output *output, struct wlr_box *box);
void output_damage_whole_container(struct sway_output *output, void output_damage_whole_container(struct sway_output *output,
struct sway_container *con); struct sway_container *con);
// this ONLY includes the enabled outputs
struct sway_output *output_by_name_or_id(const char *name_or_id); struct sway_output *output_by_name_or_id(const char *name_or_id);
// this includes all the outputs, including disabled ones
struct sway_output *all_output_by_name_or_id(const char *name_or_id);
void output_sort_workspaces(struct sway_output *output); void output_sort_workspaces(struct sway_output *output);
void output_enable(struct sway_output *output, struct output_config *oc); void output_enable(struct sway_output *output, struct output_config *oc);

View file

@ -19,6 +19,7 @@ static struct cmd_handler output_handlers[] = {
{ "resolution", output_cmd_mode }, { "resolution", output_cmd_mode },
{ "scale", output_cmd_scale }, { "scale", output_cmd_scale },
{ "subpixel", output_cmd_subpixel }, { "subpixel", output_cmd_subpixel },
{ "toggle", output_cmd_toggle },
{ "transform", output_cmd_transform }, { "transform", output_cmd_transform },
}; };

View file

@ -0,0 +1,37 @@
#include "sway/commands.h"
#include "sway/config.h"
#include "sway/output.h"
struct cmd_results *output_cmd_toggle(int argc, char **argv) {
if (!config->handler_context.output_config) {
return cmd_results_new(CMD_FAILURE, "Missing output config");
}
struct output_config *oc = config->handler_context.output_config;
if (strcmp(oc->name, "*") == 0) {
return cmd_results_new(CMD_INVALID,
"Cannot apply toggle to all outputs.");
}
struct sway_output *sway_output = all_output_by_name_or_id(oc->name);
if (sway_output == NULL) {
return cmd_results_new(CMD_FAILURE,
"Cannot apply toggle to unknown output %s", oc->name);
}
oc = find_output_config(sway_output);
if (!oc || oc->enabled != 0) {
config->handler_context.output_config->enabled = 0;
} else {
config->handler_context.output_config->enabled = 1;
}
free(oc);
config->handler_context.leftovers.argc = argc;
config->handler_context.leftovers.argv = argv;
return NULL;
}

View file

@ -42,6 +42,19 @@ struct sway_output *output_by_name_or_id(const char *name_or_id) {
return NULL; return NULL;
} }
struct sway_output *all_output_by_name_or_id(const char *name_or_id) {
struct sway_output *output;
wl_list_for_each(output, &root->all_outputs, link) {
char identifier[128];
output_get_identifier(identifier, sizeof(identifier), output);
if (strcasecmp(identifier, name_or_id) == 0
|| strcasecmp(output->wlr_output->name, name_or_id) == 0) {
return output;
}
}
return NULL;
}
/** /**
* Rotate a child's position relative to a parent. The parent size is (pw, ph), * Rotate a child's position relative to a parent. The parent size is (pw, ph),
* the child position is (*sx, *sy) and its size is (sw, sh). * the child position is (*sx, *sy) and its size is (sw, sh).

View file

@ -173,6 +173,7 @@ sway_sources = files(
'commands/output/position.c', 'commands/output/position.c',
'commands/output/scale.c', 'commands/output/scale.c',
'commands/output/subpixel.c', 'commands/output/subpixel.c',
'commands/output/toggle.c',
'commands/output/transform.c', 'commands/output/transform.c',
'tree/arrange.c', 'tree/arrange.c',

View file

@ -94,6 +94,9 @@ must be separated by one space. For example:
Enables or disables the specified output (all outputs are enabled by Enables or disables the specified output (all outputs are enabled by
default). default).
*output* <name> toggle
Toggle the specified output.
*output* <name> dpms on|off *output* <name> dpms on|off
Enables or disables the specified output via DPMS. To turn an output off Enables or disables the specified output via DPMS. To turn an output off
(ie. blank the screen but keep workspaces as-is), one can set DPMS to off. (ie. blank the screen but keep workspaces as-is), one can set DPMS to off.