slock-foreground-and-background-20210611-35633d4.diff - sites - public wiki con… | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
slock-foreground-and-background-20210611-35633d4.diff (10213B) | |
--- | |
1 From 61f4d247d4060f42cbdbf2771061f0e165ada3a9 Mon Sep 17 00:00:00 2001 | |
2 From: KNIX 3 <[email protected]> | |
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 log… | |
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} ${FREET… | |
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 $… | |
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) - (logo… | |
146 + lock->rectangles[i].y = (rectangles[i].y * logosize) | |
147 + + lock->yoff + ((lock->mh) / 2) - (logo… | |
148 + lock->rectangles[i].width = rectangles[i].width * logos… | |
149 + lock->rectangles[i].height = rectangles[i].height * log… | |
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, lo… | |
159 + lock->drawable = lock->bgmap; | |
160 + XSetForeground(dpy, lock->gc, lock->colors[color]); | |
161 + XFillRectangles(dpy, lock->drawable, lock->gc, lock->rectangles… | |
162 + XCopyArea(dpy, lock->drawable, lock->win, lock->gc, 0, 0, lock-… | |
163 + XSync(dpy, False); | |
164 +} | |
165 + | |
166 static void | |
167 readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscree… | |
168 const char *hash) | |
169 @@ -190,10 +232,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock… | |
170 color = len ? INPUT : ((failure || failonclear)… | |
171 if (running && oldc != color) { | |
172 for (screen = 0; screen < nscreens; scr… | |
173 - XSetWindowBackground(dpy, | |
174 - locks[scre… | |
175 - locks[scre… | |
176 - XClearWindow(dpy, locks[screen]… | |
177 + drawlogo(dpy, locks[screen], co… | |
178 } | |
179 oldc = color; | |
180 } | |
181 @@ -228,6 +267,10 @@ lockscreen(Display *dpy, struct xrandr *rr, int scr… | |
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 … | |
191 return NULL; | |
192 @@ -235,27 +278,60 @@ lockscreen(Display *dpy, struct xrandr *rr, int sc… | |
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, … | |
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, JoinMi… | |
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 fai… | |
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 scre… | |
257 XRRSelectInput(dpy, lock->win, RRScreen… | |
258 | |
259 XSelectInput(dpy, lock->root, SubstructureNotif… | |
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… | |
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 < wid… | |
302 + { | |
303 + imlib_image_query_pixel(x+i,y+j… | |
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.al… | |
313 + imlib_image_fill_rectangle(x,y,pixelSize,pixelS… | |
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 |