diff options
author | Christoph Gysin <christoph.gysin@gmail.com> | 2015-11-25 16:57:35 +0200 |
---|---|---|
committer | Christoph Gysin <christoph.gysin@gmail.com> | 2015-11-25 21:36:48 +0200 |
commit | 904983c3753f3b1f275dedc1c7841542f77c9f89 (patch) | |
tree | 4c1c0b9e1ec0ea14518019c0bbf113da43e38fad /swaybg | |
parent | swaybg: check for exact number of arguments (diff) | |
download | sway-904983c3753f3b1f275dedc1c7841542f77c9f89.tar.gz sway-904983c3753f3b1f275dedc1c7841542f77c9f89.tar.zst sway-904983c3753f3b1f275dedc1c7841542f77c9f89.zip |
swaybg: implement scaling mode "stretch"
Diffstat (limited to 'swaybg')
-rw-r--r-- | swaybg/main.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/swaybg/main.c b/swaybg/main.c index cb9cc42b..5510f2ef 100644 --- a/swaybg/main.c +++ b/swaybg/main.c | |||
@@ -12,6 +12,10 @@ list_t *surfaces; | |||
12 | 12 | ||
13 | struct registry *registry; | 13 | struct registry *registry; |
14 | 14 | ||
15 | enum scaling_mode_t { | ||
16 | SCALING_MODE_STRETCH, | ||
17 | }; | ||
18 | |||
15 | void sway_terminate(void) { | 19 | void sway_terminate(void) { |
16 | int i; | 20 | int i; |
17 | for (i = 0; i < surfaces->length; ++i) { | 21 | for (i = 0; i < surfaces->length; ++i) { |
@@ -49,16 +53,33 @@ int main(int argc, const char **argv) { | |||
49 | desktop_shell_set_background(registry->desktop_shell, output->output, window->surface); | 53 | desktop_shell_set_background(registry->desktop_shell, output->output, window->surface); |
50 | list_add(surfaces, window); | 54 | list_add(surfaces, window); |
51 | 55 | ||
52 | const char *scaling_mode = argv[3]; | ||
53 | cairo_surface_t *image = cairo_image_surface_create_from_png(argv[2]); | 56 | cairo_surface_t *image = cairo_image_surface_create_from_png(argv[2]); |
54 | double width = cairo_image_surface_get_width(image); | 57 | double width = cairo_image_surface_get_width(image); |
55 | double height = cairo_image_surface_get_height(image); | 58 | double height = cairo_image_surface_get_height(image); |
56 | 59 | ||
60 | const char *scaling_mode_str = argv[3]; | ||
61 | enum scaling_mode_t scaling_mode; | ||
62 | if (strcmp(scaling_mode_str, "stretch") == 0) { | ||
63 | scaling_mode = SCALING_MODE_STRETCH; | ||
64 | } else { | ||
65 | sway_abort("Unsupported scaling mode: %s", scaling_mode_str); | ||
66 | } | ||
67 | |||
57 | for (i = 0; i < surfaces->length; ++i) { | 68 | for (i = 0; i < surfaces->length; ++i) { |
58 | struct window *window = surfaces->items[i]; | 69 | struct window *window = surfaces->items[i]; |
59 | if (window_prerender(window) && window->cairo) { | 70 | if (window_prerender(window) && window->cairo) { |
60 | cairo_scale(window->cairo, window->width / width, window->height / height); | 71 | |
61 | cairo_set_source_surface(window->cairo, image, 0, 0); | 72 | switch (scaling_mode) { |
73 | case SCALING_MODE_STRETCH: | ||
74 | cairo_scale(window->cairo, | ||
75 | (double) window->width / width, | ||
76 | (double) window->height / height); | ||
77 | cairo_set_source_surface(window->cairo, image, 0, 0); | ||
78 | break; | ||
79 | default: | ||
80 | sway_abort("Scaling mode '%s' not implemented yet!", scaling_mode_str); | ||
81 | } | ||
82 | |||
62 | cairo_paint(window->cairo); | 83 | cairo_paint(window->cairo); |
63 | 84 | ||
64 | window_render(window); | 85 | window_render(window); |