2
0
Эх сурвалжийг харах

Improve OS.set_current_screen

Fix moving fullscreen windows on macOS and Windows
Fix window position on Linux/X11
bruvzg 3 жил өмнө
parent
commit
108dcf3bf0

+ 16 - 0
platform/osx/os_osx.mm

@@ -2536,8 +2536,24 @@ void OS_OSX::set_current_screen(int p_screen) {
 		return;
 	}
 
+	if (get_current_screen() == p_screen) {
+		return;
+	}
+
+	bool was_fullscreen = false;
+	if (zoomed) {
+		// Temporary exit fullscreen mode to move window.
+		[window_object toggleFullScreen:nil];
+		was_fullscreen = true;
+	}
+
 	Vector2 wpos = get_window_position() - get_screen_position(get_current_screen());
 	set_window_position(wpos + get_screen_position(p_screen));
+
+	if (was_fullscreen) {
+		// Re-enter fullscreen mode.
+		[window_object toggleFullScreen:nil];
+	}
 };
 
 Point2 OS_OSX::get_native_screen_position(int p_screen) const {

+ 13 - 2
platform/windows/os_windows.cpp

@@ -1940,8 +1940,19 @@ int OS_Windows::get_current_screen() const {
 }
 
 void OS_Windows::set_current_screen(int p_screen) {
-	Vector2 ofs = get_window_position() - get_screen_position(get_current_screen());
-	set_window_position(ofs + get_screen_position(p_screen));
+	if (video_mode.fullscreen) {
+		int cs = get_current_screen();
+		if (cs == p_screen) {
+			return;
+		}
+		Point2 pos = get_screen_position(p_screen);
+		Size2 size = get_screen_size(p_screen);
+
+		MoveWindow(hWnd, pos.x, pos.y, size.width, size.height, TRUE);
+	} else {
+		Vector2 ofs = get_window_position() - get_screen_position(get_current_screen());
+		set_window_position(ofs + get_screen_position(p_screen));
+	}
 }
 
 static BOOL CALLBACK _MonitorEnumProcPos(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) {

+ 2 - 2
platform/x11/os_x11.cpp

@@ -1228,8 +1228,8 @@ void OS_X11::set_current_screen(int p_screen) {
 		XMoveResizeWindow(x11_display, x11_window, position.x, position.y, size.x, size.y);
 	} else {
 		if (p_screen != get_current_screen()) {
-			Point2i position = get_screen_position(p_screen);
-			XMoveWindow(x11_display, x11_window, position.x, position.y);
+			Vector2 ofs = get_window_position() - get_screen_position(get_current_screen());
+			set_window_position(ofs + get_screen_position(p_screen));
 		}
 	}
 }