aboutsummaryrefslogtreecommitdiffstats
path: root/slock.c
diff options
context:
space:
mode:
authorJoe <rbo@gmx.us>2025-09-14 14:54:08 +0200
committerJoe <rbo@gmx.us>2025-09-14 14:54:08 +0200
commit425aa7282b581e0e08cfa58048576fe5bf4c1f62 (patch)
tree25922c1c1d09d1adbe122554974f1631e5250a26 /slock.c
parentivybridge update (diff)
downloadslock-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.c83
1 files changed, 14 insertions, 69 deletions
diff --git a/slock.c b/slock.c
index ac1ff20..f16781f 100644
--- a/slock.c
+++ b/slock.c
@@ -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));
}
}