Merge pull request #83096 from bruvzg/macos_leak

[macOS] Use occlusionState instead of isOnActiveSpace to determine when window is drawable.
This commit is contained in:
Rémi Verschelde 2023-10-10 22:50:29 +02:00
commit b6c351cc62
No known key found for this signature in database
GPG Key ID: C3336907360768E1
3 changed files with 12 additions and 2 deletions

View File

@ -119,6 +119,7 @@ public:
bool is_popup = false; bool is_popup = false;
bool mpass = false; bool mpass = false;
bool focused = false; bool focused = false;
bool is_visible = true;
Rect2i parent_safe_rect; Rect2i parent_safe_rect;
}; };

View File

@ -3562,14 +3562,14 @@ bool DisplayServerMacOS::window_is_focused(WindowID p_window) const {
} }
bool DisplayServerMacOS::window_can_draw(WindowID p_window) const { bool DisplayServerMacOS::window_can_draw(WindowID p_window) const {
return (window_get_mode(p_window) != WINDOW_MODE_MINIMIZED) && [windows[p_window].window_object isOnActiveSpace]; return windows[p_window].is_visible;
} }
bool DisplayServerMacOS::can_any_window_draw() const { bool DisplayServerMacOS::can_any_window_draw() const {
_THREAD_SAFE_METHOD_ _THREAD_SAFE_METHOD_
for (const KeyValue<WindowID, WindowData> &E : windows) { for (const KeyValue<WindowID, WindowData> &E : windows) {
if ((window_get_mode(E.key) != WINDOW_MODE_MINIMIZED) && [E.value.window_object isOnActiveSpace]) { if (E.value.is_visible) {
return true; return true;
} }
} }

View File

@ -356,4 +356,13 @@
} }
} }
- (void)windowDidChangeOcclusionState:(NSNotification *)notification {
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
if (!ds || !ds->has_window(window_id)) {
return;
}
DisplayServerMacOS::WindowData &wd = ds->get_window(window_id);
wd.is_visible = ([wd.window_object occlusionState] & NSWindowOcclusionStateVisible) && [wd.window_object isVisible];
}
@end @end