diff options
Diffstat (limited to 'swaybg')
-rw-r--r-- | swaybg/main.c | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/swaybg/main.c b/swaybg/main.c index b23b8027..9dba0c8f 100644 --- a/swaybg/main.c +++ b/swaybg/main.c | |||
@@ -69,7 +69,8 @@ int main(int argc, const char **argv) { | |||
69 | sway_log(L_INFO, "Using output %d of %d", desired_output, registry->outputs->length); | 69 | sway_log(L_INFO, "Using output %d of %d", desired_output, registry->outputs->length); |
70 | int i; | 70 | int i; |
71 | struct output_state *output = registry->outputs->items[desired_output]; | 71 | struct output_state *output = registry->outputs->items[desired_output]; |
72 | struct window *window = window_setup(registry, output->width, output->height, false); | 72 | struct window *window = window_setup(registry, |
73 | output->width, output->height, output->scale, false); | ||
73 | if (!window) { | 74 | if (!window) { |
74 | sway_abort("Failed to create surfaces."); | 75 | sway_abort("Failed to create surfaces."); |
75 | } | 76 | } |
@@ -115,60 +116,63 @@ int main(int argc, const char **argv) { | |||
115 | sway_abort("Unsupported scaling mode: %s", scaling_mode_str); | 116 | sway_abort("Unsupported scaling mode: %s", scaling_mode_str); |
116 | } | 117 | } |
117 | 118 | ||
119 | int wwidth = window->width * window->scale; | ||
120 | int wheight = window->height * window->scale; | ||
121 | |||
118 | for (i = 0; i < surfaces->length; ++i) { | 122 | for (i = 0; i < surfaces->length; ++i) { |
119 | struct window *window = surfaces->items[i]; | 123 | struct window *window = surfaces->items[i]; |
120 | if (window_prerender(window) && window->cairo) { | 124 | if (window_prerender(window) && window->cairo) { |
121 | switch (scaling_mode) { | 125 | switch (scaling_mode) { |
122 | case SCALING_MODE_STRETCH: | 126 | case SCALING_MODE_STRETCH: |
123 | cairo_scale(window->cairo, | 127 | cairo_scale(window->cairo, |
124 | (double) window->width / width, | 128 | (double) wwidth / width, |
125 | (double) window->height / height); | 129 | (double) wheight / height); |
126 | cairo_set_source_surface(window->cairo, image, 0, 0); | 130 | cairo_set_source_surface(window->cairo, image, 0, 0); |
127 | break; | 131 | break; |
128 | case SCALING_MODE_FILL: | 132 | case SCALING_MODE_FILL: |
129 | { | 133 | { |
130 | double window_ratio = (double) window->width / window->height; | 134 | double window_ratio = (double) wwidth / wheight; |
131 | double bg_ratio = width / height; | 135 | double bg_ratio = width / height; |
132 | 136 | ||
133 | if (window_ratio > bg_ratio) { | 137 | if (window_ratio > bg_ratio) { |
134 | double scale = (double) window->width / width; | 138 | double scale = (double) wwidth / width; |
135 | cairo_scale(window->cairo, scale, scale); | 139 | cairo_scale(window->cairo, scale, scale); |
136 | cairo_set_source_surface(window->cairo, image, | 140 | cairo_set_source_surface(window->cairo, image, |
137 | 0, | 141 | 0, |
138 | (double) window->height/2 / scale - height/2); | 142 | (double) wheight/2 / scale - height/2); |
139 | } else { | 143 | } else { |
140 | double scale = (double) window->height / height; | 144 | double scale = (double) wheight / height; |
141 | cairo_scale(window->cairo, scale, scale); | 145 | cairo_scale(window->cairo, scale, scale); |
142 | cairo_set_source_surface(window->cairo, image, | 146 | cairo_set_source_surface(window->cairo, image, |
143 | (double) window->width/2 / scale - width/2, | 147 | (double) wwidth/2 / scale - width/2, |
144 | 0); | 148 | 0); |
145 | } | 149 | } |
146 | break; | 150 | break; |
147 | } | 151 | } |
148 | case SCALING_MODE_FIT: | 152 | case SCALING_MODE_FIT: |
149 | { | 153 | { |
150 | double window_ratio = (double) window->width / window->height; | 154 | double window_ratio = (double) wwidth / wheight; |
151 | double bg_ratio = width / height; | 155 | double bg_ratio = width / height; |
152 | 156 | ||
153 | if (window_ratio > bg_ratio) { | 157 | if (window_ratio > bg_ratio) { |
154 | double scale = (double) window->height / height; | 158 | double scale = (double) wheight / height; |
155 | cairo_scale(window->cairo, scale, scale); | 159 | cairo_scale(window->cairo, scale, scale); |
156 | cairo_set_source_surface(window->cairo, image, | 160 | cairo_set_source_surface(window->cairo, image, |
157 | (double) window->width/2 / scale - width/2, | 161 | (double) wwidth/2 / scale - width/2, |
158 | 0); | 162 | 0); |
159 | } else { | 163 | } else { |
160 | double scale = (double) window->width / width; | 164 | double scale = (double) wwidth / width; |
161 | cairo_scale(window->cairo, scale, scale); | 165 | cairo_scale(window->cairo, scale, scale); |
162 | cairo_set_source_surface(window->cairo, image, | 166 | cairo_set_source_surface(window->cairo, image, |
163 | 0, | 167 | 0, |
164 | (double) window->height/2 / scale - height/2); | 168 | (double) wheight/2 / scale - height/2); |
165 | } | 169 | } |
166 | break; | 170 | break; |
167 | } | 171 | } |
168 | case SCALING_MODE_CENTER: | 172 | case SCALING_MODE_CENTER: |
169 | cairo_set_source_surface(window->cairo, image, | 173 | cairo_set_source_surface(window->cairo, image, |
170 | (double) window->width/2 - width/2, | 174 | (double) wwidth/2 - width/2, |
171 | (double) window->height/2 - height/2); | 175 | (double) wheight/2 - height/2); |
172 | break; | 176 | break; |
173 | case SCALING_MODE_TILE: | 177 | case SCALING_MODE_TILE: |
174 | { | 178 | { |