X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=slock.c;h=866400d3d4d401a781f01d223b0c4337d9803acb;hb=0f1157d7e6cabe0394ffc35a0a58a30507af8ebd;hp=824baa29f360730a9c7d156cec8ebb738eef1c7c;hpb=763e52878dba100e79c6f4a837a92e1df0d41ae0;p=slock.git diff --git a/slock.c b/slock.c index 824baa2..866400d 100644 --- a/slock.c +++ b/slock.c @@ -2,7 +2,13 @@ * See LICENSE file for license details. */ #define _XOPEN_SOURCE + +#if HAVE_SHADOW_H #include +#else +#include +#endif + #include #include #include @@ -14,35 +20,66 @@ int main(int argc, char **argv) { + char curs[] = {0, 0, 0, 0, 0, 0, 0, 0}; char buf[32], passwd[256]; - int num, prev_nitem; + int num, prev_nitem, screen; +#if HAVE_SHADOW_H struct spwd *sp; +#else + struct passwd *pw; +#endif unsigned int i, len; Bool running = True; - KeySym ksym; + Cursor invisible; Display *dpy; + KeySym ksym; + Pixmap pmap; + Window w; + XColor black, dummy; XEvent ev; + XSetWindowAttributes wa; if((argc > 1) && !strncmp(argv[1], "-v", 3)) { fputs("slock-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout); exit(EXIT_SUCCESS); } - if(!(sp = getspnam(getenv("USER")))) { + if(geteuid() != 0) { fputs("slock: cannot retrieve password entry (make sure to suid slock)\n", stderr); exit(EXIT_FAILURE); } +#if HAVE_SHADOW_H + sp = getspnam(getenv("USER")); endspent(); +#else + pw = getpwuid(getuid()); + endpwent(); +#endif if(!(dpy = XOpenDisplay(0))) { fputs("slock: cannot open display\n", stderr); exit(EXIT_FAILURE); } + screen = DefaultScreen(dpy); /* init */ passwd[0] = 0; - while(XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, + while(XGrabKeyboard(dpy, RootWindow(dpy, screen), True, GrabModeAsync, GrabModeAsync, CurrentTime) != GrabSuccess) usleep(1000); + wa.override_redirect = 1; + wa.background_pixel = BlackPixel(dpy, screen); + w = XCreateWindow(dpy, RootWindow(dpy, screen), 0, 0, + DisplayWidth(dpy, screen), DisplayHeight(dpy, screen), + 0, DefaultDepth(dpy, screen), CopyFromParent, + DefaultVisual(dpy, screen), CWOverrideRedirect | CWBackPixel, &wa); + + XAllocNamedColor(dpy, DefaultColormap(dpy, screen), "black", &black, &dummy); + pmap = XCreateBitmapFromData(dpy, w, curs, 8, 8); + invisible = XCreatePixmapCursor(dpy, pmap, pmap, &black, &black, 0, 0); + XDefineCursor(dpy, w, invisible); + XMapRaised(dpy, w); + XSync(dpy, False); + /* main event loop */ while(running && !XNextEvent(dpy, &ev)) if(ev.type == KeyPress) { @@ -66,7 +103,12 @@ main(int argc, char **argv) { } switch(ksym) { case XK_Return: - running = strncmp(crypt(passwd, sp->sp_pwdp), sp->sp_pwdp, sizeof(passwd)); +#if HAVE_SHADOW_H + if((running = strncmp(crypt(passwd, sp->sp_pwdp), sp->sp_pwdp, sizeof(passwd)))) +#else + if((running = strncmp(crypt(passwd, pw->pw_passwd), pw->pw_passwd, sizeof(passwd)))) +#endif + XBell(dpy, 100); passwd[0] = 0; break; case XK_Escape: @@ -87,6 +129,8 @@ main(int argc, char **argv) { break; } } + XFreePixmap(dpy, pmap); + XDestroyWindow(dpy, w); XCloseDisplay(dpy); return 0; }