| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -26,6 +26,7 @@ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <X11/keysym.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <X11/Xlib.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <X11/Xutil.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <X11/xpm.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <X11/extensions/dpms.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <stdbool.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <getopt.h> | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -43,6 +44,22 @@ static void die(const char *errstr, ...) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        exit(EXIT_FAILURE); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					/*
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 * Check if given file can be opened => exists | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 * | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					bool file_exists(const char * filename) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        FILE * file = fopen(filename, "r"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if(file) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                fclose(file); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                return true; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        return false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					/*
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 * Callback function for PAM. We only react on password request callbacks. | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 * | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -87,6 +104,8 @@ int main(int argc, char *argv[]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        bool dont_fork = false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        bool beep = false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        bool dpms = false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        bool xpm_image = false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        char xpm_image_path[256]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        Cursor invisible; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        Display *dpy; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        KeySym ksym; | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -106,10 +125,11 @@ int main(int argc, char *argv[]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                {"nofork", no_argument, NULL, 'n'}, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                {"beep", no_argument, NULL, 'b'}, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                {"dpms", no_argument, NULL, 'd'}, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                {"image", required_argument, NULL, 'i'}, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                {NULL, no_argument, NULL, 0} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        while ((opt = getopt_long(argc, argv, "vnbd", long_options, &optind)) != -1) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        while ((opt = getopt_long(argc, argv, "vnbdi:", long_options, &optind)) != -1) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                switch (opt) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        case 'v': | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                die("i3lock-"VERSION", © 2009 Michael Stapelberg\n" | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -123,8 +143,12 @@ int main(int argc, char *argv[]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        case 'd': | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                dpms = true; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        case 'i': | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                strncpy(xpm_image_path, optarg, 255); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                xpm_image = true; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        default: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                die("i3lock: Unknown option. Syntax: i3lock [-v] [-n] [-b] [-d]\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                die("i3lock: Unknown option. Syntax: i3lock [-v] [-n] [-b] [-d] [-i image.xpm]\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -156,6 +180,18 @@ int main(int argc, char *argv[]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        invisible = XCreatePixmapCursor(dpy, pmap, pmap, &black, &black, 0, 0); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        XDefineCursor(dpy, w, invisible); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        XMapRaised(dpy, w); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if(xpm_image && file_exists(xpm_image_path)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                GC gc = XDefaultGC(dpy, 0); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                int depth = DefaultDepth(dpy, screen); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                int disp_width = DisplayWidth(dpy, screen); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                int disp_height = DisplayHeight(dpy, screen); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                Pixmap pix = XCreatePixmap(dpy, w, disp_width, disp_height, depth); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                XpmReadFileToPixmap(dpy, w, xpm_image_path, &pix, 0, 0); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                XCopyArea(dpy, pix, w, gc, 0, 0, disp_width, disp_height, 0, 0); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        for(len = 1000; len; len--) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if(XGrabPointer(dpy, root, False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        GrabModeAsync, GrabModeAsync, None, invisible, CurrentTime) == GrabSuccess) | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |