From e71a42ee2b0a1c9a9b109a946f6cd6f10ae84a4f Mon Sep 17 00:00:00 2001 From: bakkeby Date: Mon, 28 Mar 2022 14:22:21 +0200 Subject: [PATCH] Adding background image patch --- README.md | 5 +++++ config.def.h | 24 ++++++++++++++------ config.mk | 2 +- patch/background_image.c | 47 ++++++++++++++++++++++++++++++++++++++++ patch/background_image.h | 4 ++++ patch/include.c | 4 +++- patch/include.h | 4 +++- patches.def.h | 9 ++++++++ slock.c | 22 +++++++++---------- 9 files changed, 100 insertions(+), 21 deletions(-) create mode 100644 patch/background_image.c create mode 100644 patch/background_image.h diff --git a/README.md b/README.md index 036c391e14d2c3cb6adbb7149f2ec014a4d94352..d4dbf47573c6f7744f23c3516237f0dbba990f2b 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,8 @@ slock tool, how to install it and how it works. ### Changelog: +2022-03-28 - Added the background image patch + 2021-09-13 - Added the dwm logo patch 2021-09-09 - Added the auto-timeout, failure-command and secret-password patches @@ -49,6 +51,9 @@ slock tool, how to install it and how it works. - [auto-timeout](https://tools.suckless.org/slock/patches/auto-timeout/) - allows for a command to be executed after a specified time of inactivity + - [background_image](https://tools.suckless.org/slock/patches/background-image/) + - sets the lockscreen picture to a background image + - [blur_pixelated_screen](https://tools.suckless.org/slock/patches/blur-pixelated-screen/) - sets the lockscreen picture to a blured or pixelated screenshot diff --git a/config.def.h b/config.def.h index 2d19321b165b604fc58cfead45b59c600216f3ac..9f7baac1e113a059a1fc9d452b2607716f409568 100644 --- a/config.def.h +++ b/config.def.h @@ -31,6 +31,11 @@ static const char * text_color = "#ffffff"; static const char * font_name = "6x10"; #endif // MESSAGE_PATCH | COLOR_MESSAGE_PATCH +#if BACKGROUND_IMAGE_PATCH +/* Background image path, should be available to the user above */ +static const char * background_image = ""; +#endif // BACKGROUND_IMAGE_PATCH + #if DWM_LOGO_PATCH /* insert grid pattern with scale 1:1, the size can be changed with logosize */ static const int logosize = 75; @@ -57,19 +62,24 @@ static XRectangle rectangles[] = { */ ResourcePref resources[] = { #if DWM_LOGO_PATCH && !BLUR_PIXELATED_SCREEN_PATCH - { "color2", STRING, &colorname[BACKGROUND] }, + { "background", STRING, &colorname[BACKGROUND] }, #endif //DWM_LOGO_PATCH - { "color0", STRING, &colorname[INIT] }, - { "color4", STRING, &colorname[INPUT] }, - { "color1", STRING, &colorname[FAILED] }, + #if BACKGROUND_IMAGE_PATCH + { "bg_image", STRING, &background_image }, + #endif // BACKGROUND_IMAGE_PATCH + { "locked", STRING, &colorname[INIT] }, + { "input", STRING, &colorname[INPUT] }, + { "failed", STRING, &colorname[FAILED] }, #if CAPSCOLOR_PATCH - { "color3", STRING, &colorname[CAPS] }, + { "capslock", STRING, &colorname[CAPS] }, #endif // CAPSCOLOR_PATCH #if PAMAUTH_PATCH - { "color5", STRING, &colorname[PAM] }, + { "pamauth", STRING, &colorname[PAM] }, #endif // PAMAUTH_PATCH #if MESSAGE_PATCH || COLOR_MESSAGE_PATCH - { "color6", STRING, &text_color }, + { "message", STRING, &message }, + { "text_color", STRING, &text_color }, + { "font_name", STRING, &font_name }, #endif // MESSAGE_PATCH | COLOR_MESSAGE_PATCH }; #endif // XRESOURCES_PATCH diff --git a/config.mk b/config.mk index 4eff4ab4fd33f91429fa93de1f40a26ecf2dc181..07a33da5a87d6b300d6b31481dddce868018b214 100644 --- a/config.mk +++ b/config.mk @@ -17,7 +17,7 @@ X11LIB = /usr/X11R6/lib # Uncomment for pam auth patch / PAMAUTH_PATCH #PAM=-lpam -# Uncomment for blur pixelated screen patch / BLUR_PIXELATED_SCREEN_PATCH +# Uncomment for blur pixelated screen and background image patches / BLUR_PIXELATED_SCREEN_PATCH, BACKGROUND_IMAGE_PATCH #IMLIB=-lImlib2 # includes and libs diff --git a/patch/background_image.c b/patch/background_image.c new file mode 100644 index 0000000000000000000000000000000000000000..4f64c1f5cd2980d4cc57f54e4938fdb35b5e5a85 --- /dev/null +++ b/patch/background_image.c @@ -0,0 +1,47 @@ +#include + +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_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) +{ + /* Load picture */ + Imlib_Image buffer = imlib_load_image(background_image); + imlib_context_set_image(buffer); + int background_image_width = imlib_image_get_width(); + int background_image_height = imlib_image_get_height(); + + /* Create an image to be rendered */ + Screen *scr = ScreenOfDisplay(dpy, DefaultScreen(dpy)); + image = imlib_create_image(scr->width, scr->height); + imlib_context_set_image(image); + + /* Fill the image for every X monitor */ + XRRMonitorInfo *monitors; + int number_of_monitors; + monitors = XRRGetMonitors(dpy, RootWindow(dpy, XScreenNumberOfScreen(scr)), True, &number_of_monitors); + + int i; + for (i = 0; i < number_of_monitors; i++) { + imlib_blend_image_onto_image(buffer, 0, 0, 0, background_image_width, background_image_height, monitors[i].x, monitors[i].y, monitors[i].width, monitors[i].height); + } + + /* Clean up */ + imlib_context_set_image(buffer); + imlib_free_image(); + imlib_context_set_image(image); +} \ No newline at end of file diff --git a/patch/background_image.h b/patch/background_image.h new file mode 100644 index 0000000000000000000000000000000000000000..2a9050f34cf298196cff7023c9889aa3b54a819e --- /dev/null +++ b/patch/background_image.h @@ -0,0 +1,4 @@ +#include + +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 index f6ee1704e8b6469682224647b786efbc6be3c522..b932cf84e8f82aab027160c5d4b7502ec60bfacb 100644 --- a/patch/include.c +++ b/patch/include.c @@ -1,5 +1,7 @@ /* Patches */ -#if BLUR_PIXELATED_SCREEN_PATCH +#if BACKGROUND_IMAGE_PATCH +#include "background_image.c" +#elif BLUR_PIXELATED_SCREEN_PATCH #include "blur_pixelated_screen.c" #endif diff --git a/patch/include.h b/patch/include.h index 5e5497e3acefb3c15ad28d4fd3ba42b0bcf78e81..c50a40212f103aa9d9f92121c17aad100a36c47e 100644 --- a/patch/include.h +++ b/patch/include.h @@ -1,5 +1,7 @@ /* Patches */ -#if BLUR_PIXELATED_SCREEN_PATCH +#if BACKGROUND_IMAGE_PATCH +#include "background_image.h" +#elif BLUR_PIXELATED_SCREEN_PATCH #include "blur_pixelated_screen.h" #endif diff --git a/patches.def.h b/patches.def.h index 3e0f411e032b41fb9f9e5c51d3a59e4dd4036b85..ade6ed839e6d3afad2f5c32b247efcc96b422ab4 100644 --- a/patches.def.h +++ b/patches.def.h @@ -21,9 +21,18 @@ */ #define AUTO_TIMEOUT_PATCH 0 +/* This patch adds a background image for slock. + * This patch depends on the Imlib2 library, uncomment the relevant line in + * config.mk when enabling this patch. + * This patch is a variant of the blur pixelated screen patch and takes precedence over that. + * https://tools.suckless.org/slock/patches/background-image/ + */ +#define BACKGROUND_IMAGE_PATCH 0 + /* 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. + * The background image patch takes precedence over this patch. * https://tools.suckless.org/slock/patches/blur-pixelated-screen/ */ #define BLUR_PIXELATED_SCREEN_PATCH 0 diff --git a/slock.c b/slock.c index dc210160a6e59df6038560ef6f799ce28448d22b..01ac6e92e00ec7a043d02ed52f099ed2aa49f3d2 100644 --- a/slock.c +++ b/slock.c @@ -107,9 +107,9 @@ struct lock { int screen; Window root, win; Pixmap pmap; - #if BLUR_PIXELATED_SCREEN_PATCH + #if BLUR_PIXELATED_SCREEN_PATCH || BACKGROUND_IMAGE_PATCH Pixmap bgmap; - #endif // BLUR_PIXELATED_SCREEN_PATCH + #endif // BLUR_PIXELATED_SCREEN_PATCH | BACKGROUND_IMAGE_PATCH unsigned long colors[NUMCOLS]; #if DWM_LOGO_PATCH unsigned int x, y; @@ -408,7 +408,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, for (screen = 0; screen < nscreens; screen++) { #if DWM_LOGO_PATCH drawlogo(dpy, locks[screen], color); - #elif BLUR_PIXELATED_SCREEN_PATCH + #elif BLUR_PIXELATED_SCREEN_PATCH || BACKGROUND_IMAGE_PATCH if (locks[screen]->bgmap) XSetWindowBackgroundPixmap(dpy, locks[screen]->win, locks[screen]->bgmap); else @@ -488,9 +488,9 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) lock->screen = screen; lock->root = RootWindow(dpy, lock->screen); - #if BLUR_PIXELATED_SCREEN_PATCH + #if BLUR_PIXELATED_SCREEN_PATCH || BACKGROUND_IMAGE_PATCH render_lock_image(dpy, lock, image); - #endif // BLUR_PIXELATED_SCREEN_PATCH + #endif // BLUR_PIXELATED_SCREEN_PATCH | BACKGROUND_IMAGE_PATCH for (i = 0; i < NUMCOLS; i++) { XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), @@ -539,10 +539,10 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) CopyFromParent, DefaultVisual(dpy, lock->screen), CWOverrideRedirect | CWBackPixel, &wa); - #if BLUR_PIXELATED_SCREEN_PATCH + #if BLUR_PIXELATED_SCREEN_PATCH || BACKGROUND_IMAGE_PATCH if (lock->bgmap) XSetWindowBackgroundPixmap(dpy, lock->win, lock->bgmap); - #endif // BLUR_PIXELATED_SCREEN_PATCH + #endif // BLUR_PIXELATED_SCREEN_PATCH | BACKGROUND_IMAGE_PATCH lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8); invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap, &color, &color, 0, 0); @@ -698,14 +698,14 @@ 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 + #if BLUR_PIXELATED_SCREEN_PATCH || BACKGROUND_IMAGE_PATCH + create_lock_image(dpy); + #endif // BLUR_PIXELATED_SCREEN_PATCH | BACKGROUND_IMAGE_PATCH + #if KEYPRESS_FEEDBACK_PATCH time_t t; srand((unsigned) time(&t));