Module: wine Branch: master Commit: 9d29ea42e135001a92179cd5cda2fcff3a306304 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9d29ea42e135001a92179cd5cd...
Author: Ken Thomases ken@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; +@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); }