diff --git a/i3lock.c b/i3lock.c index cb671d5..6e45c59 100644 --- 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 5627af1..032b523 100644 --- 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,