diff --git a/dlls/winemac.drv/cocoa_window.h b/dlls/winemac.drv/cocoa_window.h
index e1af247bcde45103a4e3ecdb7ae58fff21a24127..0f7e084fc3ee14a91beb2b7406d36ef795527152 100644
--- a/dlls/winemac.drv/cocoa_window.h
+++ b/dlls/winemac.drv/cocoa_window.h
@@ -29,6 +29,7 @@ @interface WineWindow : NSPanel <NSWindowDelegate>
     BOOL disabled;
     BOOL noActivate;
     BOOL floating;
+    BOOL pendingMinimize;
     WineWindow* latentParentWindow;
 
     void* hwnd;
diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m
index 2da8a088740671187cbefabc7c3f0b49cc53b935..035576e5567b966de3054646b92fc96dac654ad8 100644
--- a/dlls/winemac.drv/cocoa_window.m
+++ b/dlls/winemac.drv/cocoa_window.m
@@ -636,10 +636,16 @@ - (void) setMacDrvState:(const struct macdrv_window_state*)state
         }
         [self setCollectionBehavior:behavior];
 
+        pendingMinimize = FALSE;
         if (state->minimized && ![self isMiniaturized])
         {
-            ignore_windowMiniaturize = TRUE;
-            [self miniaturize:nil];
+            if ([self isVisible])
+            {
+                ignore_windowMiniaturize = TRUE;
+                [self miniaturize:nil];
+            }
+            else
+                pendingMinimize = TRUE;
         }
         else if (!state->minimized && [self isMiniaturized])
         {
@@ -754,6 +760,13 @@ - (BOOL) orderBelow:(WineWindow*)prev orAbove:(WineWindow*)next
             if (needAdjustWindowLevels)
                 [controller adjustWindowLevels];
 
+            if (pendingMinimize)
+            {
+                ignore_windowMiniaturize = TRUE;
+                [self miniaturize:nil];
+                pendingMinimize = FALSE;
+            }
+
             NSEnableScreenUpdates();
 
             /* Cocoa may adjust the frame when the window is ordered onto the screen.
@@ -770,6 +783,8 @@ - (BOOL) orderBelow:(WineWindow*)prev orAbove:(WineWindow*)next
 
     - (void) doOrderOut
     {
+        if ([self isMiniaturized])
+            pendingMinimize = TRUE;
         self.latentParentWindow = [self parentWindow];
         [latentParentWindow removeChildWindow:self];
         [self orderOut:nil];
@@ -948,6 +963,13 @@ - (void) makeFocused:(BOOL)activate
         [self orderFront:nil];
         [controller adjustWindowLevels];
 
+        if (pendingMinimize)
+        {
+            ignore_windowMiniaturize = TRUE;
+            [self miniaturize:nil];
+            pendingMinimize = FALSE;
+        }
+
         NSEnableScreenUpdates();
 
         causing_becomeKeyWindow = TRUE;
@@ -1057,6 +1079,13 @@ - (void) makeKeyAndOrderFront:(id)sender
             [self setLevel:[front level]];
         [self orderFront:nil];
         [controller adjustWindowLevels];
+
+        if (pendingMinimize)
+        {
+            ignore_windowMiniaturize = TRUE;
+            [self miniaturize:nil];
+            pendingMinimize = FALSE;
+        }
     }
 
     - (void) sendEvent:(NSEvent*)event