From: Tim Clem tclem@codeweavers.com
The existing check would not unminimize a window if the only on-screen windows had a zero dimension or were otherwise invisible. --- dlls/winemac.drv/cocoa_app.m | 27 +++++++++++++++++---------- dlls/winemac.drv/cocoa_window.h | 5 +++++ dlls/winemac.drv/cocoa_window.m | 14 ++++++++++++++ 3 files changed, 36 insertions(+), 10 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m index 61ab38cdc82..82334d477cd 100644 --- a/dlls/winemac.drv/cocoa_app.m +++ b/dlls/winemac.drv/cocoa_app.m @@ -1316,7 +1316,7 @@ - (BOOL) isAnyWineWindowVisible { for (WineWindow* w in [NSApp windows]) { - if ([w isKindOfClass:[WineWindow class]] && ![w isMiniaturized] && [w isVisible]) + if ([w isKindOfClass:[WineWindow class]] && ![w isMiniaturized] && [w isVisible] && [w presentsVisibleContent]) return YES; }
@@ -2152,17 +2152,24 @@ - (void) releaseMouseCapture
- (void) unminimizeWindowIfNoneVisible { - if (![self frontWineWindow]) + WineWindow *bestOption = nil; + + if ([self isAnyWineWindowVisible]) + return; + + for (WineWindow *window in [NSApp windows]) { - for (WineWindow* window in [NSApp windows]) - { - if ([window isKindOfClass:[WineWindow class]] && [window isMiniaturized]) - { - [window deminiaturize:self]; - break; - } - } + if (![window isKindOfClass:[WineWindow class]] || ![window isMiniaturized]) + continue; + + bestOption = window; + + /* Prefer any window that would actually show something. */ + if ([window presentsVisibleContent]) + break; } + + [bestOption deminiaturize:self]; }
- (void) setRetinaMode:(int)mode diff --git a/dlls/winemac.drv/cocoa_window.h b/dlls/winemac.drv/cocoa_window.h index 804297f55a0..1d7b31007f5 100644 --- a/dlls/winemac.drv/cocoa_window.h +++ b/dlls/winemac.drv/cocoa_window.h @@ -92,6 +92,11 @@ @interface WineWindow : NSPanel <NSWindowDelegate> @property (readonly, getter=isFakingClose, nonatomic) BOOL fakingClose; @property (readonly, nonatomic) NSRect wine_fractionalFrame;
+/* Whether this window, when ordered in and not miniaturized, would appear to + the user on-screen. That means it has a non-zero size and is not empty- + shaped, or has a child window that meets those criteria. */ +@property (readonly, nonatomic) BOOL presentsVisibleContent; + - (NSInteger) minimumLevelForActive:(BOOL)active; - (void) updateFullscreen;
diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index 866306d3511..76b05857b77 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -2315,6 +2315,20 @@ - (BOOL) isEmptyShaped return ([mask isEmptyShaped]); }
+ - (BOOL) presentsVisibleContent + { + if (NSWidth(self.frame) > 0 && NSHeight(self.frame) > 0 && ![self isEmptyShaped]) + return YES; + + for (WineWindow *child in self.childWindows) + { + if ([child isKindOfClass:[WineWindow class]] && [child presentsVisibleContent]) + return YES; + } + + return NO; + } + - (BOOL) canProvideSnapshot { return (self.windowNumber > 0 && ![self isEmptyShaped]);