slock-multi-image-1.5.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
slock-multi-image-1.5.diff (6714B) | |
--- | |
1 From cc85ae2c548660f7ccbcd244dbcfb52420160973 Mon Sep 17 00:00:00 2001 | |
2 From: Drew Marino <[email protected]> | |
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… | |
52 color = len ? INPUT : ((failure || failonclear)… | |
53 if (running && oldc != color) { | |
54 for (screen = 0; screen < nscreens; scr… | |
55 - XSetWindowBackground(dpy, | |
56 - locks[scre… | |
57 - locks[scre… | |
58 + if (colorname[color][0]!='/') | |
59 + XSetWindowBackground(dp… | |
60 + lo… | |
61 + else | |
62 + XSetWindowBackgroundPix… | |
63 + … | |
64 XClearWindow(dpy, locks[screen]… | |
65 } | |
66 oldc = color; | |
67 @@ -220,14 +224,17 @@ readpw(Display *dpy, struct xrandr *rr, struct loc… | |
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 … | |
86 return NULL; | |
87 @@ -235,15 +242,48 @@ lockscreen(Display *dpy, struct xrandr *rr, int sc… | |
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… | |
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… | |
102 + colorname[i], &color, &dummy); | |
103 + lock->colors[i] = color.pixel; | |
104 + } else { | |
105 + lock->colors[i] = XCreatePixmap(dpy, lock->root, | |
106 + DisplayWidth(dp… | |
107 + DisplayHeight(d… | |
108 + DefaultDepth(dp… | |
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, … | |
113 + True, &num_monitors); | |
114 + image = imlib_create_image(XDisplayWidth(dpy, l… | |
115 + XDisplayHeight(dpy, … | |
116 + imlib_context_set_image(image); | |
117 + /* resize the image for each monitor in the scr… | |
118 + for (j=0; j < num_monitors; j++) | |
119 + imlib_blend_image_onto_image(images[i],… | |
120 + img_height… | |
121 + monitors[j… | |
122 + monitors[j… | |
123 + monitors[j… | |
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_re… | |
158 + … | |
159 + die("slock: unable to load image file: … | |
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)) != NUL… | |
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 |