slock

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 74c66223a5743aba14789cfb07ffae1e9d4d6bc8
parent c07648d3f9226db04db0711fc62693f5317e9609
Author: bakkeby <bakkeby@gmail.com>
Date:   Mon,  3 Aug 2020 16:56:33 +0200

Adding blur pixelated screen patch

Diffstat:
MREADME.md | 5++++-
Mconfig.def.h | 11+++++++++++
Mconfig.mk | 5++++-
Apatch/blur_pixelated_screen.c | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apatch/blur_pixelated_screen.h | 5+++++
Mpatch/include.c | 4++++
Mpatch/include.h | 4++++
Mpatches.def.h | 7+++++++
Mslock.c | 22++++++++++++++++++++++
9 files changed, 132 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md @@ -15,7 +15,7 @@ Refer to [https://tools.suckless.org/slock/](https://tools.suckless.org/slock/) ### Changelog: -2020-08-03 - Added keypress_feedback patch +2020-08-03 - Added keypress_feedback and blur_pixelated_screen patches 2019-11-27 - Added xresources patch @@ -25,6 +25,9 @@ Refer to [https://tools.suckless.org/slock/](https://tools.suckless.org/slock/) ### Patches included: + - [blur_pixelated_screen](https://tools.suckless.org/slock/patches/blur-pixelated-screen/) + - sets the lockscreen picture to a blured or pixelated screenshot + - [capscolor](https://tools.suckless.org/slock/patches/capscolor/) - adds an additional color to indicate the state of Caps Lock diff --git a/config.def.h b/config.def.h @@ -37,6 +37,17 @@ ResourcePref resources[] = { /* treat a cleared input like a wrong password (color) */ static const int failonclear = 1; +#if BLUR_PIXELATED_SCREEN_PATCH +/* Enable blur */ +#define BLUR +/* Set blur radius */ +static const int blurRadius=5; +/* Enable Pixelation */ +//#define PIXELATION +/* Set pixelation radius */ +static const int pixelSize=10; +#endif // BLUR_PIXELATED_SCREEN_PATCH + #if CONTROLCLEAR_PATCH /* allow control key to trigger fail on clear */ static const int controlkeyclear = 0; diff --git a/config.mk b/config.mk @@ -16,9 +16,12 @@ X11LIB = /usr/X11R6/lib # Uncomment for pam auth patch / PAMAUTH_PATCH #PAM=-lpam +# Uncomment for blur pixelated screen patch / BLUR_PIXELATED_SCREEN_PATCH +#IMLIB=-lImlib2 + # includes and libs INCS = -I. -I/usr/include -I${X11INC} -LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr ${XINERAMA} ${PAM} +LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr ${XINERAMA} ${PAM} ${IMLIB} # flags CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H diff --git a/patch/blur_pixelated_screen.c b/patch/blur_pixelated_screen.c @@ -0,0 +1,70 @@ +#include <Imlib2.h> + +Imlib_Image image; + +void +render_lock_image(Display *dpy, struct lock *lock, Imlib_Image image) +{ + 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(); + } +} + +void +create_lock_image(Display *dpy) +{ + /* 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 +} +\ No newline at end of file diff --git a/patch/blur_pixelated_screen.h b/patch/blur_pixelated_screen.h @@ -0,0 +1,4 @@ +#include <Imlib2.h> + +static void create_lock_image(Display *dpy); +static void render_lock_image(Display *dpy, struct lock *lock, Imlib_Image image); +\ No newline at end of file diff --git a/patch/include.c b/patch/include.c @@ -1,4 +1,8 @@ /* Patches */ +#if BLUR_PIXELATED_SCREEN_PATCH +#include "blur_pixelated_screen.c" +#endif + #if MESSAGE_PATCH #include "message.c" #endif diff --git a/patch/include.h b/patch/include.h @@ -1,4 +1,8 @@ /* Patches */ +#if BLUR_PIXELATED_SCREEN_PATCH +#include "blur_pixelated_screen.h" +#endif + #if PAMAUTH_PATCH #include "pamauth.h" #endif diff --git a/patches.def.h b/patches.def.h @@ -9,6 +9,13 @@ /* Patches */ +/* This patch sets the lockscreen picture to a blured or pixelated screenshot. + * This patch depends on the Imlib2 library, uncomment the relevant line in + * config.mk when enabling this patch. + * https://tools.suckless.org/slock/patches/blur-pixelated-screen/ + */ +#define BLUR_PIXELATED_SCREEN_PATCH 0 + /* This patch introduces an additional color to indicate the state of Caps Lock. * https://tools.suckless.org/slock/patches/capscolor/ */ diff --git a/slock.c b/slock.c @@ -65,6 +65,9 @@ struct lock { int screen; Window root, win; Pixmap pmap; + #if BLUR_PIXELATED_SCREEN_PATCH + Pixmap bgmap; + #endif // BLUR_PIXELATED_SCREEN_PATCH unsigned long colors[NUMCOLS]; }; @@ -321,9 +324,16 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, #endif // CAPSCOLOR_PATCH if (running && oldc != color) { for (screen = 0; screen < nscreens; screen++) { + #if BLUR_PIXELATED_SCREEN_PATCH + if (locks[screen]->bgmap) + XSetWindowBackgroundPixmap(dpy, locks[screen]->win, locks[screen]->bgmap); + else + XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[0]); + #else XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[color]); + #endif // BLUR_PIXELATED_SCREEN_PATCH XClearWindow(dpy, locks[screen]->win); #if MESSAGE_PATCH writemessage(dpy, locks[screen]->win, screen); @@ -369,6 +379,10 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) lock->screen = screen; lock->root = RootWindow(dpy, lock->screen); + #if BLUR_PIXELATED_SCREEN_PATCH + render_lock_image(dpy, lock, image); + #endif // BLUR_PIXELATED_SCREEN_PATCH + for (i = 0; i < NUMCOLS; i++) { XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), colorname[i], &color, &dummy); @@ -385,6 +399,10 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) CopyFromParent, DefaultVisual(dpy, lock->screen), CWOverrideRedirect | CWBackPixel, &wa); + #if BLUR_PIXELATED_SCREEN_PATCH + if (lock->bgmap) + XSetWindowBackgroundPixmap(dpy, lock->win, lock->bgmap); + #endif // BLUR_PIXELATED_SCREEN_PATCH lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8); invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap, &color, &color, 0, 0); @@ -528,6 +546,10 @@ main(int argc, char **argv) { if (setuid(duid) < 0) die("slock: setuid: %s\n", strerror(errno)); + #if BLUR_PIXELATED_SCREEN_PATCH + create_lock_image(dpy); + #endif // BLUR_PIXELATED_SCREEN_PATCH + #if XRESOURCES_PATCH config_init(dpy); #endif // XRESOURCES_PATCH