cmd_opacity: add relative opacity changes

This enhances the opacity command to support relative assignment as well
as the currently implemented absolute assignment. The syntax is copied
from the same format that gaps uses for relative and absolute setting.
An example usage in a sway config looks like:

// relative change (this feature)
bindsym button4 opacity plus .1
bindsym button5 opacity minus .1

// absolute change (this feature)
bindsym button4 opacity set 1
bindsym button5 opacity set .3

// old way, still supported
bindsym button4 opacity 1
bindsym button5 opacity .3
This commit is contained in:
Jeff Peeler 2019-07-15 10:06:05 -04:00 committed by Brian Ashworth
parent 90d8a4df32
commit 140ce785fe
2 changed files with 23 additions and 20 deletions

View file

@ -1,21 +1,13 @@
#include <assert.h> #include <assert.h>
#include <stdlib.h> #include <stdlib.h>
#include <strings.h>
#include "sway/commands.h" #include "sway/commands.h"
#include "sway/tree/view.h" #include "sway/tree/view.h"
#include "log.h" #include "log.h"
static bool parse_opacity(const char *opacity, float *val) {
char *err;
*val = strtof(opacity, &err);
if (*val < 0 || *val > 1 || *err) {
return false;
}
return true;
}
struct cmd_results *cmd_opacity(int argc, char **argv) { struct cmd_results *cmd_opacity(int argc, char **argv) {
struct cmd_results *error = NULL; struct cmd_results *error = NULL;
if ((error = checkarg(argc, "opacity", EXPECTED_EQUAL_TO, 1))) { if ((error = checkarg(argc, "opacity", EXPECTED_AT_LEAST, 1))) {
return error; return error;
} }
@ -25,15 +17,26 @@ struct cmd_results *cmd_opacity(int argc, char **argv) {
return cmd_results_new(CMD_FAILURE, "No current container"); return cmd_results_new(CMD_FAILURE, "No current container");
} }
float opacity = 0.0f; char *err;
float val = strtof(argc == 1 ? argv[0] : argv[1], &err);
if (!parse_opacity(argv[0], &opacity)) { if (*err) {
return cmd_results_new(CMD_INVALID, return cmd_results_new(CMD_INVALID, "opacity float invalid");
"Invalid value (expected 0..1): %s", argv[0]);
} }
con->alpha = opacity; if (!strcasecmp(argv[0], "plus")) {
container_damage_whole(con); val = con->alpha + val;
} else if (!strcasecmp(argv[0], "minus")) {
val = con->alpha - val;
} else if (argc > 1 && strcasecmp(argv[0], "set")) {
return cmd_results_new(CMD_INVALID,
"Expected: set|plus|minus <0..1>: %s", argv[0]);
}
if (val < 0 || val > 1) {
return cmd_results_new(CMD_FAILURE, "opacity value out of bounds");
}
con->alpha = val;
container_damage_whole(con);
return cmd_results_new(CMD_SUCCESS, NULL); return cmd_results_new(CMD_SUCCESS, NULL);
} }

View file

@ -664,9 +664,9 @@ The default colors are:
Any mark that starts with an underscore will not be drawn even if Any mark that starts with an underscore will not be drawn even if
*show_marks* is yes. The default is _yes_. *show_marks* is yes. The default is _yes_.
*opacity* <value> *opacity* [set|plus|minus] <value>
Set the opacity of the window between 0 (completely transparent) and 1 Adjusts the opacity of the window between 0 (completely transparent) and
(completely opaque). 1 (completely opaque). If the operation is omitted, _set_ will be used.
*tiling_drag* enable|disable|toggle *tiling_drag* enable|disable|toggle
Sets whether or not tiling containers can be dragged with the mouse. If Sets whether or not tiling containers can be dragged with the mouse. If