]> git.sur5r.net Git - i3/i3lock/commitdiff
i3lock now can use xpm images as background
authorJan-Erik Rediger <badboy@archlinux.us>
Fri, 19 Jun 2009 22:52:55 +0000 (00:52 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 27 Jun 2009 18:44:30 +0000 (20:44 +0200)
config.mk
i3lock.c

index 8b2b613a3f6752dab1cfcbe59afcca3dfd3e2d06..664c2547ab8f138e8169e91e37d8616b907d4f1b 100644 (file)
--- a/config.mk
+++ b/config.mk
@@ -13,7 +13,7 @@ MANDIR = $(DESTDIR)$(PREFIX)/share/man
 
 # includes and libs
 INCS = -I. -I/usr/include -I${X11INC}
-LIBS = -L${X11LIB} -lX11 -lpam -lXext
+LIBS = -L${X11LIB} -lX11 -lpam -lXext -lXpm
 
 # flags
 CPPFLAGS = -DVERSION=\"${VERSION}\"
index 2c95929c355f68ca98ea92dcdd83b5df0bb6f9db..5b495b554e471c65996d8cb6b22b15cca59bf908 100644 (file)
--- a/i3lock.c
+++ b/i3lock.c
@@ -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)