static Lock * lockscreen(Display *dpy, int screen) { char curs[] = {0, 0, 0, 0, 0, 0, 0, 0}; unsigned int len; Lock *lock; XColor color, dummy; XSetWindowAttributes wa; Cursor invisible; if(dpy == NULL || screen < 0) return NULL; lock = malloc(sizeof(Lock)); if(lock == NULL) return NULL; lock->screen = screen; lock->root = RootWindow(dpy, lock->screen); /* init */ wa.override_redirect = 1; wa.background_pixel = BlackPixel(dpy, lock->screen); lock->win = XCreateWindow(dpy, lock->root, 0, 0, DisplayWidth(dpy, lock->screen), DisplayHeight(dpy, lock->screen), 0, DefaultDepth(dpy, lock->screen), CopyFromParent, DefaultVisual(dpy, lock->screen), CWOverrideRedirect | CWBackPixel, &wa); XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), COLOR2, &color, &dummy); lock->colors[1] = color.pixel; XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), COLOR1, &color, &dummy); lock->colors[0] = color.pixel; lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8); invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap, &color, &color, 0, 0); XDefineCursor(dpy, lock->win, invisible); XMapRaised(dpy, lock->win); for(len = 1000; len; len--) { if(XGrabPointer(dpy, lock->root, False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync, GrabModeAsync, None, invisible, CurrentTime) == GrabSuccess) break; usleep(1000); } if(running && (len > 0)) { for(len = 1000; len; len--) { if(XGrabKeyboard(dpy, lock->root, True, GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess) break; usleep(1000); } } running &= (len > 0); if(!running) { unlockscreen(dpy, lock); lock = NULL; } else XSelectInput(dpy, lock->root, SubstructureNotifyMask); return lock; }
int main(int argc, char **argv) { #ifndef HAVE_BSD_AUTH const char *pws; #endif Display *dpy; int screen; if((argc == 2) && !strcmp("-v", argv[1])) die("slock-%s, © 2006-2012 Anselm R Garbe\n", VERSION); else if(argc != 1) usage(); if(!getpwuid(getuid())) die("slock: no passwd entry for you"); #ifndef HAVE_BSD_AUTH pws = getpw(); #endif if(!(dpy = XOpenDisplay(0))) die("slock: cannot open display"); /* Get the number of screens in display "dpy" and blank them all. */ nscreens = ScreenCount(dpy); locks = malloc(sizeof(Lock *) * nscreens); if(locks == NULL) die("slock: malloc: %s", strerror(errno)); int nlocks = 0; for(screen = 0; screen < nscreens; screen++) { if ( (locks[screen] = lockscreen(dpy, screen)) != NULL) nlocks++; } XSync(dpy, False); /* Did we actually manage to lock something? */ if (nlocks == 0) { // nothing to protect free(locks); XCloseDisplay(dpy); return 1; } /* Everything is now blank. Now wait for the correct password. */ #ifdef HAVE_BSD_AUTH readpw(dpy); #else readpw(dpy, pws); #endif /* Password ok, unlock everything and quit. */ for(screen = 0; screen < nscreens; screen++) unlockscreen(dpy, locks[screen]); free(locks); XCloseDisplay(dpy); return 0; }
static Lock * lockscreen(Display *dpy, int screen) /* Here is the meat */ { int count; Lock *lock; XSetWindowAttributes wa; if (dpy == NULL || screen < 0) return NULL; lock = malloc(sizeof(Lock)); if (lock == NULL) return NULL; lock->screen = screen; lock->root = RootWindow(dpy, lock->screen); /* init */ wa.override_redirect = true; wa.background_pixel = BlackPixel(dpy, lock->screen); lock->win = XCreateWindow(dpy, lock->root, 0, 0, DisplayWidth(dpy, lock->screen), DisplayHeight(dpy, lock->screen), 0, DefaultDepth(dpy, lock->screen), CopyFromParent, DefaultVisual(dpy, lock->screen), CWOverrideRedirect | CWBackPixel, &wa); XMapRaised(dpy, lock->win); for (count = 0; count < 10000; ++count) { if (XGrabPointer(dpy, lock->root, False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime) == GrabSuccess) break; } if (count < 10000) { for (count = 0; count < 10000; ++count) { if (XGrabKeyboard(dpy, lock->root, True, GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess) break; } } if (count >= 10000) // timed out { unlockscreen(dpy, lock); lock = NULL; } else XSelectInput(dpy, lock->root, SubstructureNotifyMask); return lock; }
int main(int argc, char *argv[]) { const char *pws; Display *dpy; if ((argc == 2) && (strcmp("-v", argv[1]) == 0)) die("lock "VERSION", © 2006-2012 Anselm R Garbe, 2012 philomath\n"); else if (argc != 1) die("usage: lock [-v]\n"); pws = getpw(); if ((dpy = XOpenDisplay(NULL)) == NULL) die("lock: cannot open display\n"); /* Get the number of screens in display "dpy" and blank them all. */ nscreens = ScreenCount(dpy); locks = malloc(sizeof(Lock *) * nscreens); if (locks == NULL) die("lock: malloc failed\n"); int nlocks = 0; for (int i = 0; i < nscreens; ++i) { if ((locks[i] = lockscreen(dpy, i)) != NULL) nlocks++; } /* Did we actually manage to lock something? */ if (nlocks == 0) // nothing to protect { free(locks); XCloseDisplay(dpy); die("cannot lock anything\n"); } /* Everything is now blank. Now wait for the correct password. */ readpw(dpy, pws); /* Password ok, unlock everything and quit. */ for (int i = 0; i < nscreens; ++i) unlockscreen(dpy, locks[i]); free(locks); XCloseDisplay(dpy); return 0; }
int main(void) { switch(fork()) { case -1: die("fork\n"); break; case 0: dev_id = hci_devid(DEV_ID); if (dev_id < 0) { die("Invalid device\n"); } else { initsignals(); close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); Display *dpy = NULL; int rssi, screen; Bool help = True; check_version(dev_id); add_to_white_list(dev_id); handle = connect_to_device(dev_id); /* encryption(dev_id, handle); */ while (running) { if (help) { if (!(dpy = XOpenDisplay(0))) die("ble: cannot open display"); /* Get the number of screens in display "dpy" and blank them all. */ nscreens = ScreenCount(dpy); locks = malloc(sizeof(Lock *) * nscreens); if (locks == NULL) die("ble: malloc: %s", strerror(errno)); } if (help) { rssi = read_rssi(dev_id, handle); if ((calculate_distance(rssi) >= 2.0) && (rssi <= -71 && rssi >= -75)) { if (locks != NULL && help) { for (screen = 0; screen < nscreens; screen++) locks[screen] = lockscreen(dpy, screen); XSync(dpy, False); } help = False; } } sleep(1); if (!help) { rssi = read_rssi(dev_id, handle); if ((calculate_distance(rssi) <= 2.0) && (rssi <= -30 && rssi >= -70)) { for (screen = 0; screen < nscreens; screen++) unlockscreen(dpy, locks[screen]); if (locks != NULL || dpy != NULL) { free(locks); XCloseDisplay(dpy); help = True; } } } } disconnect_from_device(dev_id, handle); } default: break; } return EXIT_SUCCESS; }
int main(int argc, char **argv) { #ifndef HAVE_BSD_AUTH const char *pws; #endif Display *dpy; int screen; #ifdef SLOCK_QUIET freopen("/dev/null", "a", stdout); freopen("/dev/null", "a", stderr); #endif char buf[255] = {0}; snprintf(buf, sizeof(buf), "%s/.slock_passwd", getenv("HOME")); g_pw = read_tfile(buf); if((argc >= 2) && !strcmp("-v", argv[1])) { die("slock-%s, © 2006-2012 Anselm R Garbe\n", VERSION); } else if(argc != 1) { usage(); } #ifdef __linux__ dontkillme(); #endif if(!g_pw && !getpwuid(getuid())) die("slock: no passwd entry for you\n"); #ifndef HAVE_BSD_AUTH pws = getpw(); #endif if(!(dpy = XOpenDisplay(0))) die("slock: cannot open display\n"); /* Get the number of screens in display "dpy" and blank them all. */ nscreens = ScreenCount(dpy); locks = malloc(sizeof(Lock *) * nscreens); if(locks == NULL) die("slock: malloc: %s\n", strerror(errno)); int nlocks = 0; for(screen = 0; screen < nscreens; screen++) { if ( (locks[screen] = lockscreen(dpy, screen)) != NULL) nlocks++; } XSync(dpy, False); /* Did we actually manage to lock something? */ if (nlocks == 0) { // nothing to protect free(locks); XCloseDisplay(dpy); return 1; } /* Everything is now blank. Now wait for the correct password. */ #ifdef HAVE_BSD_AUTH readpw(dpy); #else readpw(dpy, pws); #endif /* Password ok, unlock everything and quit. */ for(screen = 0; screen < nscreens; screen++) unlockscreen(dpy, locks[screen]); free(locks); XCloseDisplay(dpy); return 0; }
static Lock * lockscreen(Display *dpy, int screen) { #if !TRANSPARENT char curs[] = {0, 0, 0, 0, 0, 0, 0, 0}; #endif unsigned int len; Lock *lock; #if !TRANSPARENT XColor color, dummy; #endif XSetWindowAttributes wa; #if !TRANSPARENT Cursor invisible; #endif #if TRANSPARENT XVisualInfo vi; #endif if(dpy == NULL || screen < 0) return NULL; lock = malloc(sizeof(Lock)); if(lock == NULL) return NULL; lock->screen = screen; lock->root = RootWindow(dpy, lock->screen); #if TRANSPARENT XMatchVisualInfo(dpy, DefaultScreen(dpy), 32, TrueColor, &vi); wa.colormap = XCreateColormap(dpy, DefaultRootWindow(dpy), vi.visual, AllocNone); #endif /* init */ wa.override_redirect = 1; #if !TRANSPARENT wa.background_pixel = BlackPixel(dpy, lock->screen); #else wa.border_pixel = 0; wa.background_pixel = 0xaa000000; #endif lock->win = XCreateWindow(dpy, lock->root, 0, 0, DisplayWidth(dpy, lock->screen), DisplayHeight(dpy, lock->screen), #if !TRANSPARENT 0, DefaultDepth(dpy, lock->screen), CopyFromParent, DefaultVisual(dpy, lock->screen), CWOverrideRedirect | CWBackPixel, &wa); #else 0, vi.depth, CopyFromParent, vi.visual, CWOverrideRedirect | CWBackPixel | CWColormap | CWBorderPixel, &wa); #endif Atom name_atom = XA_WM_NAME; XTextProperty name_prop = { "slock", name_atom, 8, 5 }; XSetWMName(dpy, lock->win, &name_prop); // Atom name_ewmh_atom = XInternAtom(dpy, "_NET_WM_NAME", False); // XTextProperty name_ewmh_prop = { "slock", name_ewmh_atom, 8, 5 }; // XSetTextProperty(dpy, lock->win, &name_ewmh_prop, name_ewmh_atom); // XSetWMName(dpy, lock->win, &name_ewmh_prop); XClassHint *hint = XAllocClassHint(); if (hint) { hint->res_name = "slock"; hint->res_class = "slock"; XSetClassHint(dpy, lock->win, hint); XFree(hint); } #if !TRANSPARENT XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), COLOR2, &color, &dummy); lock->colors[1] = color.pixel; XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), COLOR1, &color, &dummy); lock->colors[0] = color.pixel; lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8); invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap, &color, &color, 0, 0); XDefineCursor(dpy, lock->win, invisible); #endif XMapRaised(dpy, lock->win); for(len = 1000; len; len--) { if(XGrabPointer(dpy, lock->root, False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, #if !TRANSPARENT GrabModeAsync, GrabModeAsync, None, invisible, CurrentTime) == GrabSuccess) #else GrabModeAsync, GrabModeAsync, None, None, CurrentTime) == GrabSuccess) #endif break; usleep(1000); } if(running && (len > 0)) { for(len = 1000; len; len--) { if(XGrabKeyboard(dpy, lock->root, True, GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess) break; usleep(1000); } } running &= (len > 0); if(!running) { unlockscreen(dpy, lock); lock = NULL; } else XSelectInput(dpy, lock->root, SubstructureNotifyMask); usboff(); return lock; }
int main(int argc, char **argv) { const char *pws; Display *dpy; int screen; int result; while((result = getopt(argc,argv,"vo:")) != -1) { switch(result) { case 'v': die("slock-%s, © 2006-2012 Anselm R Garbe\n", VERSION); case 'o': opacity = atof(optarg); printf("%f\n", opacity); break; case '?': usage(); break; } } if ((argc - optind) > 0) usage(); #ifdef __linux__ dontkillme(); #endif if(!getpwuid(getuid())) die("slock: no passwd entry for you\n"); pws = getpw(); if(!(dpy = XOpenDisplay(0))) die("slock: cannot open display\n"); /* Get the number of screens in display "dpy" and blank them all. */ nscreens = ScreenCount(dpy); locks = malloc(sizeof(Lock *) * nscreens); if(locks == NULL) die("slock: malloc: %s\n", strerror(errno)); int nlocks = 0; for(screen = 0; screen < nscreens; screen++) { if ( (locks[screen] = lockscreen(dpy, screen)) != NULL) { nlocks++; } } XSync(dpy, False); /* Did we actually manage to lock something? */ if (nlocks == 0) { // nothing to protect free(locks); XCloseDisplay(dpy); return 1; } /* Everything is now blank. Now wait for the correct password. */ readpw(dpy, pws); /* Password ok, unlock everything and quit. */ for(screen = 0; screen < nscreens; screen++) unlockscreen(dpy, locks[screen]); free(locks); XCloseDisplay(dpy); return 0; }