Ver Fonte

wayland: Ignore bogus libdecor content sizes if an unmapped window is suspended

If a client takes a long time to present the first frame after creating the window, a configure event to set the suspended state may arrive with libdecor increasing the content size by the decoration dimensions, which should be ignored.

(cherry picked from commit 9d5d7010debcb2a3c78e6f88365f453bdb923edf)
Frank Praznik há 5 meses atrás
pai
commit
6519158ae5
1 ficheiros alterados com 6 adições e 1 exclusões
  1. 6 1
      src/video/wayland/SDL_waylandwindow.c

+ 6 - 1
src/video/wayland/SDL_waylandwindow.c

@@ -1295,8 +1295,13 @@ static void decoration_frame_configure(struct libdecor_frame *frame,
             } else {
             } else {
                 /* Don't apply the supplied dimensions if they haven't changed from the last configuration
                 /* Don't apply the supplied dimensions if they haven't changed from the last configuration
                  * event, or a newer size set programmatically can be overwritten by old data.
                  * event, or a newer size set programmatically can be overwritten by old data.
+                 *
+                 * If a client takes a long time to present the first frame after creating the window, a
+                 * configure event to set the suspended state may arrive with the content size increased
+                 * by the decoration dimensions, which should also be ignored.
                  */
                  */
-                if (width != wind->last_configure.width || height != wind->last_configure.height) {
+                if ((width != wind->last_configure.width || height != wind->last_configure.height) &&
+                    !(wind->shell_surface_status == WAYLAND_SHELL_SURFACE_STATUS_WAITING_FOR_FRAME && wind->suspended != suspended)) {
                     wind->requested.logical_width = width;
                     wind->requested.logical_width = width;
                     wind->requested.logical_height = height;
                     wind->requested.logical_height = height;