summaryrefslogtreecommitdiffstats
path: root/swaybg
diff options
context:
space:
mode:
authorLibravatar Christoph Gysin <christoph.gysin@gmail.com>2015-11-25 22:26:21 +0200
committerLibravatar Christoph Gysin <christoph.gysin@gmail.com>2015-11-25 22:32:02 +0200
commitbe3fae148bc2a48a1d828b72221c0fd69bea79f7 (patch)
treeeb872cf8e54e08d6ee6205564d8959a11430b9b3 /swaybg
parentswaybg: implement scaling mode "tile" (diff)
downloadsway-be3fae148bc2a48a1d828b72221c0fd69bea79f7.tar.gz
sway-be3fae148bc2a48a1d828b72221c0fd69bea79f7.tar.zst
sway-be3fae148bc2a48a1d828b72221c0fd69bea79f7.zip
swaybg: implement scaling mode "fit"
Diffstat (limited to 'swaybg')
-rw-r--r--swaybg/main.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/swaybg/main.c b/swaybg/main.c
index 7cfe1320..e4c699c1 100644
--- a/swaybg/main.c
+++ b/swaybg/main.c
@@ -15,6 +15,7 @@ struct registry *registry;
15enum scaling_mode_t { 15enum scaling_mode_t {
16 SCALING_MODE_STRETCH, 16 SCALING_MODE_STRETCH,
17 SCALING_MODE_FILL, 17 SCALING_MODE_FILL,
18 SCALING_MODE_FIT,
18 SCALING_MODE_CENTER, 19 SCALING_MODE_CENTER,
19 SCALING_MODE_TILE, 20 SCALING_MODE_TILE,
20}; 21};
@@ -66,6 +67,8 @@ int main(int argc, const char **argv) {
66 scaling_mode = SCALING_MODE_STRETCH; 67 scaling_mode = SCALING_MODE_STRETCH;
67 } else if (strcmp(scaling_mode_str, "fill") == 0) { 68 } else if (strcmp(scaling_mode_str, "fill") == 0) {
68 scaling_mode = SCALING_MODE_FILL; 69 scaling_mode = SCALING_MODE_FILL;
70 } else if (strcmp(scaling_mode_str, "fit") == 0) {
71 scaling_mode = SCALING_MODE_FIT;
69 } else if (strcmp(scaling_mode_str, "center") == 0) { 72 } else if (strcmp(scaling_mode_str, "center") == 0) {
70 scaling_mode = SCALING_MODE_CENTER; 73 scaling_mode = SCALING_MODE_CENTER;
71 } else if (strcmp(scaling_mode_str, "tile") == 0) { 74 } else if (strcmp(scaling_mode_str, "tile") == 0) {
@@ -105,6 +108,26 @@ int main(int argc, const char **argv) {
105 } 108 }
106 } 109 }
107 break; 110 break;
111 case SCALING_MODE_FIT:
112 {
113 double window_ratio = (double) window->width / window->height;
114 double bg_ratio = width / height;
115
116 if (window_ratio > bg_ratio) {
117 double scale = (double) window->height / height;
118 cairo_scale(window->cairo, scale, scale);
119 cairo_set_source_surface(window->cairo, image,
120 (double) window->width/2 / scale - width/2,
121 0);
122 } else {
123 double scale = (double) window->width / width;
124 cairo_scale(window->cairo, scale, scale);
125 cairo_set_source_surface(window->cairo, image,
126 0,
127 (double) window->height/2 / scale - height/2);
128 }
129 }
130 break;
108 case SCALING_MODE_CENTER: 131 case SCALING_MODE_CENTER:
109 cairo_set_source_surface(window->cairo, image, 132 cairo_set_source_surface(window->cairo, image,
110 (double) window->width/2 - width/2, 133 (double) window->width/2 - width/2,