From 630c23ce17dd127e995b58388a2f9bd7534a1119 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 16 Feb 2023 17:28:56 -0800 Subject: [PATCH] You can move fullscreen desktop windows between displays using SDL_SetWindowPosition() --- src/video/SDL_video.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 9a38f70e02..4998a397fd 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -2145,8 +2145,12 @@ void *SDL_GetWindowData(SDL_Window *window, const char *name) int SDL_SetWindowPosition(SDL_Window *window, int x, int y) { + SDL_DisplayID original_displayID; + CHECK_WINDOW_MAGIC(window, -1); + original_displayID = SDL_GetDisplayForWindow(window); + if (SDL_WINDOWPOS_ISUNDEFINED(x)) { x = window->windowed.x; } @@ -2154,7 +2158,7 @@ int SDL_SetWindowPosition(SDL_Window *window, int x, int y) y = window->windowed.y; } if (SDL_WINDOWPOS_ISCENTERED(x) || SDL_WINDOWPOS_ISCENTERED(y)) { - SDL_DisplayID displayID = SDL_GetDisplayForWindow(window); + SDL_DisplayID displayID = original_displayID; SDL_Rect bounds; if (SDL_WINDOWPOS_ISCENTERED(x) && (x & 0xFFFF)) { @@ -2179,7 +2183,30 @@ int SDL_SetWindowPosition(SDL_Window *window, int x, int y) window->windowed.x = x; window->windowed.y = y; - if (!SDL_WINDOW_FULLSCREEN_VISIBLE(window)) { + if (SDL_WINDOW_FULLSCREEN_VISIBLE(window)) { + if (!window->fullscreen_exclusive) { + /* See if we should move to another display */ + SDL_DisplayID displayID = GetDisplayForRect(x, y, 1, 1); + + if (displayID != original_displayID) { + SDL_Rect bounds; + SDL_zero(bounds); + SDL_GetDisplayBounds(displayID, &bounds); + + window->x = bounds.x; + window->y = bounds.y; + window->w = bounds.w; + window->w = bounds.w; + + if (_this->SetWindowPosition) { + _this->SetWindowPosition(_this, window); + } + if (_this->SetWindowSize) { + _this->SetWindowSize(_this, window); + } + } + } + } else { window->x = x; window->y = y;