Ver código fonte

Merge pull request #106355 from bruvzg/mac_emb_trans

[macOS] Fix transparent window state detection for embedded process.
Thaddeus Crews 4 meses atrás
pai
commit
aad8f57f95

+ 2 - 0
platform/macos/display_server_embedded.h

@@ -66,6 +66,8 @@ class DisplayServerEmbedded : public DisplayServer {
 
 	WindowID window_id_counter = MAIN_WINDOW_ID;
 
+	bool transparent = false;
+
 	CAContext *ca_context = nullptr;
 	// Either be a CAMetalLayer or a CALayer depending on the rendering driver.
 	CALayer *layer = nullptr;

+ 9 - 2
platform/macos/display_server_embedded.mm

@@ -192,7 +192,8 @@ DisplayServerEmbedded::DisplayServerEmbedded(const String &p_rendering_driver, W
 	layer.contentsScale = scale;
 	layer.magnificationFilter = kCAFilterNearest;
 	layer.minificationFilter = kCAFilterNearest;
-	layer.opaque = NO; // Never opaque when embedded, clear color is drawn by control under the view.
+	transparent = ((p_flags & WINDOW_FLAG_TRANSPARENT_BIT) == WINDOW_FLAG_TRANSPARENT_BIT);
+	layer.opaque = !(OS::get_singleton()->is_layered_allowed() && transparent);
 	layer.actions = @{ @"contents" : [NSNull null] }; // Disable implicit animations for contents.
 	// AppKit frames, bounds and positions are always in points.
 	CGRect bounds = CGRectMake(0, 0, p_resolution.width, p_resolution.height);
@@ -654,10 +655,16 @@ bool DisplayServerEmbedded::window_is_maximize_allowed(WindowID p_window) const
 }
 
 void DisplayServerEmbedded::window_set_flag(WindowFlags p_flag, bool p_enabled, WindowID p_window) {
-	// Not supported
+	if (p_flag == WINDOW_FLAG_TRANSPARENT && p_window == MAIN_WINDOW_ID) {
+		transparent = p_enabled;
+		layer.opaque = !(OS::get_singleton()->is_layered_allowed() && transparent);
+	}
 }
 
 bool DisplayServerEmbedded::window_get_flag(WindowFlags p_flag, WindowID p_window) const {
+	if (p_flag == WINDOW_FLAG_TRANSPARENT && p_window == MAIN_WINDOW_ID) {
+		return transparent;
+	}
 	return false;
 }