slock-foreground-and-background-20210611-35633d4.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
slock-foreground-and-background-20210611-35633d4.diff (10213B)
---
1 From 61f4d247d4060f42cbdbf2771061f0e165ada3a9 Mon Sep 17 00:00:00 2001
2 From: KNIX 3 <nki3@protonmail.com>
3 Date: Fri, 11 Jun 2021 13:20:54 -0400
4 Subject: [PATCH] Foreground and Background
5
6 ---
7 config.def.h | 28 +++++++++
8 config.mk | 16 ++++--
9 slock.c | 156 ++++++++++++++++++++++++++++++++++++++++++++++++---
10 3 files changed, 187 insertions(+), 13 deletions(-)
11
12 diff --git a/config.def.h b/config.def.h
13 index 9855e21..ceceeb0 100644
14 --- a/config.def.h
15 +++ b/config.def.h
16 @@ -10,3 +10,31 @@ static const char *colorname[NUMCOLS] = {
17
18 /* treat a cleared input like a wrong password (color) */
19 static const int failonclear = 1;
20 +
21 +/* insert grid pattern with scale 1:1, the size can be changed with logosize */
22 +static const int logosize = 75;
23 +/* grid width and height for right center alignment */
24 +static const int logow = 12;
25 +static const int logoh = 6;
26 +
27 +static XRectangle rectangles[9] = {
28 + /* x y w h */
29 + { 0, 3, 1, 3 },
30 + { 1, 3, 2, 1 },
31 + { 0, 5, 8, 1 },
32 + { 3, 0, 1, 5 },
33 + { 5, 3, 1, 2 },
34 + { 7, 3, 1, 2 },
35 + { 8, 3, 4, 1 },
36 + { 9, 4, 1, 2 },
37 + { 11, 4, 1, 2 },
38 +};
39 +
40 +/*Enable blur*/
41 +#define BLUR
42 +/*Set blur radius*/
43 +static const int blurRadius=5;
44 +/*Enable Pixelation*/
45 +//#define PIXELATION
46 +/*Set pixelation radius*/
47 +static const int pixelSize=0;
48 diff --git a/config.mk b/config.mk
49 index 74429ae..e851ede 100644
50 --- a/config.mk
51 +++ b/config.mk
52 @@ -10,13 +10,21 @@ MANPREFIX = ${PREFIX}/share/man
53 X11INC = /usr/X11R6/include
54 X11LIB = /usr/X11R6/lib
55
56 +# Xinerama
57 +XINERAMALIBS = -lXinerama
58 +XINERAMAFLAGS = -DXINERAMA
59 +
60 +# freetype
61 +FREETYPELIBS = -lXft
62 +FREETYPEINC = /usr/include/freetype2
63 +
64 # includes and libs
65 -INCS = -I. -I/usr/include -I${X11INC}
66 -LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr
67 +INCS = -I. -I/usr/include -I${X11INC} -I${FREETYPEINC}
68 +LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lXext -lXrandr -lImlib2
69
70 # flags
71 -CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H
72 -CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
73 +CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H ${XINERAMAFLAGS}
74 +CFLAGS = -std=c99 -pedantic -Wall -Ofast ${INCS} ${CPPFLAGS}
75 LDFLAGS = -s ${LIBS}
76 COMPATSRC = explicit_bzero.c
77
78 diff --git a/slock.c b/slock.c
79 index 5ae738c..efbe833 100644
80 --- a/slock.c
81 +++ b/slock.c
82 @@ -1,5 +1,6 @@
83 /* See LICENSE file for license details. */
84 -#define _XOPEN_SOURCE 500
85 +#define _XOPEN_SOURCE 500
86 +#define LENGTH(X) (sizeof X / sizeof X[0])
87 #if HAVE_SHADOW_H
88 #include <shadow.h>
89 #endif
90 @@ -15,9 +16,14 @@
91 #include <unistd.h>
92 #include <sys/types.h>
93 #include <X11/extensions/Xrandr.h>
94 +#ifdef XINERAMA
95 +#include <X11/extensions/Xinerama.h>
96 +#endif
97 #include <X11/keysym.h>
98 #include <X11/Xlib.h>
99 #include <X11/Xutil.h>
100 +#include <X11/Xft/Xft.h>
101 +#include <Imlib2.h>
102
103 #include "arg.h"
104 #include "util.h"
105 @@ -31,11 +37,19 @@ enum {
106 NUMCOLS
107 };
108
109 +#include "config.h"
110 +
111 struct lock {
112 int screen;
113 Window root, win;
114 Pixmap pmap;
115 + Pixmap bgmap;
116 unsigned long colors[NUMCOLS];
117 + unsigned int x, y;
118 + unsigned int xoff, yoff, mw, mh;
119 + Drawable drawable;
120 + GC gc;
121 + XRectangle rectangles[LENGTH(rectangles)];
122 };
123
124 struct xrandr {
125 @@ -44,7 +58,7 @@ struct xrandr {
126 int errbase;
127 };
128
129 -#include "config.h"
130 +Imlib_Image image;
131
132 static void
133 die(const char *errstr, ...)
134 @@ -124,6 +138,34 @@ gethash(void)
135 return hash;
136 }
137
138 +static void
139 +resizerectangles(struct lock *lock)
140 +{
141 + int i;
142 +
143 + for (i = 0; i < LENGTH(rectangles); i++){
144 + lock->rectangles[i].x = (rectangles[i].x * logosize)
145 + + lock->xoff + ((lock->mw) / 2) - (logow / 2 * logosize);
146 + lock->rectangles[i].y = (rectangles[i].y * logosize)
147 + + lock->yoff + ((lock->mh) / 2) - (logoh / 2 * logosize);
148 + lock->rectangles[i].width = rectangles[i].width * logosize;
149 + lock->rectangles[i].height = rectangles[i].height * logosize;
150 + }
151 +}
152 +
153 +static void
154 +drawlogo(Display *dpy, struct lock *lock, int color)
155 +{
156 + /*
157 + XSetForeground(dpy, lock->gc, lock->colors[BACKGROUND]);
158 + XFillRectangle(dpy, lock->drawable, lock->gc, 0, 0, lock->x, lock->y); */
159 + lock->drawable = lock->bgmap;
160 + XSetForeground(dpy, lock->gc, lock->colors[color]);
161 + XFillRectangles(dpy, lock->drawable, lock->gc, lock->rectangles, LENGTH(rectangles));
162 + XCopyArea(dpy, lock->drawable, lock->win, lock->gc, 0, 0, lock->x, lock->y, 0, 0);
163 + XSync(dpy, False);
164 +}
165 +
166 static void
167 readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
168 const char *hash)
169 @@ -190,10 +232,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
170 color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT);
171 if (running && oldc != color) {
172 for (screen = 0; screen < nscreens; screen++) {
173 - XSetWindowBackground(dpy,
174 - locks[screen]->win,
175 - locks[screen]->colors[color]);
176 - XClearWindow(dpy, locks[screen]->win);
177 + drawlogo(dpy, locks[screen], color);
178 }
179 oldc = color;
180 }
181 @@ -228,6 +267,10 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
182 XColor color, dummy;
183 XSetWindowAttributes wa;
184 Cursor invisible;
185 +#ifdef XINERAMA
186 + XineramaScreenInfo *info;
187 + int n;
188 +#endif
189
190 if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(struct lock))))
191 return NULL;
192 @@ -235,27 +278,60 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
193 lock->screen = screen;
194 lock->root = RootWindow(dpy, lock->screen);
195
196 + if(image)
197 + {
198 + lock->bgmap = XCreatePixmap(dpy, lock->root, DisplayWidth(dpy, lock->screen), DisplayHeight(dpy, lock->screen), DefaultDepth(dpy, lock->screen));
199 + imlib_context_set_image(image);
200 + imlib_context_set_display(dpy);
201 + imlib_context_set_visual(DefaultVisual(dpy, lock->screen));
202 + imlib_context_set_colormap(DefaultColormap(dpy, lock->screen));
203 + imlib_context_set_drawable(lock->bgmap);
204 + imlib_render_image_on_drawable(0, 0);
205 + imlib_free_image();
206 + }
207 for (i = 0; i < NUMCOLS; i++) {
208 XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen),
209 colorname[i], &color, &dummy);
210 lock->colors[i] = color.pixel;
211 }
212
213 + lock->x = DisplayWidth(dpy, lock->screen);
214 + lock->y = DisplayHeight(dpy, lock->screen);
215 +#ifdef XINERAMA
216 + if ((info = XineramaQueryScreens(dpy, &n))) {
217 + lock->xoff = info[0].x_org;
218 + lock->yoff = info[0].y_org;
219 + lock->mw = info[0].width;
220 + lock->mh = info[0].height;
221 + } else
222 +#endif
223 + {
224 + lock->xoff = lock->yoff = 0;
225 + lock->mw = lock->x;
226 + lock->mh = lock->y;
227 + }
228 + lock->drawable = XCreatePixmap(dpy, lock->root,
229 + lock->x, lock->y, DefaultDepth(dpy, screen));
230 + lock->gc = XCreateGC(dpy, lock->root, 0, NULL);
231 + XSetLineAttributes(dpy, lock->gc, 1, LineSolid, CapButt, JoinMiter);
232 +
233 /* init */
234 wa.override_redirect = 1;
235 - wa.background_pixel = lock->colors[INIT];
236 lock->win = XCreateWindow(dpy, lock->root, 0, 0,
237 - DisplayWidth(dpy, lock->screen),
238 - DisplayHeight(dpy, lock->screen),
239 + lock->x, lock->y,
240 0, DefaultDepth(dpy, lock->screen),
241 CopyFromParent,
242 DefaultVisual(dpy, lock->screen),
243 CWOverrideRedirect | CWBackPixel, &wa);
244 + if(lock->bgmap)
245 + XSetWindowBackgroundPixmap(dpy, lock->win, lock->bgmap);
246 lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8);
247 invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap,
248 &color, &color, 0, 0);
249 XDefineCursor(dpy, lock->win, invisible);
250
251 + resizerectangles(lock);
252 +
253 /* Try to grab mouse pointer *and* keyboard for 600ms, else fail the lock */
254 for (i = 0, ptgrab = kbgrab = -1; i < 6; i++) {
255 if (ptgrab != GrabSuccess) {
256 @@ -276,6 +352,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
257 XRRSelectInput(dpy, lock->win, RRScreenChangeNotifyMask);
258
259 XSelectInput(dpy, lock->root, SubstructureNotifyMask);
260 + drawlogo(dpy, lock, INIT);
261 return lock;
262 }
263
264 @@ -355,6 +432,60 @@ main(int argc, char **argv) {
265 if (setuid(duid) < 0)
266 die("slock: setuid: %s\n", strerror(errno));
267
268 + /*Create screenshot Image*/
269 + Screen *scr = ScreenOfDisplay(dpy, DefaultScreen(dpy));
270 + image = imlib_create_image(scr->width,scr->height);
271 + imlib_context_set_image(image);
272 + imlib_context_set_display(dpy);
273 + imlib_context_set_visual(DefaultVisual(dpy,0));
274 + imlib_context_set_drawable(RootWindow(dpy,XScreenNumberOfScreen(scr)));
275 + imlib_copy_drawable_to_image(0,0,0,scr->width,scr->height,0,0,1);
276 +
277 +#ifdef BLUR
278 +
279 + /*Blur function*/
280 + imlib_image_blur(blurRadius);
281 +#endif // BLUR
282 +
283 +#ifdef PIXELATION
284 + /*Pixelation*/
285 + int width = scr->width;
286 + int height = scr->height;
287 +
288 + for(int y = 0; y < height; y += pixelSize)
289 + {
290 + for(int x = 0; x < width; x += pixelSize)
291 + {
292 + int red = 0;
293 + int green = 0;
294 + int blue = 0;
295 +
296 + Imlib_Color pixel;
297 + Imlib_Color* pp;
298 + pp = &pixel;
299 + for(int j = 0; j < pixelSize && j < height; j++)
300 + {
301 + for(int i = 0; i < pixelSize && i < width; i++)
302 + {
303 + imlib_image_query_pixel(x+i,y+j,pp);
304 + red += pixel.red;
305 + green += pixel.green;
306 + blue += pixel.blue;
307 + }
308 + }
309 + red /= (pixelSize*pixelSize);
310 + green /= (pixelSize*pixelSize);
311 + blue /= (pixelSize*pixelSize);
312 + imlib_context_set_color(red,green,blue,pixel.alpha);
313 + imlib_image_fill_rectangle(x,y,pixelSize,pixelSize);
314 + red = 0;
315 + green = 0;
316 + blue = 0;
317 + }
318 + }
319 +
320 +
321 +#endif
322 /* check for Xrandr support */
323 rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase);
324
325 @@ -391,5 +522,12 @@ main(int argc, char **argv) {
326 /* everything is now blank. Wait for the correct password */
327 readpw(dpy, &rr, locks, nscreens, hash);
328
329 + for (nlocks = 0, s = 0; s < nscreens; s++) {
330 + XFreePixmap(dpy, locks[s]->drawable);
331 + XFreeGC(dpy, locks[s]->gc);
332 + }
333 +
334 + XSync(dpy, 0);
335 + XCloseDisplay(dpy);
336 return 0;
337 }
338 --
339 2.31.1
340