Introduction
Introduction Statistics Contact Development Disclaimer Help
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
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.