diff options
author | Ryan Walklin <ryan@testtoast.com> | 2018-10-31 21:06:49 +0000 |
---|---|---|
committer | Ryan Walklin <ryan@testtoast.com> | 2018-11-05 22:58:27 +0000 |
commit | 5032acb7a574ce3e8dbfdfb1304d871e64ae68d6 (patch) | |
tree | 6144d7050fa2ac7383ffbe614cd76697f36929c8 /sway/commands/output | |
parent | Merge pull request #3068 from emersion/effective-damage (diff) | |
download | sway-5032acb7a574ce3e8dbfdfb1304d871e64ae68d6.tar.gz sway-5032acb7a574ce3e8dbfdfb1304d871e64ae68d6.tar.zst sway-5032acb7a574ce3e8dbfdfb1304d871e64ae68d6.zip |
Add relative output transform
This commit enhances the output transform
command with options for a relative transform,
i.e. the provided transform will be applied as
an offset to the current transform. Append
`clockwise` to rotate clockwise from the current
rotation, or `anticlockwise` to rotate in the
opposite direction.
For example, if the output LVDS-1 is rotated
90 degrees clockwise, the command
`output LVDS-1 transform 90 clockwise`
will rotate the display to 180 degrees.
All transform options are supported,
including flipped transforms.
Relative transforms can only be applied to
a single output and cannot be used with
a wildcard (*) output specifier.
Diffstat (limited to 'sway/commands/output')
-rw-r--r-- | sway/commands/output/transform.c | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/sway/commands/output/transform.c b/sway/commands/output/transform.c index f9a94d64..c1555323 100644 --- a/sway/commands/output/transform.c +++ b/sway/commands/output/transform.c | |||
@@ -1,6 +1,8 @@ | |||
1 | #include <string.h> | 1 | #include <string.h> |
2 | #include "sway/commands.h" | 2 | #include "sway/commands.h" |
3 | #include "sway/config.h" | 3 | #include "sway/config.h" |
4 | #include "log.h" | ||
5 | #include "sway/output.h" | ||
4 | 6 | ||
5 | struct cmd_results *output_cmd_transform(int argc, char **argv) { | 7 | struct cmd_results *output_cmd_transform(int argc, char **argv) { |
6 | if (!config->handler_context.output_config) { | 8 | if (!config->handler_context.output_config) { |
@@ -10,30 +12,52 @@ struct cmd_results *output_cmd_transform(int argc, char **argv) { | |||
10 | return cmd_results_new(CMD_INVALID, "output", | 12 | return cmd_results_new(CMD_INVALID, "output", |
11 | "Missing transform argument."); | 13 | "Missing transform argument."); |
12 | } | 14 | } |
13 | 15 | enum wl_output_transform transform; | |
14 | struct output_config *output = config->handler_context.output_config; | ||
15 | if (strcmp(*argv, "normal") == 0) { | 16 | if (strcmp(*argv, "normal") == 0) { |
16 | output->transform = WL_OUTPUT_TRANSFORM_NORMAL; | 17 | transform = WL_OUTPUT_TRANSFORM_NORMAL; |
17 | } else if (strcmp(*argv, "90") == 0) { | 18 | } else if (strcmp(*argv, "90") == 0) { |
18 | output->transform = WL_OUTPUT_TRANSFORM_90; | 19 | transform = WL_OUTPUT_TRANSFORM_90; |
19 | } else if (strcmp(*argv, "180") == 0) { | 20 | } else if (strcmp(*argv, "180") == 0) { |
20 | output->transform = WL_OUTPUT_TRANSFORM_180; | 21 | transform = WL_OUTPUT_TRANSFORM_180; |
21 | } else if (strcmp(*argv, "270") == 0) { | 22 | } else if (strcmp(*argv, "270") == 0) { |
22 | output->transform = WL_OUTPUT_TRANSFORM_270; | 23 | transform = WL_OUTPUT_TRANSFORM_270; |
23 | } else if (strcmp(*argv, "flipped") == 0) { | 24 | } else if (strcmp(*argv, "flipped") == 0) { |
24 | output->transform = WL_OUTPUT_TRANSFORM_FLIPPED; | 25 | transform = WL_OUTPUT_TRANSFORM_FLIPPED; |
25 | } else if (strcmp(*argv, "flipped-90") == 0) { | 26 | } else if (strcmp(*argv, "flipped-90") == 0) { |
26 | output->transform = WL_OUTPUT_TRANSFORM_FLIPPED_90; | 27 | transform = WL_OUTPUT_TRANSFORM_FLIPPED_90; |
27 | } else if (strcmp(*argv, "flipped-180") == 0) { | 28 | } else if (strcmp(*argv, "flipped-180") == 0) { |
28 | output->transform = WL_OUTPUT_TRANSFORM_FLIPPED_180; | 29 | transform = WL_OUTPUT_TRANSFORM_FLIPPED_180; |
29 | } else if (strcmp(*argv, "flipped-270") == 0) { | 30 | } else if (strcmp(*argv, "flipped-270") == 0) { |
30 | output->transform = WL_OUTPUT_TRANSFORM_FLIPPED_270; | 31 | transform = WL_OUTPUT_TRANSFORM_FLIPPED_270; |
31 | } else { | 32 | } else { |
32 | return cmd_results_new(CMD_INVALID, "output", | 33 | return cmd_results_new(CMD_INVALID, "output", |
33 | "Invalid output transform."); | 34 | "Invalid output transform."); |
34 | } | 35 | } |
35 | 36 | struct output_config *output = config->handler_context.output_config; | |
36 | config->handler_context.leftovers.argc = argc - 1; | 37 | config->handler_context.leftovers.argc = argc - 1; |
37 | config->handler_context.leftovers.argv = argv + 1; | 38 | config->handler_context.leftovers.argv = argv + 1; |
39 | if (argc > 1 && | ||
40 | (strcmp(argv[1], "clockwise") == 0 || strcmp(argv[1], "anticlockwise") == 0)) { | ||
41 | if (!sway_assert(output->name != NULL, "Output config name not set")) { | ||
42 | return NULL; | ||
43 | } | ||
44 | if (strcmp(output->name, "*") == 0) { | ||
45 | return cmd_results_new(CMD_INVALID, "output", | ||
46 | "Cannot apply relative transform to all outputs."); | ||
47 | } | ||
48 | struct sway_output *s_output = output_by_name(output->name); | ||
49 | if (s_output == NULL) { | ||
50 | return cmd_results_new(CMD_INVALID, "output", | ||
51 | "Cannot apply relative transform to unknown output %s", output->name); | ||
52 | } | ||
53 | if (strcmp(argv[1], "anticlockwise") == 0) { | ||
54 | transform = wlr_output_transform_invert(transform); | ||
55 | } | ||
56 | struct wlr_output *w_output = s_output->wlr_output; | ||
57 | transform = wlr_output_transform_compose(w_output->transform, transform); | ||
58 | config->handler_context.leftovers.argv += 1; | ||
59 | config->handler_context.leftovers.argc -= 1; | ||
60 | } | ||
61 | output->transform = transform; | ||
38 | return NULL; | 62 | return NULL; |
39 | } | 63 | } |