Ken Thomases : winemac: Implement support for no-activate windows.

Alexandre Julliard julliard at winehq.org
Fri Jan 11 13:46:58 CST 2013


Module: wine
Branch: master
Commit: 9d29ea42e135001a92179cd5cda2fcff3a306304
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9d29ea42e135001a92179cd5cda2fcff3a306304

Author: Ken Thomases <ken at codeweavers.com>
Date:   Fri Jan 11 06:18:36 2013 -0600

winemac: Implement support for no-activate windows.

---

 dlls/winemac.drv/cocoa_window.h |    1 +
 dlls/winemac.drv/cocoa_window.m |    7 +++++--
 dlls/winemac.drv/macdrv_cocoa.h |    1 +
 dlls/winemac.drv/window.c       |   21 +++++++++++++++++++++
 4 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/dlls/winemac.drv/cocoa_window.h b/dlls/winemac.drv/cocoa_window.h
index 1edcd9c..86211dd 100644
--- a/dlls/winemac.drv/cocoa_window.h
+++ b/dlls/winemac.drv/cocoa_window.h
@@ -25,6 +25,7 @@
 {
     NSUInteger normalStyleMask;
     BOOL disabled;
+    BOOL noActivate;
 }
 
 @end
diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m
index 848e49e..dde77b3 100644
--- a/dlls/winemac.drv/cocoa_window.m
+++ b/dlls/winemac.drv/cocoa_window.m
@@ -61,6 +61,7 @@ static BOOL frame_intersects_screens(NSRect frame, NSArray* screens)
 @interface WineWindow ()
 
 @property (nonatomic) BOOL disabled;
+ at property (nonatomic) BOOL noActivate;
 
     + (void) flipRect:(NSRect*)rect;
 
@@ -79,7 +80,7 @@ static BOOL frame_intersects_screens(NSRect frame, NSArray* screens)
 
 @implementation WineWindow
 
-    @synthesize disabled;
+    @synthesize disabled, noActivate;
 
     + (WineWindow*) createWindowWithFeatures:(const struct macdrv_window_features*)wf
                                  windowFrame:(NSRect)window_frame
@@ -147,6 +148,7 @@ static BOOL frame_intersects_screens(NSRect frame, NSArray* screens)
     - (void) setMacDrvState:(const struct macdrv_window_state*)state
     {
         self.disabled = state->disabled;
+        self.noActivate = state->no_activate;
     }
 
     /* Returns whether or not the window was ordered in, which depends on if
@@ -214,7 +216,8 @@ static BOOL frame_intersects_screens(NSRect frame, NSArray* screens)
      */
     - (BOOL) canBecomeKeyWindow
     {
-        return !self.disabled;
+        if (self.disabled || self.noActivate) return NO;
+        return YES;
     }
 
     - (BOOL) canBecomeMainWindow
diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h
index e2a735b..d91cd1a 100644
--- a/dlls/winemac.drv/macdrv_cocoa.h
+++ b/dlls/winemac.drv/macdrv_cocoa.h
@@ -127,6 +127,7 @@ struct macdrv_window_features {
 
 struct macdrv_window_state {
     unsigned int    disabled:1;
+    unsigned int    no_activate:1;
 };
 
 extern macdrv_window macdrv_create_cocoa_window(const struct macdrv_window_features* wf,
diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c
index 8520afa..b813cdc 100644
--- a/dlls/winemac.drv/window.c
+++ b/dlls/winemac.drv/window.c
@@ -73,6 +73,26 @@ static void get_cocoa_window_features(struct macdrv_win_data *data,
 }
 
 
+/*******************************************************************
+ *              can_activate_window
+ *
+ * Check if we can activate the specified window.
+ */
+static inline BOOL can_activate_window(HWND hwnd)
+{
+    LONG style = GetWindowLongW(hwnd, GWL_STYLE);
+    RECT rect;
+
+    if (!(style & WS_VISIBLE)) return FALSE;
+    if ((style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return FALSE;
+    if (style & WS_MINIMIZE) return FALSE;
+    if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_NOACTIVATE) return FALSE;
+    if (hwnd == GetDesktopWindow()) return FALSE;
+    if (GetWindowRect(hwnd, &rect) && IsRectEmpty(&rect)) return FALSE;
+    return !(style & WS_DISABLED);
+}
+
+
 /***********************************************************************
  *              get_cocoa_window_state
  */
@@ -82,6 +102,7 @@ static void get_cocoa_window_state(struct macdrv_win_data *data,
 {
     memset(state, 0, sizeof(*state));
     state->disabled = (style & WS_DISABLED) != 0;
+    state->no_activate = !can_activate_window(data->hwnd);
 }
 
 




More information about the wine-cvs mailing list