]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: use restore_conn, not conn 3547/head
authorMichael Stapelberg <michael@stapelberg.de>
Sat, 8 Dec 2018 12:31:53 +0000 (13:31 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 8 Dec 2018 12:31:53 +0000 (13:31 +0100)
Using the wrong X11 connection breaks the libev event handling model:
xcb_flush() must be called immediately before handing control to libev.

Before this fix:

1. xcb_prepare_cb would read and flush conn
2. restore_xcb_prepare_cb would read and flush restore_conn,
   BUT also inadvertantly call xcb_flush(conn), resulting in new
   events being filled into the XCB event queue
3. libev waits for new events
4. after 1 minute, libev times out and the events are processed

Diagnosed using strace on testcases/complete-run.pl.

related to commit 0d8b6714e39af81cbd6f4fbad500872a715dea24

related to #3510

src/restore_layout.c

index b99a50c165ebbd922379f996527c8a57e00e3dc5..9f19a690d9013e40ef7bf268015cd7e40810b6e3 100644 (file)
@@ -180,8 +180,8 @@ static void update_placeholder_contents(placeholder_state *state) {
     int y = (state->rect.height / 2) - (config.font.height / 2);
     draw_util_text(line, &(state->surface), foreground, background, x, y, text_width);
     i3string_free(line);
-    xcb_flush(conn);
-    xcb_aux_sync(conn);
+    xcb_flush(restore_conn);
+    xcb_aux_sync(restore_conn);
 }
 
 static void open_placeholder_window(Con *con) {
@@ -221,7 +221,7 @@ static void open_placeholder_window(Con *con) {
         state->con = con;
         state->rect = con->rect;
 
-        draw_util_surface_init(conn, &(state->surface), placeholder, get_visualtype(root_screen), state->rect.width, state->rect.height);
+        draw_util_surface_init(restore_conn, &(state->surface), placeholder, get_visualtype(root_screen), state->rect.width, state->rect.height);
         update_placeholder_contents(state);
         TAILQ_INSERT_TAIL(&state_head, state, state);