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 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