summaryrefslogtreecommitdiff
path: root/clients/desktop-shell.c
diff options
context:
space:
mode:
Diffstat (limited to 'clients/desktop-shell.c')
-rw-r--r--clients/desktop-shell.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c
index 3b71403b..40dd1ddf 100644
--- a/clients/desktop-shell.c
+++ b/clients/desktop-shell.c
@@ -660,6 +660,7 @@ panel_add_launcher(struct panel *panel, const char *icon, const char *path)
enum {
BACKGROUND_SCALE,
+ BACKGROUND_SCALE_CROP,
BACKGROUND_TILE
};
@@ -671,7 +672,9 @@ background_draw(struct widget *widget, void *data)
cairo_pattern_t *pattern;
cairo_matrix_t matrix;
cairo_t *cr;
- double sx, sy;
+ double im_w, im_h;
+ double sx, sy, s;
+ double tx, ty;
struct rectangle allocation;
int type = -1;
struct display *display;
@@ -691,6 +694,8 @@ background_draw(struct widget *widget, void *data)
if (strcmp(key_background_type, "scale") == 0)
type = BACKGROUND_SCALE;
+ else if (strcmp(key_background_type, "scale-crop") == 0)
+ type = BACKGROUND_SCALE_CROP;
else if (strcmp(key_background_type, "tile") == 0)
type = BACKGROUND_TILE;
else
@@ -698,20 +703,32 @@ background_draw(struct widget *widget, void *data)
key_background_type);
if (image && type != -1) {
+ im_w = cairo_image_surface_get_width(image);
+ im_h = cairo_image_surface_get_height(image);
+ sx = im_w / allocation.width;
+ sy = im_h / allocation.height;
+
pattern = cairo_pattern_create_for_surface(image);
+
switch (type) {
case BACKGROUND_SCALE:
- sx = (double) cairo_image_surface_get_width(image) /
- allocation.width;
- sy = (double) cairo_image_surface_get_height(image) /
- allocation.height;
cairo_matrix_init_scale(&matrix, sx, sy);
cairo_pattern_set_matrix(pattern, &matrix);
break;
+ case BACKGROUND_SCALE_CROP:
+ s = (sx < sy) ? sx : sy;
+ /* align center */
+ tx = (im_w - s * allocation.width) * 0.5;
+ ty = (im_h - s * allocation.height) * 0.5;
+ cairo_matrix_init_translate(&matrix, tx, ty);
+ cairo_matrix_scale(&matrix, s, s);
+ cairo_pattern_set_matrix(pattern, &matrix);
+ break;
case BACKGROUND_TILE:
cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT);
break;
}
+
cairo_set_source(cr, pattern);
cairo_pattern_destroy (pattern);
cairo_surface_destroy(image);