diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m index afe06089239..e6e5c2e6b34 100644 --- a/dlls/winemac.drv/cocoa_app.m +++ b/dlls/winemac.drv/cocoa_app.m @@ -1809,6 +1809,8 @@ - (void) setupObservations queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note){ NSWindow* window = [note object]; + if ([window isKindOfClass:[WineWindow class]] && [(WineWindow*)window isFakingClose]) + return; [keyWindows removeObjectIdenticalTo:window]; if (window == lastTargetWindow) lastTargetWindow = nil; diff --git a/dlls/winemac.drv/cocoa_window.h b/dlls/winemac.drv/cocoa_window.h index 8893f85b094..8f6027541c2 100644 --- a/dlls/winemac.drv/cocoa_window.h +++ b/dlls/winemac.drv/cocoa_window.h @@ -60,6 +60,7 @@ @interface WineWindow : NSPanel BOOL ignore_windowMiniaturize; BOOL ignore_windowDeminiaturize; + BOOL fakingClose; } @property (retain, readonly, nonatomic) WineEventQueue* queue; @@ -67,6 +68,7 @@ @interface WineWindow : NSPanel @property (readonly, nonatomic) BOOL noActivate; @property (readonly, nonatomic) BOOL floating; @property (readonly, getter=isFullscreen, nonatomic) BOOL fullscreen; +@property (readonly, getter=isFakingClose, nonatomic) BOOL fakingClose; - (NSInteger) minimumLevelForActive:(BOOL)active; - (void) updateFullscreen; diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index 43be5d5c315..74bbdc754b7 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -139,6 +139,7 @@ @interface WineWindow () @property (readwrite, nonatomic) BOOL disabled; @property (readwrite, nonatomic) BOOL noActivate; @property (readwrite, nonatomic) BOOL floating; +@property (readwrite, getter=isFakingClose, nonatomic) BOOL fakingClose; @property (retain, nonatomic) NSWindow* latentParentWindow; @property (nonatomic) void* hwnd; @@ -466,7 +467,7 @@ @implementation WineWindow static WineWindow* causing_becomeKeyWindow; - @synthesize disabled, noActivate, floating, fullscreen, latentParentWindow, hwnd, queue; + @synthesize disabled, noActivate, floating, fullscreen, fakingClose, latentParentWindow, hwnd, queue; @synthesize surface, surface_mutex; @synthesize shape, shapeChangedSinceLastDraw; @synthesize colorKeyed, colorKeyRed, colorKeyGreen, colorKeyBlue; @@ -497,6 +498,7 @@ + (WineWindow*) createWindowWithFeatures:(const struct macdrv_window_features*)w [window setHidesOnDeactivate:NO]; [window setReleasedWhenClosed:NO]; + [window setOneShot:YES]; [window disableCursorRects]; [window setShowsResizeIndicator:NO]; [window setHasShadow:wf->shadow]; @@ -1039,7 +1041,14 @@ - (void) doOrderOut pendingMinimize = TRUE; [self becameIneligibleParentOrChild]; - [self orderOut:nil]; + if ([self isMiniaturized]) + { + fakingClose = TRUE; + [self close]; + fakingClose = FALSE; + } + else + [self orderOut:nil]; if (wasVisible && wasOnActiveSpace && fullscreen) [controller updateFullscreenWindows]; [controller adjustWindowLevels]; @@ -1548,6 +1557,7 @@ - (void) windowWillClose:(NSNotification*)notification { WineWindow* child; + if (fakingClose) return; if (latentParentWindow) { [latentParentWindow->latentChildWindows removeObjectIdenticalTo:self];