slock-multi-image-1.5.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       slock-multi-image-1.5.diff (6714B)
       ---
            1 From cc85ae2c548660f7ccbcd244dbcfb52420160973 Mon Sep 17 00:00:00 2001
            2 From: Drew Marino <drewmarino25@gmail.com>
            3 Date: Sat, 2 Dec 2023 02:30:59 -0500
            4 Subject: [PATCH] Allow for per-status images instead of colors
            5 
            6 ---
            7  config.def.h |  3 +-
            8  config.mk    |  2 +-
            9  slock.c      | 78 ++++++++++++++++++++++++++++++++++++++++++++--------
           10  3 files changed, 70 insertions(+), 13 deletions(-)
           11 
           12 diff --git a/config.def.h b/config.def.h
           13 index 9855e21..ee79df9 100644
           14 --- a/config.def.h
           15 +++ b/config.def.h
           16 @@ -1,7 +1,8 @@
           17  /* user and group to drop privileges to */
           18  static const char *user  = "nobody";
           19 -static const char *group = "nogroup";
           20 +static const char *group = "nobody";
           21  
           22 +/* image files can be used if absolute path is given */
           23  static const char *colorname[NUMCOLS] = {
           24          [INIT] =   "black",     /* after initialization */
           25          [INPUT] =  "#005577",   /* during input */
           26 diff --git a/config.mk b/config.mk
           27 index 514c236..db0641c 100644
           28 --- a/config.mk
           29 +++ b/config.mk
           30 @@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib
           31  
           32  # includes and libs
           33  INCS = -I. -I/usr/include -I${X11INC}
           34 -LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr
           35 +LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lImlib2
           36  
           37  # flags
           38  CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H
           39 diff --git a/slock.c b/slock.c
           40 index b2f14e3..a0378df 100644
           41 --- a/slock.c
           42 +++ b/slock.c
           43 @@ -18,6 +18,7 @@
           44  #include <X11/keysym.h>
           45  #include <X11/Xlib.h>
           46  #include <X11/Xutil.h>
           47 +#include <Imlib2.h>
           48  
           49  #include "arg.h"
           50  #include "util.h"
           51 @@ -190,9 +191,12 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
           52                          color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT);
           53                          if (running && oldc != color) {
           54                                  for (screen = 0; screen < nscreens; screen++) {
           55 -                                        XSetWindowBackground(dpy,
           56 -                                                             locks[screen]->win,
           57 -                                                             locks[screen]->colors[color]);
           58 +                                        if (colorname[color][0]!='/')
           59 +                                                XSetWindowBackground(dpy, locks[screen]->win,
           60 +                                                                     locks[screen]->colors[color]);
           61 +                                        else
           62 +                                                XSetWindowBackgroundPixmap(dpy, locks[screen]->win,
           63 +                                                                           locks[screen]->colors[color]);
           64                                          XClearWindow(dpy, locks[screen]->win);
           65                                  }
           66                                  oldc = color;
           67 @@ -220,14 +224,17 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
           68  }
           69  
           70  static struct lock *
           71 -lockscreen(Display *dpy, struct xrandr *rr, int screen)
           72 +lockscreen(Display *dpy, struct xrandr *rr, int screen,
           73 +           Imlib_Image images[NUMCOLS])
           74  {
           75          char curs[] = {0, 0, 0, 0, 0, 0, 0, 0};
           76 -        int i, ptgrab, kbgrab;
           77 +        int i, j, ptgrab, kbgrab, num_monitors, img_width, img_height;
           78          struct lock *lock;
           79          XColor color, dummy;
           80          XSetWindowAttributes wa;
           81          Cursor invisible;
           82 +        Imlib_Image image;
           83 +        XRRMonitorInfo *monitors;
           84  
           85          if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(struct lock))))
           86                  return NULL;
           87 @@ -235,15 +242,48 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
           88          lock->screen = screen;
           89          lock->root = RootWindow(dpy, lock->screen);
           90  
           91 +        /* set colors for each state, if is image render the image into pixmap */
           92 +        imlib_context_set_display(dpy);
           93 +        imlib_context_set_visual(DefaultVisual(dpy, lock->screen));
           94 +        imlib_context_set_colormap(DefaultColormap(dpy, lock->screen));
           95 +
           96          for (i = 0; i < NUMCOLS; i++) {
           97 -                XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen),
           98 -                                 colorname[i], &color, &dummy);
           99 -                lock->colors[i] = color.pixel;
          100 +                if (colorname[i][0]!='/') {
          101 +                        XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen),
          102 +                                         colorname[i], &color, &dummy);
          103 +                        lock->colors[i] = color.pixel;
          104 +                } else {
          105 +                        lock->colors[i] = XCreatePixmap(dpy, lock->root,
          106 +                                                        DisplayWidth(dpy, lock->screen),
          107 +                                                        DisplayHeight(dpy, lock->screen),
          108 +                                                        DefaultDepth(dpy, lock->screen));
          109 +                        imlib_context_set_image(images[i]);
          110 +                        img_width = imlib_image_get_width();
          111 +                        img_height = imlib_image_get_height();
          112 +                        monitors = XRRGetMonitors(dpy, RootWindow(dpy, lock->screen),
          113 +                                                  True, &num_monitors);
          114 +                        image = imlib_create_image(XDisplayWidth(dpy, lock->screen),
          115 +                                                   XDisplayHeight(dpy, lock->screen));
          116 +                        imlib_context_set_image(image);
          117 +                        /* resize the image for each monitor in the screen */
          118 +                        for (j=0; j < num_monitors; j++)
          119 +                                imlib_blend_image_onto_image(images[i], 0, 0, 0, img_width,
          120 +                                                             img_height, monitors[j].x,
          121 +                                                             monitors[j].y,
          122 +                                                             monitors[j].width,
          123 +                                                             monitors[j].height);
          124 +                        imlib_context_set_drawable(lock->colors[i]);
          125 +                        imlib_render_image_on_drawable(0, 0);
          126 +                        imlib_free_image();
          127 +                }
          128          }
          129  
          130          /* init */
          131          wa.override_redirect = 1;
          132 -        wa.background_pixel = lock->colors[INIT];
          133 +        if (colorname[INIT][0]!='/')
          134 +                wa.background_pixel = lock->colors[INIT];
          135 +        else
          136 +                wa.background_pixmap = lock->colors[INIT];
          137          lock->win = XCreateWindow(dpy, lock->root, 0, 0,
          138                                    DisplayWidth(dpy, lock->screen),
          139                                    DisplayHeight(dpy, lock->screen),
          140 @@ -313,7 +353,8 @@ main(int argc, char **argv) {
          141          gid_t dgid;
          142          const char *hash;
          143          Display *dpy;
          144 -        int s, nlocks, nscreens;
          145 +        int s, i, nlocks, nscreens;
          146 +        Imlib_Image images[NUMCOLS];
          147  
          148          ARGBEGIN {
          149          case 'v':
          150 @@ -347,6 +388,14 @@ main(int argc, char **argv) {
          151          if (!(dpy = XOpenDisplay(NULL)))
          152                  die("slock: cannot open display\n");
          153  
          154 +        /* load image files, if there are any */
          155 +        for (i = 0; i < NUMCOLS; i++)
          156 +                if (colorname[i][0]=='/')
          157 +                        if ((images[i] = imlib_load_image_with_errno_return(colorname[i],
          158 +                                                                            &errno))==NULL)
          159 +                                die("slock: unable to load image file: %s: %s\n",
          160 +                                    colorname[i], strerror(errno));
          161 +
          162          /* drop privileges */
          163          if (setgroups(0, NULL) < 0)
          164                  die("slock: setgroups: %s\n", strerror(errno));
          165 @@ -363,7 +412,7 @@ main(int argc, char **argv) {
          166          if (!(locks = calloc(nscreens, sizeof(struct lock *))))
          167                  die("slock: out of memory\n");
          168          for (nlocks = 0, s = 0; s < nscreens; s++) {
          169 -                if ((locks[s] = lockscreen(dpy, &rr, s)) != NULL)
          170 +                if ((locks[s] = lockscreen(dpy, &rr, s, images)) != NULL)
          171                          nlocks++;
          172                  else
          173                          break;
          174 @@ -374,6 +423,13 @@ main(int argc, char **argv) {
          175          if (nlocks != nscreens)
          176                  return 1;
          177  
          178 +        /* unload image files */
          179 +        for (i = 0; i < NUMCOLS; i++)
          180 +                if (colorname[i][0]=='/') {
          181 +                        imlib_context_set_image(images[i]);
          182 +                        imlib_free_image();
          183 +                }
          184 +
          185          /* run post-lock command */
          186          if (argc > 0) {
          187                  switch (fork()) {
          188 -- 
          189 2.43.0
          190