[PATCH 3/3] winemac.drv: Don't activate the app if its first window is WS_EX_NOACTIVATE.

Tim Clem tclem at codeweavers.com
Wed Jan 19 13:13:45 CST 2022


This matches the behavior on Windows.

Signed-off-by: Tim Clem <tclem at codeweavers.com>
---
 dlls/winemac.drv/cocoa_app.h    | 2 +-
 dlls/winemac.drv/cocoa_app.m    | 9 ++++++---
 dlls/winemac.drv/cocoa_window.h | 2 ++
 dlls/winemac.drv/cocoa_window.m | 9 ++++++---
 4 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/dlls/winemac.drv/cocoa_app.h b/dlls/winemac.drv/cocoa_app.h
index 0b70a2fd55b5..0689c22ec32a 100644
--- a/dlls/winemac.drv/cocoa_app.h
+++ b/dlls/winemac.drv/cocoa_app.h
@@ -142,7 +142,7 @@ @interface WineApplicationController : NSObject <NSApplicationDelegate>
 
     + (WineApplicationController*) sharedController;
 
-    - (void) transformProcessToForeground;
+    - (void) transformProcessToForeground:(BOOL)activateIfTransformed;
 
     - (BOOL) registerEventQueue:(WineEventQueue*)queue;
     - (void) unregisterEventQueue:(WineEventQueue*)queue;
diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m
index 16a773e14703..8b6a1779b840 100644
--- a/dlls/winemac.drv/cocoa_app.m
+++ b/dlls/winemac.drv/cocoa_app.m
@@ -237,7 +237,7 @@ - (void) dealloc
         [super dealloc];
     }
 
-    - (void) transformProcessToForeground
+    - (void) transformProcessToForeground:(BOOL)activateIfTransformed
     {
         if ([NSApp activationPolicy] != NSApplicationActivationPolicyRegular)
         {
@@ -248,7 +248,10 @@ - (void) transformProcessToForeground
             NSMenuItem* item;
 
             [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
-            [NSApp activateIgnoringOtherApps:YES];
+
+            if (activateIfTransformed)
+                [NSApp activateIgnoringOtherApps:YES];
+
 #if defined(MAC_OS_X_VERSION_10_9) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9
             if (!enable_app_nap && [NSProcessInfo instancesRespondToSelector:@selector(beginActivityWithOptions:reason:)])
             {
@@ -884,7 +887,7 @@ - (BOOL) setMode:(CGDisplayModeRef)mode forDisplay:(CGDirectDisplayID)displayID
             if (!modes.count)
                 return FALSE;
 
-            [self transformProcessToForeground];
+            [self transformProcessToForeground:YES];
 
             BOOL active = [NSApp isActive];
 
diff --git a/dlls/winemac.drv/cocoa_window.h b/dlls/winemac.drv/cocoa_window.h
index c7bcaedfd970..a83f2aa803b6 100644
--- a/dlls/winemac.drv/cocoa_window.h
+++ b/dlls/winemac.drv/cocoa_window.h
@@ -28,6 +28,7 @@ @interface WineWindow : NSPanel <NSWindowDelegate>
 {
     BOOL disabled;
     BOOL noForeground;
+    BOOL preventsAppActivation;
     BOOL floating;
     BOOL resizable;
     BOOL maximized;
@@ -91,6 +92,7 @@ @interface WineWindow : NSPanel <NSWindowDelegate>
 @property (retain, readonly, nonatomic) WineEventQueue* queue;
 @property (readonly, nonatomic) BOOL disabled;
 @property (readonly, nonatomic) BOOL noForeground;
+ at property (readonly, nonatomic) BOOL preventsAppActivation;
 @property (readonly, nonatomic) BOOL floating;
 @property (readonly, getter=isFullscreen, nonatomic) BOOL fullscreen;
 @property (readonly, getter=isFakingClose, nonatomic) BOOL fakingClose;
diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m
index 6301b47143ea..bfa7e2fe8cc2 100644
--- a/dlls/winemac.drv/cocoa_window.m
+++ b/dlls/winemac.drv/cocoa_window.m
@@ -391,6 +391,7 @@ @interface WineWindow ()
 
 @property (readwrite, nonatomic) BOOL disabled;
 @property (readwrite, nonatomic) BOOL noForeground;
+ at property (readwrite, nonatomic) BOOL preventsAppActivation;
 @property (readwrite, nonatomic) BOOL floating;
 @property (readwrite, nonatomic) BOOL drawnSinceShown;
 @property (readwrite, nonatomic) BOOL closing;
@@ -954,7 +955,7 @@ @implementation WineWindow
 
     static WineWindow* causing_becomeKeyWindow;
 
-    @synthesize disabled, noForeground, floating, fullscreen, fakingClose, closing, latentParentWindow, hwnd, queue;
+    @synthesize disabled, noForeground, preventsAppActivation, floating, fullscreen, fakingClose, closing, latentParentWindow, hwnd, queue;
     @synthesize drawnSinceShown;
     @synthesize surface, surface_mutex;
     @synthesize shapeChangedSinceLastDraw;
@@ -1143,6 +1144,8 @@ - (void) setWindowFeatures:(const struct macdrv_window_features*)wf
         NSUInteger currentStyle = [self styleMask];
         NSUInteger newStyle = style_mask_for_features(wf) | (currentStyle & ~usedStyles);
 
+        self.preventsAppActivation = wf->prevents_app_activation;
+
         if (newStyle != currentStyle)
         {
             NSString* title = [[[self title] copy] autorelease];
@@ -1686,7 +1689,7 @@ - (void) orderBelow:(WineWindow*)prev orAbove:(WineWindow*)next activate:(BOOL)a
             WineWindow* parent;
             WineWindow* child;
 
-            [controller transformProcessToForeground];
+            [controller transformProcessToForeground:!self.preventsAppActivation];
             if ([NSApp isHidden])
                 [NSApp unhide:nil];
             wasVisible = [self isVisible];
@@ -2056,7 +2059,7 @@ - (void) makeFocused:(BOOL)activate
     {
         if (activate)
         {
-            [[WineApplicationController sharedController] transformProcessToForeground];
+            [[WineApplicationController sharedController] transformProcessToForeground:YES];
             [NSApp activateIgnoringOtherApps:YES];
         }
 
-- 
2.34.1




More information about the wine-devel mailing list