Selaa lähdekoodia

Fixing window being incorrect size when using win+shift+arrow to move new big picture mode between displays

*When changing the display of a window, if it's a fullscreen window, resize it to the size of the new display

CR: @saml
Sam Lantinga 2 vuotta sitten
vanhempi
commit
c8dfc6b475

+ 4 - 0
src/events/SDL_windowevents.c

@@ -175,6 +175,10 @@ int SDL_SendWindowEvent(SDL_Window *window, SDL_EventType windowevent,
         window->flags &= ~SDL_WINDOW_INPUT_FOCUS;
         SDL_OnWindowFocusLost(window);
         break;
+    case SDL_WINDOWEVENT_DISPLAY_CHANGED:
+        SDL_assert(data1 == window->display_index);
+        SDL_OnWindowDisplayChanged(window);
+        break;
     default:
         break;
     }

+ 1 - 0
src/video/SDL_sysvideo.h

@@ -504,6 +504,7 @@ extern void SDL_OnWindowEnter(SDL_Window *window);
 extern void SDL_OnWindowLeave(SDL_Window *window);
 extern void SDL_OnWindowFocusGained(SDL_Window *window);
 extern void SDL_OnWindowFocusLost(SDL_Window *window);
+extern void SDL_OnWindowDisplayChanged(SDL_Window *window);
 extern void SDL_UpdateWindowGrab(SDL_Window *window);
 extern SDL_Window *SDL_GetFocusWindow(void);
 

+ 30 - 0
src/video/SDL_video.c

@@ -2919,6 +2919,36 @@ void SDL_OnWindowHidden(SDL_Window *window)
     SDL_UpdateFullscreenMode(window, SDL_FALSE);
 }
 
+void SDL_OnWindowDisplayChanged(SDL_Window *window)
+{
+    if (window->flags & SDL_WINDOW_FULLSCREEN) {
+        SDL_Rect rect;
+
+        if (FULLSCREEN_VISIBLE(window) && (window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != SDL_WINDOW_FULLSCREEN_DESKTOP) {
+            window->last_fullscreen_flags = 0;
+            SDL_UpdateFullscreenMode(window, SDL_TRUE);
+        }
+
+        if (SDL_GetDisplayBounds(window->display_index, &rect) == 0) {
+            int old_w = window->w;
+            int old_h = window->h;
+            window->x = rect.x;
+            window->y = rect.y;
+            window->w = rect.w;
+            window->h = rect.h;
+            window->fullscreen_mode.w = rect.w;
+            window->fullscreen_mode.h = rect.h;
+            if (_this->SetWindowSize) {
+                _this->SetWindowSize(_this, window);
+            }
+
+            if (window->w != old_w || window->h != old_h) {
+                SDL_OnWindowResized(window);
+            }
+        }
+    }
+}
+
 void SDL_OnWindowResized(SDL_Window *window)
 {
     int display_index = SDL_GetWindowDisplayIndex(window);

+ 12 - 0
src/video/windows/SDL_windowsevents.c

@@ -1266,6 +1266,18 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
         SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_MOVED, x, y);
 
+        // Moving the window from one display to another can change the size of the window (in the handling of SDL_WINDOWEVENT_MOVED), so we need to re-query the bounds
+        if (GetClientRect(hwnd, &rect)) {
+            ClientToScreen(hwnd, (LPPOINT)&rect);
+            ClientToScreen(hwnd, (LPPOINT)&rect + 1);
+
+            WIN_UpdateClipCursor(data->window);
+
+            x = rect.left;
+            y = rect.top;
+            WIN_ScreenPointToSDL(&x, &y);
+        }
+
         /* Convert client area width/height from pixels to dpi-scaled points */
         w = rect.right - rect.left;
         h = rect.bottom - rect.top;