wayland: For libdecor, dispatch immediately after setting fullscreen Reference: #4578
diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c
index dff4a06..49db037 100644
--- a/src/video/wayland/SDL_waylandwindow.c
+++ b/src/video/wayland/SDL_waylandwindow.c
@@ -948,7 +948,24 @@ Wayland_SetWindowFullscreen(_THIS, SDL_Window * window,
SDL_VideoData *viddata = (SDL_VideoData *) _this->driverdata;
SetFullscreen(window, fullscreen ? output : NULL);
- WAYLAND_wl_display_flush( viddata->display );
+ WAYLAND_wl_display_flush(viddata->display);
+#ifdef HAVE_LIBDECOR_H
+ /* For libdecor we _have_ to dispatch immediately, because libdecor state
+ * strongly depends on the "current" state of the window. For example, if an
+ * application calls SetWindowSize right after this, libdecor will still
+ * think the window is fullscreen and not floating because configuration has
+ * not yet occurred, so the call will get completely ignored! So, take the
+ * time penalty and ensure that libdecor state matches SDL state.
+ *
+ * TODO: If Wayland_SetWindowSize ever stops checking for floating state,
+ * this can be removed.
+ *
+ * -flibit
+ */
+ if (viddata->shell.libdecor) {
+ WAYLAND_wl_display_dispatch(viddata->display);
+ }
+#endif
}
void