]> git.sur5r.net Git - i3/i3lock/commitdiff
Fork after the window is visible, not before
authorMichael Stapelberg <michael@stapelberg.de>
Tue, 3 Jan 2012 20:19:17 +0000 (20:19 +0000)
committerMichael Stapelberg <michael@stapelberg.de>
Tue, 3 Jan 2012 20:19:17 +0000 (20:19 +0000)
i3lock.c

index 84c195dea0a639895274d8abfab4b17933fdba56..f9255d7241e3cf0b7a3e16acbe1f82391f5fc12d 100644 (file)
--- a/i3lock.c
+++ b/i3lock.c
@@ -63,6 +63,7 @@ static bool beep = false;
 static bool debug_mode = false;
 static bool dpms = false;
 static bool unlock_indicator = true;
+static bool dont_fork = false;
 static struct ev_loop *main_loop;
 static struct ev_timer *clear_pam_wrong_timeout;
 static struct ev_timer *clear_indicator_timeout;
@@ -710,6 +711,19 @@ static void xcb_check_cb(EV_P_ ev_check *w, int revents) {
             continue;
         }
 
+        if (type == XCB_MAP_NOTIFY) {
+            if (!dont_fork) {
+                /* After the first MapNotify, we never fork again. We don’t
+                 * expect to get another MapNotify, but better be sure… */
+                dont_fork = true;
+
+                /* In the parent process, we exit */
+                if (fork() != 0)
+                    exit(0);
+            }
+            continue;
+        }
+
         if (type == XCB_MAPPING_NOTIFY) {
             handle_mapping_notify((xcb_mapping_notify_event_t*)event);
             continue;
@@ -727,7 +741,6 @@ static void xcb_check_cb(EV_P_ ev_check *w, int revents) {
 }
 
 int main(int argc, char *argv[]) {
-    bool dont_fork = false;
     char *username;
 #ifndef NOLIBCAIRO
     char *image_path = NULL;
@@ -842,12 +855,6 @@ int main(int argc, char *argv[]) {
         xcb_connection_has_error(conn))
         errx(EXIT_FAILURE, "Could not connect to X11, maybe you need to set DISPLAY?");
 
-    if (!dont_fork) {
-        /* In the parent process, we exit */
-        if (fork() != 0)
-            return 0;
-    }
-
     /* if DPMS is enabled, check if the X server really supports it */
     if (dpms) {
         xcb_dpms_capable_cookie_t dpmsc = xcb_dpms_capable(conn);