diff options
Diffstat (limited to 'swaybg/main.c')
-rw-r--r-- | swaybg/main.c | 28 |
1 files changed, 8 insertions, 20 deletions
diff --git a/swaybg/main.c b/swaybg/main.c index ffefcd08..679b8c20 100644 --- a/swaybg/main.c +++ b/swaybg/main.c | |||
@@ -64,15 +64,17 @@ bool is_valid_color(const char *color) { | |||
64 | } | 64 | } |
65 | 65 | ||
66 | static void render_frame(struct swaybg_state *state) { | 66 | static void render_frame(struct swaybg_state *state) { |
67 | state->current_buffer = get_next_buffer(state->shm, state->buffers, | 67 | int buffer_width = state->width * state->scale, |
68 | state->width * state->scale, state->height * state->scale); | 68 | buffer_height = state->height * state->scale; |
69 | state->current_buffer = get_next_buffer(state->shm, | ||
70 | state->buffers, buffer_width, buffer_height); | ||
69 | cairo_t *cairo = state->current_buffer->cairo; | 71 | cairo_t *cairo = state->current_buffer->cairo; |
70 | if (state->args->mode == BACKGROUND_MODE_SOLID_COLOR) { | 72 | if (state->args->mode == BACKGROUND_MODE_SOLID_COLOR) { |
71 | cairo_set_source_u32(cairo, state->context.color); | 73 | cairo_set_source_u32(cairo, state->context.color); |
72 | cairo_paint(cairo); | 74 | cairo_paint(cairo); |
73 | } else { | 75 | } else { |
74 | render_background_image(cairo, state->context.image, | 76 | render_background_image(cairo, state->context.image, |
75 | state->args->mode, state->width, state->height, state->scale); | 77 | state->args->mode, buffer_width, buffer_height); |
76 | } | 78 | } |
77 | 79 | ||
78 | wl_surface_set_buffer_scale(state->surface, state->scale); | 80 | wl_surface_set_buffer_scale(state->surface, state->scale); |
@@ -193,24 +195,10 @@ int main(int argc, const char **argv) { | |||
193 | args.output_idx = atoi(argv[1]); | 195 | args.output_idx = atoi(argv[1]); |
194 | args.path = argv[2]; | 196 | args.path = argv[2]; |
195 | 197 | ||
196 | args.mode = BACKGROUND_MODE_STRETCH; | 198 | args.mode = parse_background_mode(argv[3]); |
197 | if (strcmp(argv[3], "stretch") == 0) { | 199 | if (args.mode == BACKGROUND_MODE_INVALID) { |
198 | args.mode = BACKGROUND_MODE_STRETCH; | ||
199 | } else if (strcmp(argv[3], "fill") == 0) { | ||
200 | args.mode = BACKGROUND_MODE_FILL; | ||
201 | } else if (strcmp(argv[3], "fit") == 0) { | ||
202 | args.mode = BACKGROUND_MODE_FIT; | ||
203 | } else if (strcmp(argv[3], "center") == 0) { | ||
204 | args.mode = BACKGROUND_MODE_CENTER; | ||
205 | } else if (strcmp(argv[3], "tile") == 0) { | ||
206 | args.mode = BACKGROUND_MODE_TILE; | ||
207 | } else if (strcmp(argv[3], "solid_color") == 0) { | ||
208 | args.mode = BACKGROUND_MODE_SOLID_COLOR; | ||
209 | } else { | ||
210 | wlr_log(L_ERROR, "Unsupported background mode: %s", argv[3]); | ||
211 | return 1; | 200 | return 1; |
212 | } | 201 | } |
213 | |||
214 | if (!prepare_context(&state)) { | 202 | if (!prepare_context(&state)) { |
215 | return 1; | 203 | return 1; |
216 | } | 204 | } |
@@ -244,10 +232,10 @@ int main(int argc, const char **argv) { | |||
244 | zwlr_layer_surface_v1_set_exclusive_zone(state.layer_surface, -1); | 232 | zwlr_layer_surface_v1_set_exclusive_zone(state.layer_surface, -1); |
245 | zwlr_layer_surface_v1_add_listener(state.layer_surface, | 233 | zwlr_layer_surface_v1_add_listener(state.layer_surface, |
246 | &layer_surface_listener, &state); | 234 | &layer_surface_listener, &state); |
247 | state.run_display = true; | ||
248 | wl_surface_commit(state.surface); | 235 | wl_surface_commit(state.surface); |
249 | wl_display_roundtrip(state.display); | 236 | wl_display_roundtrip(state.display); |
250 | 237 | ||
238 | state.run_display = true; | ||
251 | while (wl_display_dispatch(state.display) != -1 && state.run_display) { | 239 | while (wl_display_dispatch(state.display) != -1 && state.run_display) { |
252 | // This space intentionally left blank | 240 | // This space intentionally left blank |
253 | } | 241 | } |