i3lock-color

The world's most popular non-default computer lockscreen.
Index Commits Files Refs README LICENSE
commit 10546fcd722e5c04c67118972b5ffa3851a2c322
parent 91092a1bf1c24a9ea82f169f3d4502ad3bc5fdeb
Author: Rio6 <rio.liu@r26.me>
Date:   Sun, 30 May 2021 01:37:26 -0400

implement bg scaling

Diffstat:
Mi3lock.c | 13+++++++------
Munlock_indicator.c | 30++++++++++++++++++++++--------
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: