commit 10546fcd722e5c04c67118972b5ffa3851a2c322
parent 91092a1bf1c24a9ea82f169f3d4502ad3bc5fdeb
Author: Rio6 <rio.liu@r26.me>
Date: Sun, 30 May 2021 01:37:26 -0400
implement bg scaling
Diffstat:
2 files changed, 29 insertions(+), 14 deletions(-)
diff --git a/i3lock.c b/i3lock.c
@@ -1436,7 +1436,7 @@ int main(int argc, char *argv[]) {
{"centered", no_argument, NULL, 'C'},
{"fill", no_argument, NULL, 'F'},
{"scale", no_argument, NULL, 'L'},
- {"scale", no_argument, NULL, 'M'},
+ {"max", no_argument, NULL, 'M'},
{"ignore-empty-password", no_argument, NULL, 'e'},
{"inactivity-timeout", required_argument, NULL, 'I'},
{"show-failed-attempts", no_argument, NULL, 'f'},
@@ -1627,30 +1627,31 @@ int main(int argc, char *argv[]) {
break;
case 't':
if(bg_type != NONE) {
- errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict.");
+ errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used.");
}
bg_type = TILE;
break;
case 'C':
if(bg_type != NONE) {
- errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict.");
+ errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used.");
}
bg_type = CENTER;
break;
case 'F':
if(bg_type != NONE) {
- errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict.");
+ errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used.");
}
bg_type = FILL;
+ break;
case 'L':
if(bg_type != NONE) {
- errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict.");
+ errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used.");
}
bg_type = SCALE;
break;
case 'M':
if(bg_type != NONE) {
- errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict.");
+ errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used.");
}
bg_type = MAX;
break;
diff --git a/unlock_indicator.c b/unlock_indicator.c
@@ -1110,22 +1110,36 @@ void draw_image(uint32_t* root_resolution, cairo_surface_t *img, cairo_t* xcb_ct
case FILL:
case SCALE:
case MAX:
- cairo_save(xcb_ctx);
for (int i = 0; i < xr_screens; i++) {
- // Paint around center of monitor
- double origin_x = xr_resolutions[i].x + (xr_resolutions[i].width / 2.0 - image_width / 2.0);
- double origin_y = xr_resolutions[i].y + (xr_resolutions[i].height / 2.0 - image_height / 2.0);
+ cairo_save(xcb_ctx);
+ // Scale image according to bg_type and aspect ratios
+ double scale_x = 1, scale_y = 1;
if (bg_type == SCALE) {
- cairo_scale(xcb_ctx,
- (double) xr_resolutions[i].width / image_width,
- (double) xr_resolutions[i].height / image_height);
+ scale_x = xr_resolutions[i].width / image_width;
+ scale_y = xr_resolutions[i].height / image_height;
+ } else {
+ double aspect_diff = (double) xr_resolutions[i].height / xr_resolutions[i].width - image_height / image_width;
+ if((bg_type == MAX && aspect_diff > 0) || (bg_type == FILL && aspect_diff < 0)) {
+ scale_x = scale_y = xr_resolutions[i].width / image_width;
+ } else if ((bg_type == MAX && aspect_diff < 0) || (bg_type == FILL && aspect_diff > 0)) {
+ scale_x = scale_y = xr_resolutions[i].height / image_height;
+ }
+ }
+
+ if (scale_x != 0 || scale_y != 0) {
+ cairo_scale(xcb_ctx, scale_x, scale_y);
}
+ // Place image in the middle
+ double origin_x = (xr_resolutions[i].x + xr_resolutions[i].width / 2) / scale_x - image_width / 2;
+ double origin_y = (xr_resolutions[i].y + xr_resolutions[i].height / 2) / scale_y - image_height / 2;
+
cairo_set_source_surface(xcb_ctx, img, origin_x, origin_y);
cairo_paint(xcb_ctx);
+
+ cairo_restore(xcb_ctx);
}
- cairo_restore(xcb_ctx);
break;
case TILE: