Hello community,

here is the log from the commit of package i3lock for openSUSE:Factory checked 
in at 2015-01-20 12:36:16
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/i3lock (Old)
 and      /work/SRC/openSUSE:Factory/.i3lock.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "i3lock"

Changes:
--------
--- /work/SRC/openSUSE:Factory/i3lock/i3lock.changes    2014-03-31 
20:43:27.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.i3lock.new/i3lock.changes       2015-01-20 
12:39:13.000000000 +0100
@@ -1,0 +2,21 @@
+Mon Jan 19 03:34:30 UTC 2015 - p.drou...@gmail.com
+
+- Update to version 2.6
+  * NEW DEPENDENCY: use libxkbcommon-x11 instead of libX11
+    This helps us get rid of all code that directly uses libX11
+  * Use cairo_status_to_string for descriptive errors.
+  * Add `-e` option to not validate empty password.
+  * Bugfix: update the initial keyboard modifier state (Thanks lee, Ran)
+  * Re-raise i3lock when obscured in a separate process
+  * Turn on the screen on successful authentication
+  * Delay to turn off the screen after wrong passwd
+  * Discard half-entered passwd after some inactivity
+  * Ignore empty passwd after repeated Enter keypress
+  * Scale the unlock indicator (for retina displays)
+- Replace xorg-x11-devel with pkgconfig(xkbcommon-x11); follow
+  upstream changes
+- Add pkgconfig(cairo) and pkgconfig(xcb-atom) requirements; new
+  upstream dependencies
+- Remove redundant %clean section
+
+-------------------------------------------------------------------

Old:
----
  i3lock-2.5.tar.bz2

New:
----
  i3lock-2.6.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ i3lock.spec ++++++
--- /var/tmp/diff_new_pack.ilCcm0/_old  2015-01-20 12:39:14.000000000 +0100
+++ /var/tmp/diff_new_pack.ilCcm0/_new  2015-01-20 12:39:14.000000000 +0100
@@ -1,8 +1,7 @@
-# vim: set sw=4 ts=4 et nu:
 #
 # spec file for package i3lock
 #
-# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
 # Copyright (c) 2014 B1 Systems GmbH, Vohburg, Germany.
 # Copyright (c) 2012 Pascal Bleser <pascal.ble...@opensuse.org>
 #
@@ -22,7 +21,7 @@
 # Please submit bugfixes or comments via http://bugs.opensuse.org/
 
 Name:           i3lock
-Version:        2.5
+Version:        2.6
 Release:        0
 Summary:        Screen Locker for the i3 Window Manager
 License:        BSD-3-Clause
@@ -48,7 +47,9 @@
 BuildRequires:  make
 BuildRequires:  pam-devel
 BuildRequires:  pkgconfig
-BuildRequires:  xorg-x11-devel
+BuildRequires:  pkgconfig(cairo)
+BuildRequires:  pkgconfig(xcb-atom)
+BuildRequires:  pkgconfig(xkbcommon-x11)
 Requires:       pam-modules
 BuildRequires:  pam-modules
 BuildRequires:  pkgconfig(xcb-image)
@@ -99,13 +100,10 @@
 install -D -m0644 %{SOURCE2} 
%{buildroot}/usr/share/i3lock-xlock-compat/i3lock-icon.png
 install -m0755 %{SOURCE3} %{buildroot}/%{_bindir}/xlock
 
-%clean
-%{?buildroot:%__rm -rf "%{buildroot}"}
-
 %files xlock-compat
 %defattr(-,root,root)
 %{_bindir}/xlock
-/usr/share/i3lock-xlock-compat
+%{_datadir}/i3lock-xlock-compat
 
 %files
 %defattr(-,root,root)

++++++ i3lock-2.5-use-unix2_chkpwd.diff ++++++
--- /var/tmp/diff_new_pack.ilCcm0/_old  2015-01-20 12:39:14.000000000 +0100
+++ /var/tmp/diff_new_pack.ilCcm0/_new  2015-01-20 12:39:14.000000000 +0100
@@ -7,32 +7,32 @@
 index 2633bef..27a471b 100644
 --- a/Makefile
 +++ b/Makefile
-@@ -13,7 +13,11 @@ CFLAGS += -Wall
+@@ -13,7 +13,11 @@
  CPPFLAGS += -D_GNU_SOURCE
- CFLAGS += $(shell pkg-config --cflags cairo xcb-dpms xcb-xinerama xcb-atom 
xkbcommon xkbfile x11 x11-xcb)
- LIBS += $(shell pkg-config --libs cairo xcb-dpms xcb-xinerama xcb-atom 
xcb-image xkbcommon xkbfile x11 x11-xcb)
+ CFLAGS += $(shell pkg-config --cflags cairo xcb-dpms xcb-xinerama xcb-atom 
xcb-image xcb-xkb xkbcommon xkbcommon-x11)
+ LIBS += $(shell pkg-config --libs cairo xcb-dpms xcb-xinerama xcb-atom 
xcb-image xcb-xkb xkbcommon xkbcommon-x11)
 +ifeq ($(USE_UNIX2_CHKPWD),1)
 +CFLAGS += -DUSE_UNIX2_CHKPWD=1
 +else
  LIBS += -lpam
 +endif
  LIBS += -lev
+ LIBS += -lm
  
- FILES:=$(wildcard *.c)
 diff --git a/i3lock.c b/i3lock.c
 index 5a87999..70842c6 100644
 --- a/i3lock.c
 +++ b/i3lock.c
-@@ -16,7 +16,9 @@
+@@ -17,7 +17,9 @@
  #include <xcb/dpms.h>
  #include <err.h>
  #include <assert.h>
 +#ifndef USE_UNIX2_CHKPWD
  #include <security/pam_appl.h>
 +#endif
- #include <X11/Xlib-xcb.h>
  #include <getopt.h>
  #include <string.h>
+ #include <ev.h>
 @@ -28,6 +30,13 @@
  #include <cairo.h>
  #include <cairo/cairo-xcb.h>
@@ -57,7 +57,7 @@
  int input_position = 0;
  /* Holds the password you enter (in UTF-8). */
  static char password[512];
-@@ -195,11 +206,68 @@ static void input_done(void) {
+@@ -226,6 +228,62 @@
      pam_state = STATE_PAM_VERIFY;
      redraw_screen();
  
@@ -120,12 +120,15 @@
      if (pam_authenticate(pam_handle, 0) == PAM_SUCCESS) {
          DEBUG("successfully authenticated\n");
          clear_password_memory();
+@@ -234,7 +292,7 @@
+         turn_monitors_on();
          exit(0);
      }
+-
 +#endif
- 
      if (debug_mode)
          fprintf(stderr, "Authentication failure\n");
+ 
 @@ -398,6 +466,7 @@ void handle_screen_resize(void) {
      redraw_screen();
  }

++++++ i3lock-2.5.tar.bz2 -> i3lock-2.6.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3lock-2.5/CHANGELOG new/i3lock-2.6/CHANGELOG
--- old/i3lock-2.5/CHANGELOG    2013-06-09 11:49:00.000000000 +0200
+++ new/i3lock-2.6/CHANGELOG    2014-07-18 20:25:02.000000000 +0200
@@ -1,3 +1,17 @@
+2014-07-18 i3lock 2.6
+
+ • NEW DEPENDENCY: use libxkbcommon-x11 instead of libX11
+   This helps us get rid of all code that directly uses libX11
+ • Use cairo_status_to_string for descriptive errors.
+ • Add `-e` option to not validate empty password.
+ • Bugfix: update the initial keyboard modifier state (Thanks lee, Ran)
+ • Re-raise i3lock when obscured in a separate process
+ • Turn on the screen on successful authentication
+ • Delay to turn off the screen after wrong passwd
+ • Discard half-entered passwd after some inactivity
+ • Ignore empty passwd after repeated Enter keypress
+ • Scale the unlock indicator (for retina displays)
+
 2013-06-09 i3lock 2.5
 
  • NEW DEPENDENCY: Use libxkbcommon for input handling
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3lock-2.5/Makefile new/i3lock-2.6/Makefile
--- old/i3lock-2.5/Makefile     2013-06-09 11:49:00.000000000 +0200
+++ new/i3lock-2.6/Makefile     2014-07-18 20:25:02.000000000 +0200
@@ -11,16 +11,17 @@
 CFLAGS += -pipe
 CFLAGS += -Wall
 CPPFLAGS += -D_GNU_SOURCE
-CFLAGS += $(shell pkg-config --cflags cairo xcb-dpms xcb-xinerama xcb-atom 
xkbcommon xkbfile x11 x11-xcb)
-LIBS += $(shell pkg-config --libs cairo xcb-dpms xcb-xinerama xcb-atom 
xcb-image xkbcommon xkbfile x11 x11-xcb)
+CFLAGS += $(shell pkg-config --cflags cairo xcb-dpms xcb-xinerama xcb-atom 
xcb-image xcb-xkb xkbcommon xkbcommon-x11)
+LIBS += $(shell pkg-config --libs cairo xcb-dpms xcb-xinerama xcb-atom 
xcb-image xcb-xkb xkbcommon xkbcommon-x11)
 LIBS += -lpam
 LIBS += -lev
+LIBS += -lm
 
 FILES:=$(wildcard *.c)
 FILES:=$(FILES:.c=.o)
 
-VERSION:=2.5
-GIT_VERSION:="2.5 (2013-06-09)"
+VERSION:=2.6
+GIT_VERSION:="2.6 (2014-07-18)"
 CPPFLAGS += -DVERSION=\"${GIT_VERSION}\"
 
 .PHONY: install clean uninstall
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3lock-2.5/README new/i3lock-2.6/README
--- old/i3lock-2.5/README       2013-06-09 11:49:00.000000000 +0200
+++ new/i3lock-2.6/README       2014-07-18 20:25:02.000000000 +0200
@@ -29,7 +29,8 @@
 - libx11-dev
 - libx11-xcb-dev
 - libxkbfile-dev
-- libxkbcommon >= 0.2.0
+- libxkbcommon >= 0.4.0
+- libxkbcommon-x11 >= 0.4.0
 
 Running i3lock
 -------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3lock-2.5/i3lock.1 new/i3lock-2.6/i3lock.1
--- old/i3lock-2.5/i3lock.1     2013-06-09 11:49:00.000000000 +0200
+++ new/i3lock-2.6/i3lock.1     2014-07-18 20:25:02.000000000 +0200
@@ -27,6 +27,8 @@
 .RB [\|\-p
 .IR pointer\|]
 .RB [\|\-u\|]
+.RB [\|\-e\|]
+.RB [\|\-I\|]
 
 .SH DESCRIPTION
 .B i3lock
@@ -36,17 +38,14 @@
 
 .SH IMPROVEMENTS
 
-.TP
-* i3lock forks, so you can combine it with an alias to suspend to RAM (run 
"i3lock && echo mem > /sys/power/state" to get a locked screen after waking up 
your computer from suspend to RAM)
-
-.TP
-* You can specify either a background color or a PNG image which will be 
displayed while your screen is locked.
-
-.TP
-* You can specify whether i3lock should bell upon a wrong password.
-
-.TP
-* i3lock uses PAM and therefore is compatible with LDAP etc.
+.IP \[bu] 2
+i3lock forks, so you can combine it with an alias to suspend to RAM (run 
"i3lock && echo mem > /sys/power/state" to get a locked screen after waking up 
your computer from suspend to RAM)
+.IP \[bu]
+You can specify either a background color or a PNG image which will be 
displayed while your screen is locked.
+.IP \[bu]
+You can specify whether i3lock should bell upon a wrong password.
+.IP \[bu]
+i3lock uses PAM and therefore is compatible with LDAP, etc.
 
 
 .SH OPTIONS
@@ -71,8 +70,15 @@
 you did not disable this in your X server).
 
 .TP
+.B \-I, \-\-inactivity-timeout
+Specifies the number of seconds i3lock will wait for another password before
+turning off the monitors, in case you entered a wrong password or canceled by
+pressing Escape. Only makes sense together with \-d. If omitted, the default is
+30 seconds.
+
+.TP
 .B \-u, \-\-no-unlock-indicator
-Disables the unlock indicator. i3lock will by default show an unlock indicator
+Disable the unlock indicator. i3lock will by default show an unlock indicator
 after pressing keys. This will give feedback for every keypress and it will
 show you the current PAM state (whether your password is currently being
 verified or whether it is wrong).
@@ -83,8 +89,8 @@
 
 .TP
 .BI \-c\  rrggbb \fR,\ \fB\-\-color= rrggbb
-Turns the screen into the given color instead of white. Color must be given in 
6-byte
-format: rrggbb (i.e. ff0000 is red)
+Turn the screen into the given color instead of white. Color must be given in 
3-byte
+format: rrggbb (i.e. ff0000 is red).
 
 .TP
 .B \-t, \-\-tiling
@@ -95,10 +101,19 @@
 .BI \-p\  win|default \fR,\ \fB\-\-pointer= win|default
 If you specify "default",
 .B i3lock
-does not hide your Mousepointer. If you specify "win",
+does not hide your mouse pointer. If you specify "win",
 .B i3lock
-displays a hardcoded Windows-Pointer (thus enabling you to fuck with your
-friends by using a Screenshot of a Windows-Desktop as a locking-screen).
+displays a hardcoded Windows-Pointer (thus enabling you to mess with your
+friends by using a screenshot of a Windows desktop as a locking-screen).
+
+.TP
+.B \-e, \-\-ignore-empty-password
+When an empty password is provided by the user, do not validate
+it. Without this option, the empty password will be provided to PAM
+and, if invalid, the user will have to wait a few seconds before
+another try. This can be useful if the XF86ScreenSaver key is used to
+put a laptop to sleep and bounce on resume or if you happen to wake up
+your computer with the enter key.
 
 .SH SEE ALSO
 .IR xautolock(1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3lock-2.5/i3lock.c new/i3lock-2.6/i3lock.c
--- old/i3lock-2.5/i3lock.c     2013-06-09 11:49:00.000000000 +0200
+++ new/i3lock-2.6/i3lock.c     2014-07-18 20:25:02.000000000 +0200
@@ -1,7 +1,7 @@
 /*
  * vim:ts=4:sw=4:expandtab
  *
- * © 2010-2012 Michael Stapelberg
+ * © 2010-2013 Michael Stapelberg
  *
  * See LICENSE for licensing information
  *
@@ -13,18 +13,17 @@
 #include <stdbool.h>
 #include <stdint.h>
 #include <xcb/xcb.h>
+#include <xcb/xkb.h>
 #include <xcb/dpms.h>
 #include <err.h>
 #include <assert.h>
 #include <security/pam_appl.h>
-#include <X11/Xlib-xcb.h>
 #include <getopt.h>
 #include <string.h>
 #include <ev.h>
 #include <sys/mman.h>
-#include <X11/XKBlib.h>
-#include <X11/extensions/XKBfile.h>
 #include <xkbcommon/xkbcommon.h>
+#include <xkbcommon/xkbcommon-x11.h>
 #include <cairo.h>
 #include <cairo/cairo-xcb.h>
 
@@ -34,9 +33,18 @@
 #include "unlock_indicator.h"
 #include "xinerama.h"
 
+#define TSTAMP_N_SECS(n) (n * 1.0)
+#define TSTAMP_N_MINS(n) (60 * TSTAMP_N_SECS(n))
+#define START_TIMER(timer_obj, timeout, callback) \
+    timer_obj = start_timer(timer_obj, timeout, callback)
+#define STOP_TIMER(timer_obj) \
+    timer_obj = stop_timer(timer_obj)
+
+typedef void (*ev_callback_t)(EV_P_ ev_timer *w, int revents);
+
 /* We need this for libxkbfile */
-static Display *display;
 char color[7] = "ffffff";
+int inactivity_timeout = 30;
 uint32_t last_resolution[2];
 xcb_window_t win;
 static xcb_cursor_t cursor;
@@ -51,15 +59,22 @@
 static bool dont_fork = false;
 struct ev_loop *main_loop;
 static struct ev_timer *clear_pam_wrong_timeout;
+static struct ev_timer *clear_indicator_timeout;
+static struct ev_timer *dpms_timeout;
+static struct ev_timer *discard_passwd_timeout;
 extern unlock_state_t unlock_state;
 extern pam_state_t pam_state;
 
 static struct xkb_state *xkb_state;
 static struct xkb_context *xkb_context;
 static struct xkb_keymap *xkb_keymap;
+static uint8_t xkb_base_event;
+static uint8_t xkb_base_error;
 
 cairo_surface_t *img = NULL;
 bool tile = false;
+bool ignore_empty_password = false;
+bool skip_repeated_empty_password = false;
 
 /* isutf, u8_dec © 2005 Jeff Bezanson, public domain */
 #define isutf(c) (((c) & 0xC0) != 0x80)
@@ -72,69 +87,50 @@
     (void)(isutf(s[--(*i)]) || isutf(s[--(*i)]) || isutf(s[--(*i)]) || --(*i));
 }
 
+static void turn_monitors_on(void) {
+    if (dpms)
+        dpms_set_mode(conn, XCB_DPMS_DPMS_MODE_ON);
+}
+
+static void turn_monitors_off(void) {
+    if (dpms)
+        dpms_set_mode(conn, XCB_DPMS_DPMS_MODE_OFF);
+}
+
 /*
  * Loads the XKB keymap from the X11 server and feeds it to xkbcommon.
  * Necessary so that we can properly let xkbcommon track the keyboard state and
  * translate keypresses to utf-8.
  *
- * Ideally, xkbcommon would ship something like this itself, but as of now
- * (version 0.2.0), it doesn’t.
- *
  */
 static bool load_keymap(void) {
-    bool ret = false;
-    XkbFileInfo result;
-    memset(&result, '\0', sizeof(result));
-    result.xkb = XkbGetKeyboard(display, XkbAllMapComponentsMask, 
XkbUseCoreKbd);
-    if (result.xkb == NULL) {
-        fprintf(stderr, "[i3lock] XKB: XkbGetKeyboard failed\n");
-        return false;
-    }
-
-    FILE *temp = tmpfile();
-    if (temp == NULL) {
-        fprintf(stderr, "[i3lock] could not create tempfile\n");
-        return false;
-    }
-
-    bool ok = XkbWriteXKBKeymap(temp, &result, false, false, NULL, NULL);
-    if (!ok) {
-        fprintf(stderr, "[i3lock] XkbWriteXKBKeymap failed\n");
-        goto out;
-    }
-
-    rewind(temp);
-
     if (xkb_context == NULL) {
         if ((xkb_context = xkb_context_new(0)) == NULL) {
             fprintf(stderr, "[i3lock] could not create xkbcommon context\n");
-            goto out;
+            return false;
         }
     }
 
-    if (xkb_keymap != NULL)
-        xkb_keymap_unref(xkb_keymap);
+    xkb_keymap_unref(xkb_keymap);
 
-    if ((xkb_keymap = xkb_keymap_new_from_file(xkb_context, temp, 
XKB_KEYMAP_FORMAT_TEXT_V1, 0)) == NULL) {
-        fprintf(stderr, "[i3lock] xkb_keymap_new_from_file failed\n");
-        goto out;
+    int32_t device_id = xkb_x11_get_core_keyboard_device_id(conn);
+    DEBUG("device = %d\n", device_id);
+    if ((xkb_keymap = xkb_x11_keymap_new_from_device(xkb_context, conn, 
device_id, 0)) == NULL) {
+        fprintf(stderr, "[i3lock] xkb_x11_keymap_new_from_device failed\n");
+        return false;
     }
 
-    struct xkb_state *new_state = xkb_state_new(xkb_keymap);
+    struct xkb_state *new_state =
+        xkb_x11_state_new_from_device(xkb_keymap, conn, device_id);
     if (new_state == NULL) {
-        fprintf(stderr, "[i3lock] xkb_state_new failed\n");
-        goto out;
+        fprintf(stderr, "[i3lock] xkb_x11_state_new_from_device failed\n");
+        return false;
     }
 
-    if (xkb_state != NULL)
-        xkb_state_unref(xkb_state);
+    xkb_state_unref(xkb_state);
     xkb_state = new_state;
 
-    ret = true;
-out:
-    XkbFreeKeyboard(result.xkb, XkbAllComponentsMask, true);
-    fclose(temp);
-    return ret;
+    return true;
 }
 
 /*
@@ -154,9 +150,33 @@
         vpassword[c] = c + (int)beep;
 }
 
+ev_timer* start_timer(ev_timer *timer_obj, ev_tstamp timeout, ev_callback_t 
callback) {
+    if (timer_obj) {
+        ev_timer_stop(main_loop, timer_obj);
+        ev_timer_set(timer_obj, timeout, 0.);
+        ev_timer_start(main_loop, timer_obj);
+    } else {
+        /* When there is no memory, we just don’t have a timeout. We cannot
+         * exit() here, since that would effectively unlock the screen. */
+        timer_obj = calloc(sizeof(struct ev_timer), 1);
+        if (timer_obj) {
+            ev_timer_init(timer_obj, callback, timeout, 0.);
+            ev_timer_start(main_loop, timer_obj);
+        }
+    }
+    return timer_obj;
+}
+
+ev_timer* stop_timer(ev_timer *timer_obj) {
+    if (timer_obj) {
+        ev_timer_stop(main_loop, timer_obj);
+        free(timer_obj);
+    }
+    return NULL;
+}
 
 /*
- * Resets pam_state to STATE_PAM_IDLE 2 seconds after an unsuccesful
+ * Resets pam_state to STATE_PAM_IDLE 2 seconds after an unsuccessful
  * authentication event.
  *
  */
@@ -167,9 +187,12 @@
     redraw_screen();
 
     /* Now free this timeout. */
-    ev_timer_stop(main_loop, clear_pam_wrong_timeout);
-    free(clear_pam_wrong_timeout);
-    clear_pam_wrong_timeout = NULL;
+    STOP_TIMER(clear_pam_wrong_timeout);
+}
+
+static void clear_indicator_cb(EV_P_ ev_timer *w, int revents) {
+    clear_indicator();
+    STOP_TIMER(clear_indicator_timeout);
 }
 
 static void clear_input(void) {
@@ -179,25 +202,36 @@
 
     /* Hide the unlock indicator after a bit if the password buffer is
      * empty. */
-    start_clear_indicator_timeout();
+    START_TIMER(clear_indicator_timeout, 1.0, clear_indicator_cb);
     unlock_state = STATE_BACKSPACE_ACTIVE;
     redraw_screen();
     unlock_state = STATE_KEY_PRESSED;
 }
 
-static void input_done(void) {
-    if (clear_pam_wrong_timeout) {
-        ev_timer_stop(main_loop, clear_pam_wrong_timeout);
-        free(clear_pam_wrong_timeout);
-        clear_pam_wrong_timeout = NULL;
-    }
+static void turn_off_monitors_cb(EV_P_ ev_timer *w, int revents) {
+    if (input_position == 0)
+        turn_monitors_off();
 
+    STOP_TIMER(dpms_timeout);
+}
+
+static void discard_passwd_cb(EV_P_ ev_timer *w, int revents) {
+    clear_input();
+    turn_monitors_off();
+    STOP_TIMER(discard_passwd_timeout);
+}
+
+static void input_done(void) {
+    STOP_TIMER(clear_pam_wrong_timeout);
     pam_state = STATE_PAM_VERIFY;
     redraw_screen();
 
     if (pam_authenticate(pam_handle, 0) == PAM_SUCCESS) {
         DEBUG("successfully authenticated\n");
         clear_password_memory();
+        /* Turn the screen on, as it may have been turned off
+         * on release of the 'enter' key. */
+        turn_monitors_on();
         exit(0);
     }
 
@@ -211,14 +245,11 @@
     /* Clear this state after 2 seconds (unless the user enters another
      * password during that time). */
     ev_now_update(main_loop);
-    if ((clear_pam_wrong_timeout = calloc(sizeof(struct ev_timer), 1))) {
-        ev_timer_init(clear_pam_wrong_timeout, clear_pam_wrong, 2.0, 0.);
-        ev_timer_start(main_loop, clear_pam_wrong_timeout);
-    }
+    START_TIMER(clear_pam_wrong_timeout, TSTAMP_N_SECS(2), clear_pam_wrong);
 
     /* Cancel the clear_indicator_timeout, it would hide the unlock indicator
      * too early. */
-    stop_clear_indicator_timeout();
+    STOP_TIMER(clear_indicator_timeout);
 
     /* beep on authentication failure, if enabled */
     if (beep) {
@@ -227,20 +258,19 @@
     }
 }
 
-/*
- * Called when the user releases a key. We need to leave the Mode_switch
- * state when the user releases the Mode_switch key.
- *
- */
-static void handle_key_release(xcb_key_release_event_t *event) {
-    xkb_state_update_key(xkb_state, event->detail, XKB_KEY_UP);
-}
-
 static void redraw_timeout(EV_P_ ev_timer *w, int revents) {
     redraw_screen();
+    STOP_TIMER(w);
+}
 
-    ev_timer_stop(main_loop, w);
-    free(w);
+static bool skip_without_validation(void) {
+    if (input_position != 0)
+        return false;
+
+    if (skip_repeated_empty_password || ignore_empty_password)
+        return true;
+
+    return false;
 }
 
 /*
@@ -257,7 +287,6 @@
 
     ksym = xkb_state_key_get_one_sym(xkb_state, event->detail);
     ctrl = xkb_state_mod_name_is_active(xkb_state, "Control", 
XKB_STATE_MODS_DEPRESSED);
-    xkb_state_update_key(xkb_state, event->detail, XKB_KEY_DOWN);
 
     /* The buffer will be null-terminated, so n >= 2 for 1 actual character. */
     memset(buffer, '\0', sizeof(buffer));
@@ -267,12 +296,21 @@
     case XKB_KEY_Return:
     case XKB_KEY_KP_Enter:
     case XKB_KEY_XF86ScreenSaver:
+        if (skip_without_validation()) {
+            clear_input();
+            return;
+        }
         password[input_position] = '\0';
         unlock_state = STATE_KEY_PRESSED;
         redraw_screen();
         input_done();
+        skip_repeated_empty_password = true;
         return;
+    default:
+        skip_repeated_empty_password = false;
+    }
 
+    switch (ksym) {
     case XKB_KEY_u:
         if (ctrl) {
             DEBUG("C-u pressed\n");
@@ -295,7 +333,7 @@
 
         /* Hide the unlock indicator after a bit if the password buffer is
          * empty. */
-        start_clear_indicator_timeout();
+        START_TIMER(clear_indicator_timeout, 1.0, clear_indicator_cb);
         unlock_state = STATE_BACKSPACE_ACTIVE;
         redraw_screen();
         unlock_state = STATE_KEY_PRESSED;
@@ -328,13 +366,10 @@
     redraw_screen();
     unlock_state = STATE_KEY_PRESSED;
 
-    struct ev_timer *timeout = calloc(sizeof(struct ev_timer), 1);
-    if (timeout) {
-        ev_timer_init(timeout, redraw_timeout, 0.25, 0.);
-        ev_timer_start(main_loop, timeout);
-    }
-
-    stop_clear_indicator_timeout();
+    struct ev_timer *timeout = NULL;
+    START_TIMER(timeout, TSTAMP_N_SECS(0.25), redraw_timeout);
+    STOP_TIMER(clear_indicator_timeout);
+    START_TIMER(discard_passwd_timeout, TSTAMP_N_MINS(3), discard_passwd_cb);
 }
 
 /*
@@ -346,7 +381,8 @@
  * hiding us) gets hidden.
  *
  */
-static void handle_visibility_notify(xcb_visibility_notify_event_t *event) {
+static void handle_visibility_notify(xcb_connection_t *conn,
+    xcb_visibility_notify_event_t *event) {
     if (event->state != XCB_VISIBILITY_UNOBSCURED) {
         uint32_t values[] = { XCB_STACK_MODE_ABOVE };
         xcb_configure_window(conn, event->window, 
XCB_CONFIG_WINDOW_STACK_MODE, values);
@@ -357,11 +393,54 @@
 /*
  * Called when the keyboard mapping changes. We update our symbols.
  *
+ * We ignore errors — if the new keymap cannot be loaded it’s better if the
+ * screen stays locked and the user intervenes by using killall i3lock.
+ *
  */
-static void handle_mapping_notify(xcb_mapping_notify_event_t *event) {
-    /* We ignore errors — if the new keymap cannot be loaded it’s better if the
-     * screen stays locked and the user intervenes by using killall i3lock. */
-    (void)load_keymap();
+static void process_xkb_event(xcb_generic_event_t *gevent) {
+    union xkb_event {
+        struct {
+            uint8_t response_type;
+            uint8_t xkbType;
+            uint16_t sequence;
+            xcb_timestamp_t time;
+            uint8_t deviceID;
+        } any;
+        xcb_xkb_new_keyboard_notify_event_t new_keyboard_notify;
+        xcb_xkb_map_notify_event_t map_notify;
+        xcb_xkb_state_notify_event_t state_notify;
+    } *event = (union xkb_event*)gevent;
+
+    DEBUG("process_xkb_event for device %d\n", event->any.deviceID);
+
+    if (event->any.deviceID != xkb_x11_get_core_keyboard_device_id(conn))
+        return;
+
+    /*
+     * XkbNewKkdNotify and XkbMapNotify together capture all sorts of keymap
+     * updates (e.g. xmodmap, xkbcomp, setxkbmap), with minimal redundent
+     * recompilations.
+     */
+    switch (event->any.xkbType) {
+        case XCB_XKB_NEW_KEYBOARD_NOTIFY:
+            if (event->new_keyboard_notify.changed & 
XCB_XKB_NKN_DETAIL_KEYCODES)
+                (void)load_keymap();
+            break;
+
+        case XCB_XKB_MAP_NOTIFY:
+            (void)load_keymap();
+            break;
+
+        case XCB_XKB_STATE_NOTIFY:
+            xkb_state_update_mask(xkb_state,
+                                  event->state_notify.baseMods,
+                                  event->state_notify.latchedMods,
+                                  event->state_notify.lockedMods,
+                                  event->state_notify.baseGroup,
+                                  event->state_notify.latchedGroup,
+                                  event->state_notify.lockedGroup);
+            break;
+    }
 }
 
 /*
@@ -467,23 +546,23 @@
 
         /* Strip off the highest bit (set if the event is generated) */
         int type = (event->response_type & 0x7F);
+
         switch (type) {
             case XCB_KEY_PRESS:
                 handle_key_press((xcb_key_press_event_t*)event);
                 break;
 
             case XCB_KEY_RELEASE:
-                handle_key_release((xcb_key_release_event_t*)event);
-
                 /* If this was the backspace or escape key we are back at an
-                 * empty input, so turn off the screen if DPMS is enabled */
-                if (dpms && input_position == 0)
-                    dpms_turn_off_screen(conn);
-
+                 * empty input, so turn off the screen if DPMS is enabled, but
+                 * only do that after some timeout: maybe user mistyped and
+                 * will type again right away */
+                START_TIMER(dpms_timeout, TSTAMP_N_SECS(inactivity_timeout),
+                            turn_off_monitors_cb);
                 break;
 
             case XCB_VISIBILITY_NOTIFY:
-                
handle_visibility_notify((xcb_visibility_notify_event_t*)event);
+                handle_visibility_notify(conn, 
(xcb_visibility_notify_event_t*)event);
                 break;
 
             case XCB_MAP_NOTIFY:
@@ -500,19 +579,76 @@
                 }
                 break;
 
-            case XCB_MAPPING_NOTIFY:
-                handle_mapping_notify((xcb_mapping_notify_event_t*)event);
-                break;
-
             case XCB_CONFIGURE_NOTIFY:
                 handle_screen_resize();
                 break;
+
+            default:
+                if (type == xkb_base_event)
+                    process_xkb_event(event);
         }
 
         free(event);
     }
 }
 
+/*
+ * This function is called from a fork()ed child and will raise the i3lock
+ * window when the window is obscured, even when the main i3lock process is
+ * blocked due to PAM.
+ *
+ */
+static void raise_loop(xcb_window_t window) {
+    xcb_connection_t *conn;
+    xcb_generic_event_t *event;
+    int screens;
+
+    if ((conn = xcb_connect(NULL, &screens)) == NULL ||
+        xcb_connection_has_error(conn))
+        errx(EXIT_FAILURE, "Cannot open display\n");
+
+    /* We need to know about the window being obscured or getting destroyed. */
+    xcb_change_window_attributes(conn, window, XCB_CW_EVENT_MASK,
+        (uint32_t[]){
+            XCB_EVENT_MASK_VISIBILITY_CHANGE |
+            XCB_EVENT_MASK_STRUCTURE_NOTIFY
+        });
+    xcb_flush(conn);
+
+    DEBUG("Watching window 0x%08x\n", window);
+    while ((event = xcb_wait_for_event(conn)) != NULL) {
+        if (event->response_type == 0) {
+            xcb_generic_error_t *error = (xcb_generic_error_t*)event;
+            DEBUG("X11 Error received! sequence 0x%x, error_code = %d\n",
+                 error->sequence, error->error_code);
+            free(event);
+            continue;
+        }
+        /* Strip off the highest bit (set if the event is generated) */
+        int type = (event->response_type & 0x7F);
+        DEBUG("Read event of type %d\n", type);
+        switch (type) {
+            case XCB_VISIBILITY_NOTIFY:
+                handle_visibility_notify(conn, 
(xcb_visibility_notify_event_t*)event);
+                break;
+            case XCB_UNMAP_NOTIFY:
+                DEBUG("UnmapNotify for 0x%08x\n", 
(((xcb_unmap_notify_event_t*)event)->window));
+                if (((xcb_unmap_notify_event_t*)event)->window == window)
+                    exit(EXIT_SUCCESS);
+                break;
+            case XCB_DESTROY_NOTIFY:
+                DEBUG("DestroyNotify for 0x%08x\n", 
(((xcb_destroy_notify_event_t*)event)->window));
+                if (((xcb_destroy_notify_event_t*)event)->window == window)
+                    exit(EXIT_SUCCESS);
+                break;
+            default:
+                DEBUG("Unhandled event type %d\n", type);
+                break;
+        }
+        free(event);
+    }
+}
+
 int main(int argc, char *argv[]) {
     char *username;
     char *image_path = NULL;
@@ -533,13 +669,16 @@
         {"no-unlock-indicator", no_argument, NULL, 'u'},
         {"image", required_argument, NULL, 'i'},
         {"tiling", no_argument, NULL, 't'},
+        {"ignore-empty-password", no_argument, NULL, 'e'},
+        {"inactivity-timeout", required_argument, NULL, 'I'},
         {NULL, no_argument, NULL, 0}
     };
 
     if ((username = getenv("USER")) == NULL)
-        errx(1, "USER environment variable not set, please set it.\n");
+        errx(EXIT_FAILURE, "USER environment variable not set, please set 
it.\n");
 
-    while ((o = getopt_long(argc, argv, "hvnbdc:p:ui:t", longopts, &optind)) 
!= -1) {
+    char *optstring = "hvnbdc:p:ui:teI:";
+    while ((o = getopt_long(argc, argv, optstring, longopts, &optind)) != -1) {
         switch (o) {
         case 'v':
             errx(EXIT_SUCCESS, "version " VERSION " © 2010-2012 Michael 
Stapelberg");
@@ -552,6 +691,13 @@
         case 'd':
             dpms = true;
             break;
+        case 'I': {
+            int time = 0;
+            if (sscanf(optarg, "%d", &time) != 1 || time < 0)
+                errx(EXIT_FAILURE, "invalid timeout, it must be a positive 
integer\n");
+            inactivity_timeout = time;
+            break;
+        }
         case 'c': {
             char *arg = optarg;
 
@@ -560,7 +706,7 @@
                 arg++;
 
             if (strlen(arg) != 6 || sscanf(arg, "%06[0-9a-fA-F]", color) != 1)
-                errx(1, "color is invalid, it must be given in 3-byte 
hexadecimal format: rrggbb\n");
+                errx(EXIT_FAILURE, "color is invalid, it must be given in 
3-byte hexadecimal format: rrggbb\n");
 
             break;
         }
@@ -579,16 +725,19 @@
             } else if (!strcmp(optarg, "default")) {
                 curs_choice = CURS_DEFAULT;
             } else {
-                errx(1, "i3lock: Invalid pointer type given. Expected one of 
\"win\" or \"default\".\n");
+                errx(EXIT_FAILURE, "i3lock: Invalid pointer type given. 
Expected one of \"win\" or \"default\".\n");
             }
             break;
+        case 'e':
+            ignore_empty_password = true;
+            break;
         case 0:
             if (strcmp(longopts[optind].name, "debug") == 0)
                 debug_mode = true;
             break;
         default:
-            errx(1, "Syntax: i3lock [-v] [-n] [-b] [-d] [-c color] [-u] [-p 
win|default]"
-            " [-i image.png] [-t]"
+            errx(EXIT_FAILURE, "Syntax: i3lock [-v] [-n] [-b] [-d] [-c color] 
[-u] [-p win|default]"
+            " [-i image.png] [-t] [-e] [-I]"
             );
         }
     }
@@ -613,16 +762,46 @@
         err(EXIT_FAILURE, "Could not lock page in memory, check 
RLIMIT_MEMLOCK");
 #endif
 
-    /* Initialize connection to X11 */
-    if ((display = XOpenDisplay(NULL)) == NULL)
-        errx(EXIT_FAILURE, "Could not connect to X11, maybe you need to set 
DISPLAY?");
-    XSetEventQueueOwner(display, XCBOwnsEventQueue);
-    conn = XGetXCBConnection(display);
-
     /* Double checking that connection is good and operatable with xcb */
-    if (xcb_connection_has_error(conn))
+    int screennr;
+    if ((conn = xcb_connect(NULL, &screennr)) == NULL ||
+        xcb_connection_has_error(conn))
         errx(EXIT_FAILURE, "Could not connect to X11, maybe you need to set 
DISPLAY?");
 
+    if (xkb_x11_setup_xkb_extension(conn,
+            XKB_X11_MIN_MAJOR_XKB_VERSION,
+            XKB_X11_MIN_MINOR_XKB_VERSION,
+            0,
+            NULL,
+            NULL,
+            &xkb_base_event,
+            &xkb_base_error) != 1)
+        errx(EXIT_FAILURE, "Could not setup XKB extension.");
+
+    static const xcb_xkb_map_part_t required_map_parts =
+        (XCB_XKB_MAP_PART_KEY_TYPES |
+         XCB_XKB_MAP_PART_KEY_SYMS |
+         XCB_XKB_MAP_PART_MODIFIER_MAP |
+         XCB_XKB_MAP_PART_EXPLICIT_COMPONENTS |
+         XCB_XKB_MAP_PART_KEY_ACTIONS |
+         XCB_XKB_MAP_PART_VIRTUAL_MODS |
+         XCB_XKB_MAP_PART_VIRTUAL_MOD_MAP);
+
+    static const xcb_xkb_event_type_t required_events =
+        (XCB_XKB_EVENT_TYPE_NEW_KEYBOARD_NOTIFY |
+         XCB_XKB_EVENT_TYPE_MAP_NOTIFY |
+         XCB_XKB_EVENT_TYPE_STATE_NOTIFY);
+
+    xcb_xkb_select_events(
+        conn,
+        xkb_x11_get_core_keyboard_device_id(conn),
+        required_events,
+        0,
+        required_events,
+        required_map_parts,
+        required_map_parts,
+        0);
+
     /* When we cannot initially load the keymap, we better exit */
     if (!load_keymap())
         errx(EXIT_FAILURE, "Could not load keymap");
@@ -657,8 +836,8 @@
         img = cairo_image_surface_create_from_png(image_path);
         /* In case loading failed, we just pretend no -i was specified. */
         if (cairo_surface_status(img) != CAIRO_STATUS_SUCCESS) {
-            fprintf(stderr, "Could not load image \"%s\": cairo surface status 
%d\n",
-                    image_path, cairo_surface_status(img));
+            fprintf(stderr, "Could not load image \"%s\": %s\n",
+                    image_path, 
cairo_status_to_string(cairo_surface_status(img)));
             img = NULL;
         }
     }
@@ -670,12 +849,27 @@
     win = open_fullscreen_window(conn, screen, color, bg_pixmap);
     xcb_free_pixmap(conn, bg_pixmap);
 
+    pid_t pid = fork();
+    /* The pid == -1 case is intentionally ignored here:
+     * While the child process is useful for preventing other windows from
+     * popping up while i3lock blocks, it is not critical. */
+    if (pid == 0) {
+        /* Child */
+        close(xcb_get_file_descriptor(conn));
+        raise_loop(win);
+        exit(EXIT_SUCCESS);
+    }
+
     cursor = create_cursor(conn, screen, win, curs_choice);
 
     grab_pointer_and_keyboard(conn, screen, cursor);
+    /* Load the keymap again to sync the current modifier state. Since we first
+     * loaded the keymap, there might have been changes, but starting from now,
+     * we should get all key presses/releases due to having grabbed the
+     * keyboard. */
+    (void)load_keymap();
 
-    if (dpms)
-        dpms_turn_off_screen(conn);
+    turn_monitors_off();
 
     /* Initialize the libev event loop. */
     main_loop = EV_DEFAULT;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3lock-2.5/unlock_indicator.c 
new/i3lock-2.6/unlock_indicator.c
--- old/i3lock-2.5/unlock_indicator.c   2013-06-09 11:49:00.000000000 +0200
+++ new/i3lock-2.6/unlock_indicator.c   2014-07-18 20:25:02.000000000 +0200
@@ -1,19 +1,21 @@
 /*
  * vim:ts=4:sw=4:expandtab
  *
- * © 2010-2012 Michael Stapelberg
+ * © 2010-2014 Michael Stapelberg
  *
  * See LICENSE for licensing information
  *
  */
 #include <stdbool.h>
 #include <stdlib.h>
+#include <stdio.h>
 #include <math.h>
 #include <xcb/xcb.h>
 #include <ev.h>
 #include <cairo.h>
 #include <cairo/cairo-xcb.h>
 
+#include "i3lock.h"
 #include "xcb.h"
 #include "unlock_indicator.h"
 #include "xinerama.h"
@@ -27,13 +29,12 @@
  * Variables defined in i3lock.c.
  
******************************************************************************/
 
+extern bool debug_mode;
+
 /* The current position in the input buffer. Useful to determine if any
  * characters of the password have already been entered or not. */
 int input_position;
 
-/* The ev main loop. */
-struct ev_loop *main_loop;
-
 /* The lock window. */
 extern xcb_window_t win;
 
@@ -52,10 +53,15 @@
 extern char color[7];
 
 
/*******************************************************************************
- * Local variables.
+ * Variables defined in xcb.c.
  
******************************************************************************/
 
-static struct ev_timer *clear_indicator_timeout;
+/* The root screen, to determine the DPI. */
+extern xcb_screen_t *screen;
+
+/*******************************************************************************
+ * Local variables.
+ 
******************************************************************************/
 
 /* Cache the screen’s visual, necessary for creating a Cairo context. */
 static xcb_visualtype_t *vistype;
@@ -66,12 +72,26 @@
 pam_state_t pam_state;
 
 /*
+ * Returns the scaling factor of the current screen. E.g., on a 227 DPI MacBook
+ * Pro 13" Retina screen, the scaling factor is 227/96 = 2.36.
+ *
+ */
+static double scaling_factor(void) {
+    const int dpi = (double)screen->height_in_pixels * 25.4 /
+                    (double)screen->height_in_millimeters;
+    return (dpi / 96.0);
+}
+
+/*
  * Draws global image with fill color onto a pixmap with the given
  * resolution and returns it.
  *
  */
 xcb_pixmap_t draw_image(uint32_t *resolution) {
     xcb_pixmap_t bg_pixmap = XCB_NONE;
+    int button_diameter_physical = ceil(scaling_factor() * BUTTON_DIAMETER);
+    DEBUG("scaling_factor is %.f, physical diameter is %d px\n",
+          scaling_factor(), button_diameter_physical);
 
     if (!vistype)
         vistype = get_root_visual_type(screen);
@@ -79,7 +99,7 @@
     /* Initialize cairo: Create one in-memory surface to render the unlock
      * indicator on, create one XCB surface to actually draw (one or more,
      * depending on the amount of screens) unlock indicators on. */
-    cairo_surface_t *output = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 
BUTTON_DIAMETER, BUTTON_DIAMETER);
+    cairo_surface_t *output = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 
button_diameter_physical, button_diameter_physical);
     cairo_t *ctx = cairo_create(output);
 
     cairo_surface_t *xcb_output = cairo_xcb_surface_create(conn, bg_pixmap, 
vistype, resolution[0], resolution[1]);
@@ -112,6 +132,7 @@
     }
 
     if (unlock_state >= STATE_KEY_PRESSED && unlock_indicator) {
+        cairo_scale(ctx, scaling_factor(), scaling_factor());
         /* Draw a (centered) circle with transparent background. */
         cairo_set_line_width(ctx, 10.0);
         cairo_arc(ctx,
@@ -236,20 +257,20 @@
     if (xr_screens > 0) {
         /* Composite the unlock indicator in the middle of each screen. */
         for (int screen = 0; screen < xr_screens; screen++) {
-            int x = (xr_resolutions[screen].x + ((xr_resolutions[screen].width 
/ 2) - (BUTTON_DIAMETER / 2)));
-            int y = (xr_resolutions[screen].y + 
((xr_resolutions[screen].height / 2) - (BUTTON_DIAMETER / 2)));
+            int x = (xr_resolutions[screen].x + ((xr_resolutions[screen].width 
/ 2) - (button_diameter_physical / 2)));
+            int y = (xr_resolutions[screen].y + 
((xr_resolutions[screen].height / 2) - (button_diameter_physical / 2)));
             cairo_set_source_surface(xcb_ctx, output, x, y);
-            cairo_rectangle(xcb_ctx, x, y, BUTTON_DIAMETER, BUTTON_DIAMETER);
+            cairo_rectangle(xcb_ctx, x, y, button_diameter_physical, 
button_diameter_physical);
             cairo_fill(xcb_ctx);
         }
     } else {
         /* We have no information about the screen sizes/positions, so we just
          * place the unlock indicator in the middle of the X root window and
          * hope for the best. */
-        int x = (last_resolution[0] / 2) - (BUTTON_DIAMETER / 2);
-        int y = (last_resolution[1] / 2) - (BUTTON_DIAMETER / 2);
+        int x = (last_resolution[0] / 2) - (button_diameter_physical / 2);
+        int y = (last_resolution[1] / 2) - (button_diameter_physical / 2);
         cairo_set_source_surface(xcb_ctx, output, x, y);
-        cairo_rectangle(xcb_ctx, x, y, BUTTON_DIAMETER, BUTTON_DIAMETER);
+        cairo_rectangle(xcb_ctx, x, y, button_diameter_physical, 
button_diameter_physical);
         cairo_fill(xcb_ctx);
     }
 
@@ -279,45 +300,9 @@
  * password buffer.
  *
  */
-static void clear_indicator(EV_P_ ev_timer *w, int revents) {
+void clear_indicator(void) {
     if (input_position == 0) {
         unlock_state = STATE_STARTED;
     } else unlock_state = STATE_KEY_PRESSED;
     redraw_screen();
-
-    ev_timer_stop(main_loop, clear_indicator_timeout);
-    free(clear_indicator_timeout);
-    clear_indicator_timeout = NULL;
-}
-
-/*
- * (Re-)starts the clear_indicator timeout. Called after pressing backspace or
- * after an unsuccessful authentication attempt.
- *
- */
-void start_clear_indicator_timeout(void) {
-    if (clear_indicator_timeout) {
-        ev_timer_stop(main_loop, clear_indicator_timeout);
-        ev_timer_set(clear_indicator_timeout, 1.0, 0.);
-        ev_timer_start(main_loop, clear_indicator_timeout);
-    } else {
-        /* When there is no memory, we just don’t have a timeout. We cannot
-         * exit() here, since that would effectively unlock the screen. */
-        if (!(clear_indicator_timeout = calloc(sizeof(struct ev_timer), 1)))
-            return;
-        ev_timer_init(clear_indicator_timeout, clear_indicator, 1.0, 0.);
-        ev_timer_start(main_loop, clear_indicator_timeout);
-    }
-}
-
-/*
- * Stops the clear_indicator timeout.
- *
- */
-void stop_clear_indicator_timeout(void) {
-    if (clear_indicator_timeout) {
-        ev_timer_stop(main_loop, clear_indicator_timeout);
-        free(clear_indicator_timeout);
-        clear_indicator_timeout = NULL;
-    }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3lock-2.5/unlock_indicator.h 
new/i3lock-2.6/unlock_indicator.h
--- old/i3lock-2.5/unlock_indicator.h   2013-06-09 11:49:00.000000000 +0200
+++ new/i3lock-2.6/unlock_indicator.h   2014-07-18 20:25:02.000000000 +0200
@@ -18,7 +18,6 @@
 
 xcb_pixmap_t draw_image(uint32_t* resolution);
 void redraw_screen(void);
-void start_clear_indicator_timeout(void);
-void stop_clear_indicator_timeout(void);
+void clear_indicator(void);
 
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3lock-2.5/xcb.c new/i3lock-2.6/xcb.c
--- old/i3lock-2.5/xcb.c        2013-06-09 11:49:00.000000000 +0200
+++ new/i3lock-2.6/xcb.c        2014-07-18 20:25:02.000000000 +0200
@@ -155,9 +155,13 @@
     return win;
 }
 
-void dpms_turn_off_screen(xcb_connection_t *conn) {
+/*
+ * Set the dpms level to 'mode'.
+ *
+ */
+void dpms_set_mode(xcb_connection_t *conn, xcb_dpms_dpms_mode_t mode) {
     xcb_dpms_enable(conn);
-    xcb_dpms_force_level(conn, XCB_DPMS_DPMS_MODE_OFF);
+    xcb_dpms_force_level(conn, mode);
     xcb_flush(conn);
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/i3lock-2.5/xcb.h new/i3lock-2.6/xcb.h
--- old/i3lock-2.5/xcb.h        2013-06-09 11:49:00.000000000 +0200
+++ new/i3lock-2.6/xcb.h        2014-07-18 20:25:02.000000000 +0200
@@ -2,6 +2,7 @@
 #define _XCB_H
 
 #include <xcb/xcb.h>
+#include <xcb/dpms.h>
 
 extern xcb_connection_t *conn;
 extern xcb_screen_t *screen;
@@ -10,7 +11,7 @@
 xcb_pixmap_t create_bg_pixmap(xcb_connection_t *conn, xcb_screen_t *scr, 
u_int32_t *resolution, char *color);
 xcb_window_t open_fullscreen_window(xcb_connection_t *conn, xcb_screen_t *scr, 
char *color, xcb_pixmap_t pixmap);
 void grab_pointer_and_keyboard(xcb_connection_t *conn, xcb_screen_t *screen, 
xcb_cursor_t cursor);
-void dpms_turn_off_screen(xcb_connection_t *conn);
+void dpms_set_mode(xcb_connection_t *conn, xcb_dpms_dpms_mode_t mode);
 xcb_cursor_t create_cursor(xcb_connection_t *conn, xcb_screen_t *screen, 
xcb_window_t win, int choice);
 
 #endif


-- 
To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org
For additional commands, e-mail: opensuse-commit+h...@opensuse.org

Reply via email to