소스 검색

x11: Ensure that a configure event was received before sending the final window size and coordinates

Headless display servers might not send an initial configure event, so don't assume that one has arrived and send garbage size/position values when showing a window.
Frank Praznik 1 년 전
부모
커밋
09e32faa68
1개의 변경된 파일14개의 추가작업 그리고 9개의 파일을 삭제
  1. 14 9
      src/video/x11/SDL_x11window.c

+ 14 - 9
src/video/x11/SDL_x11window.c

@@ -1369,18 +1369,23 @@ void X11_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window)
     X11_XSync(display, False);
     X11_PumpEvents(_this);
 
-    int x = data->last_xconfigure.x;
-    int y = data->last_xconfigure.y;
-    SDL_GlobalToRelativeForWindow(data->window, x, y, &x, &y);
+    /* If a configure event was received (type is non-zero), send the final window size and coordinates. */
+    if (data->last_xconfigure.type) {
+        int x = data->last_xconfigure.x;
+        int y = data->last_xconfigure.y;
+        SDL_GlobalToRelativeForWindow(data->window, x, y, &x, &y);
 
-    /* If the borders appeared, this happened automatically in the event system, otherwise, set the position now. */
-    if (data->disable_size_position_events && (window->x != x || window->y != y)) {
-        data->pending_operation = X11_PENDING_OP_MOVE;
-        X11_XMoveWindow(display, data->xwindow, window->x, window->y);
+        /* If the borders appeared, this happened automatically in the event system, otherwise, set the position now. */
+        if (data->disable_size_position_events && (window->x != x || window->y != y)) {
+            data->pending_operation = X11_PENDING_OP_MOVE;
+            X11_XMoveWindow(display, data->xwindow, window->x, window->y);
+        }
+
+        SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_RESIZED, data->last_xconfigure.width, data->last_xconfigure.height);
+        SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_MOVED, x, y);
     }
+
     data->disable_size_position_events = SDL_FALSE;
-    SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_RESIZED, data->last_xconfigure.width, data->last_xconfigure.height);
-    SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_MOVED, x, y);
 }
 
 void X11_HideWindow(SDL_VideoDevice *_this, SDL_Window *window)