wayland: Round trip after window show/hide operations. Perform a round trip after showing/hiding the window to avoid protocol errors when ShowWindow() is called immediately after HideWindow().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c
index 5f441b9..c5b997c 100644
--- a/src/video/wayland/SDL_waylandwindow.c
+++ b/src/video/wayland/SDL_waylandwindow.c
@@ -1364,6 +1364,12 @@ void Wayland_ShowWindow(_THIS, SDL_Window *window)
unsetenv("XDG_ACTIVATION_TOKEN");
}
}
+
+ /*
+ * Roundtrip required to avoid a possible protocol violation when
+ * HideWindow was called immediately before ShowWindow.
+ */
+ WAYLAND_wl_display_roundtrip(c->display);
}
static void
@@ -1412,6 +1418,10 @@ void Wayland_HideWindow(_THIS, SDL_Window *window)
wind->server_decoration = NULL;
}
+ /* Be sure to detach after this is done, otherwise ShowWindow crashes! */
+ wl_surface_attach(wind->surface, NULL, 0, 0);
+ wl_surface_commit(wind->surface);
+
#ifdef HAVE_LIBDECOR_H
if (WINDOW_IS_LIBDECOR(data, window)) {
if (wind->shell_surface.libdecor.frame) {
@@ -1433,9 +1443,11 @@ void Wayland_HideWindow(_THIS, SDL_Window *window)
}
}
- /* Be sure to detach after this is done, otherwise ShowWindow crashes! */
- wl_surface_attach(wind->surface, NULL, 0, 0);
- wl_surface_commit(wind->surface);
+ /*
+ * Roundtrip required to avoid a possible protocol violation when
+ * ShowWindow is called immediately after HideWindow.
+ */
+ WAYLAND_wl_display_roundtrip(data->display);
}
static void