]> git.sur5r.net Git - i3/i3lock/commitdiff
Raise the i3lock window upon visibility notifies
authorMichael Stapelberg <michael@stapelberg.de>
Tue, 20 Jul 2010 18:30:44 +0000 (20:30 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Tue, 20 Jul 2010 18:30:44 +0000 (20:30 +0200)
i3lock.c
xcb.c

index cb671d56838b3720f8036a8394b94236d9763bd6..6e45c596bff8b4dd72dda29bedd6f0317cccb70a 100644 (file)
--- a/i3lock.c
+++ b/i3lock.c
@@ -163,6 +163,25 @@ static void handle_key_press(xcb_key_press_event_t *event) {
     printf("current password = %s\n", password);
 }
 
+/*
+ * A visibility notify event will be received when the visibility (= can the
+ * user view the complete window) changes, so for example when a popup overlays
+ * some area of the i3lock window.
+ *
+ * In this case, we raise our window on top so that the popup (or whatever is
+ * hiding us) gets hidden.
+ *
+ */
+void handle_visibility_notify(xcb_visibility_notify_event_t *event) {
+    printf("visibility notify (window 0x%08x, state %d)\n", event->window, event->state);
+    if (event->state != XCB_VISIBILITY_UNOBSCURED) {
+        printf("window is obscured (not fully visible), raising\n");
+        uint32_t values[] = { XCB_STACK_MODE_ABOVE };
+        xcb_configure_window(conn, event->window, XCB_CONFIG_WINDOW_STACK_MODE, values);
+        xcb_flush(conn);
+    }
+}
+
 /*
  * Callback function for PAM. We only react on password request callbacks.
  *
@@ -351,6 +370,11 @@ int main(int argc, char *argv[]) {
             continue;
         }
 
+        if (type == XCB_VISIBILITY_NOTIFY) {
+            handle_visibility_notify((xcb_visibility_notify_event_t*)event);
+            continue;
+        }
+
         printf("WARNING: unhandled event of type %d\n", type);
     }
 
diff --git a/xcb.c b/xcb.c
index 5627af1c09a7c0ae0f02e64abced53a8e3b32047..032b523bfdf2a4b70fa0ef305badbabbe26ac3ef 100644 (file)
--- a/xcb.c
+++ b/xcb.c
@@ -62,7 +62,10 @@ xcb_window_t open_fullscreen_window(xcb_connection_t *conn, xcb_screen_t *scr, c
     values[1] = 1;
 
     mask |= XCB_CW_EVENT_MASK;
-    values[2] = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE;
+    values[2] = XCB_EVENT_MASK_EXPOSURE |
+                XCB_EVENT_MASK_KEY_PRESS |
+                XCB_EVENT_MASK_KEY_RELEASE |
+                XCB_EVENT_MASK_VISIBILITY_CHANGE;
 
     xcb_create_window(conn,
                       24,