Browse Source

Merge pull request #65831 from bruvzg/vlk_edge_lag

[macOS] Fix redraw lag at the edge of the resizing window.
Rémi Verschelde 2 years ago
parent
commit
c2babb6558

+ 2 - 0
platform/macos/display_server_macos.h

@@ -85,6 +85,8 @@ public:
 		Size2i max_size;
 		Size2i size;
 
+		NSRect last_frame_rect;
+
 		bool im_active = false;
 		Size2i im_position;
 

+ 18 - 0
platform/macos/godot_content_view.mm

@@ -61,6 +61,24 @@
 @implementation GodotContentView
 
 - (void)setFrameSize:(NSSize)newSize {
+	DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
+	if (ds && ds->has_window(window_id)) {
+		DisplayServerMacOS::WindowData &wd = ds->get_window(window_id);
+		NSRect frameRect = [wd.window_object frame];
+		bool left = (wd.last_frame_rect.origin.x != frameRect.origin.x);
+		bool top = (wd.last_frame_rect.origin.y == frameRect.origin.y);
+		if (left && top) {
+			self.layerContentsPlacement = NSViewLayerContentsPlacementBottomRight;
+		} else if (left && !top) {
+			self.layerContentsPlacement = NSViewLayerContentsPlacementTopRight;
+		} else if (!left && top) {
+			self.layerContentsPlacement = NSViewLayerContentsPlacementBottomLeft;
+		} else {
+			self.layerContentsPlacement = NSViewLayerContentsPlacementTopLeft;
+		}
+		wd.last_frame_rect = frameRect;
+	}
+
 	[super setFrameSize:newSize];
 	[self.layer setNeedsDisplay]; // Force "drawRect" call.
 }

+ 3 - 1
platform/macos/godot_window_delegate.mm

@@ -151,7 +151,9 @@
 
 - (void)windowWillStartLiveResize:(NSNotification *)notification {
 	DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
-	if (ds) {
+	if (ds && ds->has_window(window_id)) {
+		DisplayServerMacOS::WindowData &wd = ds->get_window(window_id);
+		wd.last_frame_rect = [wd.window_object frame];
 		ds->set_is_resizing(true);
 	}
 }