swaybg: implement scaling mode "fit"

This commit is contained in:
Christoph Gysin 2015-11-25 22:26:21 +02:00
parent 8630bc3752
commit be3fae148b
3 changed files with 25 additions and 1 deletions

View file

@ -127,7 +127,7 @@ Commands
**output** <name> <background|bg> <file> <mode>::
Sets the wallpaper for the given output to the specified file, using the given
scaling mode (one of "stretch", "fill", "center", "tile").
scaling mode (one of "stretch", "fill", "fit", "center", "tile").
**output** <name> disable::
Disables the specified output.

View file

@ -85,6 +85,7 @@ static char *bg_options[] = {
"stretch",
"center",
"fill",
"fit",
"tile"
};

View file

@ -15,6 +15,7 @@ struct registry *registry;
enum scaling_mode_t {
SCALING_MODE_STRETCH,
SCALING_MODE_FILL,
SCALING_MODE_FIT,
SCALING_MODE_CENTER,
SCALING_MODE_TILE,
};
@ -66,6 +67,8 @@ int main(int argc, const char **argv) {
scaling_mode = SCALING_MODE_STRETCH;
} else if (strcmp(scaling_mode_str, "fill") == 0) {
scaling_mode = SCALING_MODE_FILL;
} else if (strcmp(scaling_mode_str, "fit") == 0) {
scaling_mode = SCALING_MODE_FIT;
} else if (strcmp(scaling_mode_str, "center") == 0) {
scaling_mode = SCALING_MODE_CENTER;
} else if (strcmp(scaling_mode_str, "tile") == 0) {
@ -105,6 +108,26 @@ int main(int argc, const char **argv) {
}
}
break;
case SCALING_MODE_FIT:
{
double window_ratio = (double) window->width / window->height;
double bg_ratio = width / height;
if (window_ratio > bg_ratio) {
double scale = (double) window->height / height;
cairo_scale(window->cairo, scale, scale);
cairo_set_source_surface(window->cairo, image,
(double) window->width/2 / scale - width/2,
0);
} else {
double scale = (double) window->width / width;
cairo_scale(window->cairo, scale, scale);
cairo_set_source_surface(window->cairo, image,
0,
(double) window->height/2 / scale - height/2);
}
}
break;
case SCALING_MODE_CENTER:
cairo_set_source_surface(window->cairo, image,
(double) window->width/2 - width/2,