浏览代码

Merge pull request #37430 from bruvzg/fix_non_hidpi_popup_pos

[macOS] Fix popup positions on multiple screens.
Rémi Verschelde 5 年之前
父节点
当前提交
cd16836392
共有 2 个文件被更改,包括 48 次插入10 次删除
  1. 39 10
      platform/osx/display_server_osx.mm
  2. 9 0
      scene/main/window.cpp

+ 39 - 10
platform/osx/display_server_osx.mm

@@ -278,13 +278,17 @@ static NSCursor *_cursorFromSelector(SEL selector, SEL fallback = nil) {
 }
 }
 
 
 - (BOOL)windowShouldClose:(id)sender {
 - (BOOL)windowShouldClose:(id)sender {
-	ERR_FAIL_COND_V(!DS_OSX->windows.has(window_id), YES);
+	if (!DS_OSX || !DS_OSX->windows.has(window_id)) {
+		return YES;
+	}
 	DS_OSX->_send_window_event(DS_OSX->windows[window_id], DisplayServerOSX::WINDOW_EVENT_CLOSE_REQUEST);
 	DS_OSX->_send_window_event(DS_OSX->windows[window_id], DisplayServerOSX::WINDOW_EVENT_CLOSE_REQUEST);
 	return NO;
 	return NO;
 }
 }
 
 
 - (void)windowWillClose:(NSNotification *)notification {
 - (void)windowWillClose:(NSNotification *)notification {
-	ERR_FAIL_COND(!DS_OSX->windows.has(window_id));
+	if (!DS_OSX || !DS_OSX->windows.has(window_id)) {
+		return;
+	}
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 
 
 	while (wd.transient_children.size()) {
 	while (wd.transient_children.size()) {
@@ -310,7 +314,9 @@ static NSCursor *_cursorFromSelector(SEL selector, SEL fallback = nil) {
 }
 }
 
 
 - (void)windowDidEnterFullScreen:(NSNotification *)notification {
 - (void)windowDidEnterFullScreen:(NSNotification *)notification {
-	ERR_FAIL_COND(!DS_OSX->windows.has(window_id));
+	if (!DS_OSX || !DS_OSX->windows.has(window_id)) {
+		return;
+	}
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 
 
 	wd.fullscreen = true;
 	wd.fullscreen = true;
@@ -320,8 +326,9 @@ static NSCursor *_cursorFromSelector(SEL selector, SEL fallback = nil) {
 }
 }
 
 
 - (void)windowDidExitFullScreen:(NSNotification *)notification {
 - (void)windowDidExitFullScreen:(NSNotification *)notification {
-	if (!DS_OSX || !DS_OSX->windows.has(window_id))
+	if (!DS_OSX || !DS_OSX->windows.has(window_id)) {
 		return;
 		return;
+	}
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 
 
 	wd.fullscreen = false;
 	wd.fullscreen = false;
@@ -383,8 +390,9 @@ static NSCursor *_cursorFromSelector(SEL selector, SEL fallback = nil) {
 }
 }
 
 
 - (void)windowDidResize:(NSNotification *)notification {
 - (void)windowDidResize:(NSNotification *)notification {
-	if (!DS_OSX || !DS_OSX->windows.has(window_id))
+	if (!DS_OSX || !DS_OSX->windows.has(window_id)) {
 		return;
 		return;
+	}
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 
 
 #if defined(OPENGL_ENABLED)
 #if defined(OPENGL_ENABLED)
@@ -425,11 +433,26 @@ static NSCursor *_cursorFromSelector(SEL selector, SEL fallback = nil) {
 }
 }
 
 
 - (void)windowDidMove:(NSNotification *)notification {
 - (void)windowDidMove:(NSNotification *)notification {
+	if (!DS_OSX || !DS_OSX->windows.has(window_id)) {
+		return;
+	}
+	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
+
 	DS_OSX->_release_pressed_events();
 	DS_OSX->_release_pressed_events();
+
+	if (!wd.rect_changed_callback.is_null()) {
+		Variant size = Rect2i(DS_OSX->window_get_position(window_id), DS_OSX->window_get_size(window_id));
+		Variant *sizep = &size;
+		Variant ret;
+		Callable::CallError ce;
+		wd.rect_changed_callback.call((const Variant **)&sizep, 1, ret, ce);
+	}
 }
 }
 
 
 - (void)windowDidBecomeKey:(NSNotification *)notification {
 - (void)windowDidBecomeKey:(NSNotification *)notification {
-	ERR_FAIL_COND(!DS_OSX->windows.has(window_id));
+	if (!DS_OSX || !DS_OSX->windows.has(window_id)) {
+		return;
+	}
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 
 
 	const CGFloat backingScaleFactor = (OS::get_singleton()->is_hidpi_allowed()) ? [wd.window_view backingScaleFactor] : 1.0;
 	const CGFloat backingScaleFactor = (OS::get_singleton()->is_hidpi_allowed()) ? [wd.window_view backingScaleFactor] : 1.0;
@@ -441,7 +464,9 @@ static NSCursor *_cursorFromSelector(SEL selector, SEL fallback = nil) {
 }
 }
 
 
 - (void)windowDidResignKey:(NSNotification *)notification {
 - (void)windowDidResignKey:(NSNotification *)notification {
-	ERR_FAIL_COND(!DS_OSX->windows.has(window_id));
+	if (!DS_OSX || !DS_OSX->windows.has(window_id)) {
+		return;
+	}
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 
 
 	DS_OSX->window_focused = false;
 	DS_OSX->window_focused = false;
@@ -451,7 +476,9 @@ static NSCursor *_cursorFromSelector(SEL selector, SEL fallback = nil) {
 }
 }
 
 
 - (void)windowDidMiniaturize:(NSNotification *)notification {
 - (void)windowDidMiniaturize:(NSNotification *)notification {
-	ERR_FAIL_COND(!DS_OSX->windows.has(window_id));
+	if (!DS_OSX || !DS_OSX->windows.has(window_id)) {
+		return;
+	}
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 
 
 	DS_OSX->window_focused = false;
 	DS_OSX->window_focused = false;
@@ -461,7 +488,9 @@ static NSCursor *_cursorFromSelector(SEL selector, SEL fallback = nil) {
 }
 }
 
 
 - (void)windowDidDeminiaturize:(NSNotification *)notification {
 - (void)windowDidDeminiaturize:(NSNotification *)notification {
-	ERR_FAIL_COND(!DS_OSX->windows.has(window_id));
+	if (!DS_OSX || !DS_OSX->windows.has(window_id)) {
+		return;
+	}
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 
 
 	DS_OSX->window_focused = true;
 	DS_OSX->window_focused = true;
@@ -2148,7 +2177,7 @@ Rect2i DisplayServerOSX::screen_get_usable_rect(int p_screen) const {
 
 
 		Point2i position = Point2i(nsrect.origin.x, nsrect.origin.y + nsrect.size.height) * displayScale - _get_screens_origin();
 		Point2i position = Point2i(nsrect.origin.x, nsrect.origin.y + nsrect.size.height) * displayScale - _get_screens_origin();
 		position.y *= -1;
 		position.y *= -1;
-		Size2i size = Size2i(nsrect.size.width, nsrect.size.height) / displayScale;
+		Size2i size = Size2i(nsrect.size.width, nsrect.size.height) * displayScale;
 
 
 		return Rect2i(position, size);
 		return Rect2i(position, size);
 	}
 	}

+ 9 - 0
scene/main/window.cpp

@@ -1024,6 +1024,15 @@ void Window::popup(const Rect2i &p_screen_rect) {
 		set_size(adjust.size);
 		set_size(adjust.size);
 	}
 	}
 
 
+	int scr = DisplayServer::get_singleton()->get_screen_count();
+	for (int i = 0; i < scr; i++) {
+		Rect2i r = DisplayServer::get_singleton()->screen_get_usable_rect(i);
+		if (r.has_point(position)) {
+			current_screen = i;
+			break;
+		}
+	}
+
 	set_transient(true);
 	set_transient(true);
 	set_visible(true);
 	set_visible(true);
 	_post_popup();
 	_post_popup();