diff options
author | Joe <rbo@gmx.us> | 2025-09-14 14:54:08 +0200 |
---|---|---|
committer | Joe <rbo@gmx.us> | 2025-09-14 14:54:08 +0200 |
commit | 425aa7282b581e0e08cfa58048576fe5bf4c1f62 (patch) | |
tree | 25922c1c1d09d1adbe122554974f1631e5250a26 /slock.c | |
parent | ivybridge update (diff) | |
download | slock-425aa7282b581e0e08cfa58048576fe5bf4c1f62.tar.gz slock-425aa7282b581e0e08cfa58048576fe5bf4c1f62.tar.bz2 slock-425aa7282b581e0e08cfa58048576fe5bf4c1f62.tar.xz slock-425aa7282b581e0e08cfa58048576fe5bf4c1f62.tar.zst slock-425aa7282b581e0e08cfa58048576fe5bf4c1f62.zip |
1.6 up
Diffstat (limited to '')
-rw-r--r-- | slock.c | 83 |
1 files changed, 14 insertions, 69 deletions
@@ -13,12 +13,12 @@ #include <stdio.h> #include <string.h> #include <unistd.h> +#include <spawn.h> #include <sys/types.h> #include <X11/extensions/Xrandr.h> #include <X11/keysym.h> #include <X11/Xlib.h> #include <X11/Xutil.h> -#include <Imlib2.h> #include "arg.h" #include "util.h" @@ -36,7 +36,6 @@ struct lock { int screen; Window root, win; Pixmap pmap; - Pixmap bgmap; unsigned long colors[NUMCOLS]; }; @@ -48,8 +47,6 @@ struct xrandr { #include "config.h" -Imlib_Image image; - static void die(const char *errstr, ...) { @@ -188,25 +185,18 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, (len + num < sizeof(passwd))) { memcpy(passwd + len, buf, num); len += num; + } else if (buf[0] == '\025') { /* ctrl-u clears input */ + explicit_bzero(&passwd, sizeof(passwd)); + len = 0; } break; } color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT); - printf("%d\n", len); if (running && oldc != color) { for (screen = 0; screen < nscreens; screen++) { - if (background_image != NULL && len == 0) { - 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]); - - } + XSetWindowBackground(dpy, + locks[screen]->win, + locks[screen]->colors[color]); XClearWindow(dpy, locks[screen]->win); } oldc = color; @@ -249,17 +239,6 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) lock->screen = screen; lock->root = RootWindow(dpy, lock->screen); - if(background_image != NULL && 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(); - } - for (i = 0; i < NUMCOLS; i++) { XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), colorname[i], &color, &dummy); @@ -276,8 +255,6 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) CopyFromParent, DefaultVisual(dpy, lock->screen), CWOverrideRedirect | CWBackPixel, &wa); - if(background_image != NULL && 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); @@ -344,7 +321,7 @@ main(int argc, char **argv) { ARGBEGIN { case 'v': - fprintf(stderr, "slock-"VERSION"\n"); + puts("slock-"VERSION); return 0; default: usage(); @@ -382,35 +359,6 @@ main(int argc, char **argv) { if (setuid(duid) < 0) die("slock: setuid: %s\n", strerror(errno)); - /* Load picture */ - if (background_image != NULL) { - 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); - } - /* check for Xrandr support */ rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase); @@ -432,15 +380,12 @@ main(int argc, char **argv) { /* run post-lock command */ if (argc > 0) { - switch (fork()) { - case -1: - die("slock: fork failed: %s\n", strerror(errno)); - case 0: - if (close(ConnectionNumber(dpy)) < 0) - die("slock: close: %s\n", strerror(errno)); - execvp(argv[0], argv); - fprintf(stderr, "slock: execvp %s: %s\n", argv[0], strerror(errno)); - _exit(1); + pid_t pid; + extern char **environ; + int err = posix_spawnp(&pid, argv[0], NULL, NULL, argv, environ); + if (err) { + die("slock: failed to execute post-lock command: %s: %s\n", + argv[0], strerror(err)); } } |