apply blured or pixelated screenshot patch
This commit is contained in:
		
							
								
								
									
										11
									
								
								config.def.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								config.def.h
									
									
									
									
									
								
							| @@ -9,4 +9,13 @@ static const char *colorname[NUMCOLS] = { | ||||
| }; | ||||
|  | ||||
| /* treat a cleared input like a wrong password (color) */ | ||||
| static const int failonclear = 1; | ||||
| static const int failonclear = 0; | ||||
|  | ||||
| /*Enable blur*/ | ||||
| //#define BLUR | ||||
| /*Set blur radius*/ | ||||
| static const int blurRadius=5; | ||||
| /*Enable Pixelation*/ | ||||
| #define PIXELATION | ||||
| /*Set pixelation radius*/ | ||||
| static const int pixelSize=10; | ||||
|   | ||||
| @@ -12,11 +12,11 @@ X11LIB = /usr/X11R6/lib | ||||
|  | ||||
| # includes and libs | ||||
| INCS = -I. -I/usr/include -I${X11INC} | ||||
| LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr | ||||
| LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lImlib2 | ||||
|  | ||||
| # flags | ||||
| CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H | ||||
| CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} | ||||
| CFLAGS = -std=c99 -pedantic -Wall -Ofast ${INCS} ${CPPFLAGS} | ||||
| LDFLAGS = -s ${LIBS} | ||||
| COMPATSRC = explicit_bzero.c | ||||
|  | ||||
|   | ||||
							
								
								
									
										12
									
								
								readme
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								readme
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| slock | ||||
| ===== | ||||
| Simple X display locker. | ||||
|  | ||||
| Configuration | ||||
| ------------- | ||||
| slock is configured via config.h like most other suckless.org software. | ||||
|  | ||||
| Patches | ||||
| ------- | ||||
|  | ||||
| - blured screen: https://tools.suckless.org/slock/patches/blur-pixelated-screen/ | ||||
							
								
								
									
										77
									
								
								slock.c
									
									
									
									
									
								
							
							
						
						
									
										77
									
								
								slock.c
									
									
									
									
									
								
							| @@ -18,6 +18,7 @@ | ||||
| #include <X11/keysym.h> | ||||
| #include <X11/Xlib.h> | ||||
| #include <X11/Xutil.h> | ||||
| #include <Imlib2.h> | ||||
|  | ||||
| #include "arg.h" | ||||
| #include "util.h" | ||||
| @@ -35,6 +36,7 @@ struct lock { | ||||
| 	int screen; | ||||
| 	Window root, win; | ||||
| 	Pixmap pmap; | ||||
| 	Pixmap bgmap; | ||||
| 	unsigned long colors[NUMCOLS]; | ||||
| }; | ||||
|  | ||||
| @@ -46,6 +48,8 @@ struct xrandr { | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| Imlib_Image image; | ||||
|  | ||||
| static void | ||||
| die(const char *errstr, ...) | ||||
| { | ||||
| @@ -190,9 +194,10 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, | ||||
| 			color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT); | ||||
| 			if (running && oldc != color) { | ||||
| 				for (screen = 0; screen < nscreens; screen++) { | ||||
| 					XSetWindowBackground(dpy, | ||||
| 					                     locks[screen]->win, | ||||
| 					                     locks[screen]->colors[color]); | ||||
|                     if(locks[screen]->bgmap) | ||||
|                         XSetWindowBackgroundPixmap(dpy, locks[screen]->win, locks[screen]->bgmap); | ||||
|                     else | ||||
|                         XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[0]); | ||||
| 					XClearWindow(dpy, locks[screen]->win); | ||||
| 				} | ||||
| 				oldc = color; | ||||
| @@ -227,6 +232,17 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) | ||||
| 	lock->screen = screen; | ||||
| 	lock->root = RootWindow(dpy, lock->screen); | ||||
|  | ||||
|     if(image) | ||||
|     { | ||||
|         lock->bgmap = XCreatePixmap(dpy, lock->root, DisplayWidth(dpy, lock->screen), DisplayHeight(dpy, lock->screen), DefaultDepth(dpy, lock->screen)); | ||||
|         imlib_context_set_image(image); | ||||
|         imlib_context_set_display(dpy); | ||||
|         imlib_context_set_visual(DefaultVisual(dpy, lock->screen)); | ||||
|         imlib_context_set_colormap(DefaultColormap(dpy, lock->screen)); | ||||
|         imlib_context_set_drawable(lock->bgmap); | ||||
|         imlib_render_image_on_drawable(0, 0); | ||||
|         imlib_free_image(); | ||||
|     } | ||||
| 	for (i = 0; i < NUMCOLS; i++) { | ||||
| 		XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), | ||||
| 		                 colorname[i], &color, &dummy); | ||||
| @@ -243,6 +259,8 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) | ||||
| 	                          CopyFromParent, | ||||
| 	                          DefaultVisual(dpy, lock->screen), | ||||
| 	                          CWOverrideRedirect | CWBackPixel, &wa); | ||||
|     if(lock->bgmap) | ||||
|         XSetWindowBackgroundPixmap(dpy, lock->win, lock->bgmap); | ||||
| 	lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8); | ||||
| 	invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap, | ||||
| 	                                &color, &color, 0, 0); | ||||
| @@ -347,6 +365,59 @@ main(int argc, char **argv) { | ||||
| 	if (setuid(duid) < 0) | ||||
| 		die("slock: setuid: %s\n", strerror(errno)); | ||||
|  | ||||
| 	/*Create screenshot Image*/ | ||||
| 	Screen *scr = ScreenOfDisplay(dpy, DefaultScreen(dpy)); | ||||
| 	image = imlib_create_image(scr->width,scr->height); | ||||
| 	imlib_context_set_image(image); | ||||
| 	imlib_context_set_display(dpy); | ||||
| 	imlib_context_set_visual(DefaultVisual(dpy,0)); | ||||
| 	imlib_context_set_drawable(RootWindow(dpy,XScreenNumberOfScreen(scr))); | ||||
| 	imlib_copy_drawable_to_image(0,0,0,scr->width,scr->height,0,0,1); | ||||
|  | ||||
| #ifdef BLUR | ||||
|  | ||||
| 	/*Blur function*/ | ||||
| 	imlib_image_blur(blurRadius); | ||||
| #endif // BLUR | ||||
|  | ||||
| #ifdef PIXELATION | ||||
| 	/*Pixelation*/ | ||||
| 	int width = scr->width; | ||||
| 	int height = scr->height; | ||||
|  | ||||
| 	for(int y = 0; y < height; y += pixelSize) | ||||
| 	{ | ||||
| 		for(int x = 0; x < width; x += pixelSize) | ||||
| 		{ | ||||
| 			int red = 0; | ||||
| 			int green = 0; | ||||
| 			int blue = 0; | ||||
|  | ||||
| 			Imlib_Color pixel; | ||||
| 			Imlib_Color* pp; | ||||
| 			pp = &pixel; | ||||
| 			for(int j = 0; j < pixelSize && j < height; j++) | ||||
| 			{ | ||||
| 				for(int i = 0; i < pixelSize && i < width; i++) | ||||
| 				{ | ||||
| 					imlib_image_query_pixel(x+i,y+j,pp); | ||||
| 					red += pixel.red; | ||||
| 					green += pixel.green; | ||||
| 					blue += pixel.blue; | ||||
| 				} | ||||
| 			} | ||||
| 			red /= (pixelSize*pixelSize); | ||||
| 			green /= (pixelSize*pixelSize); | ||||
| 			blue /= (pixelSize*pixelSize); | ||||
| 			imlib_context_set_color(red,green,blue,pixel.alpha); | ||||
| 			imlib_image_fill_rectangle(x,y,pixelSize,pixelSize); | ||||
| 			red = 0; | ||||
| 			green = 0; | ||||
| 			blue = 0; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| #endif | ||||
| 	/* check for Xrandr support */ | ||||
| 	rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user