Module: wine Branch: master Commit: 064186e7394ff3070ca13101b974847a67c9e4d1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=064186e7394ff3070ca13101b9...
Author: Ken Thomases ken@codeweavers.com Date: Fri Jan 11 06:18:05 2013 -0600
winemac: Implement support for WS_DISABLED windows.
---
dlls/winemac.drv/cocoa_window.h | 5 +++ dlls/winemac.drv/cocoa_window.m | 56 +++++++++++++++++++++++++++++++++++++- dlls/winemac.drv/macdrv_cocoa.h | 6 ++++ dlls/winemac.drv/window.c | 16 +++++++++++ 4 files changed, 81 insertions(+), 2 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_window.h b/dlls/winemac.drv/cocoa_window.h index 3b9dc90..1edcd9c 100644 --- a/dlls/winemac.drv/cocoa_window.h +++ b/dlls/winemac.drv/cocoa_window.h @@ -22,4 +22,9 @@
@interface WineWindow : NSPanel <NSWindowDelegate> +{ + NSUInteger normalStyleMask; + BOOL disabled; +} + @end diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index 608f750..848e49e 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -60,6 +60,8 @@ static BOOL frame_intersects_screens(NSRect frame, NSArray* screens)
@interface WineWindow ()
+@property (nonatomic) BOOL disabled; + + (void) flipRect:(NSRect*)rect;
@end @@ -77,6 +79,8 @@ static BOOL frame_intersects_screens(NSRect frame, NSArray* screens)
@implementation WineWindow
+ @synthesize disabled; + + (WineWindow*) createWindowWithFeatures:(const struct macdrv_window_features*)wf windowFrame:(NSRect)window_frame { @@ -90,6 +94,9 @@ static BOOL frame_intersects_screens(NSRect frame, NSArray* screens) backing:NSBackingStoreBuffered defer:YES] autorelease];
+ if (!window) return nil; + window->normalStyleMask = [window styleMask]; + /* Standardize windows to eliminate differences between titled and borderless windows and between NSWindow and NSPanel. */ [window setHidesOnDeactivate:NO]; @@ -115,12 +122,33 @@ static BOOL frame_intersects_screens(NSRect frame, NSArray* screens) rect->origin.y = NSMaxY([[[NSScreen screens] objectAtIndex:0] frame]) - NSMaxY(*rect); }
+ - (void) adjustFeaturesForState + { + NSUInteger style = normalStyleMask; + + if (self.disabled) + style &= ~NSResizableWindowMask; + if (style != [self styleMask]) + [self setStyleMask:style]; + + if (style & NSClosableWindowMask) + [[self standardWindowButton:NSWindowCloseButton] setEnabled:!self.disabled]; + if (style & NSMiniaturizableWindowMask) + [[self standardWindowButton:NSWindowMiniaturizeButton] setEnabled:!self.disabled]; + } + - (void) setWindowFeatures:(const struct macdrv_window_features*)wf { - [self setStyleMask:style_mask_for_features(wf)]; + normalStyleMask = style_mask_for_features(wf); + [self adjustFeaturesForState]; [self setHasShadow:wf->shadow]; }
+ - (void) setMacDrvState:(const struct macdrv_window_state*)state + { + self.disabled = state->disabled; + } + /* Returns whether or not the window was ordered in, which depends on if its frame intersects any screen. */ - (BOOL) orderBelow:(WineWindow*)prev orAbove:(WineWindow*)next @@ -171,13 +199,22 @@ static BOOL frame_intersects_screens(NSRect frame, NSArray* screens) return on_screen; }
+ - (void) setDisabled:(BOOL)newValue + { + if (disabled != newValue) + { + disabled = newValue; + [self adjustFeaturesForState]; + } + } +
/* * ---------- NSWindow method overrides ---------- */ - (BOOL) canBecomeKeyWindow { - return YES; + return !self.disabled; }
- (BOOL) canBecomeMainWindow @@ -248,6 +285,21 @@ void macdrv_set_cocoa_window_features(macdrv_window w, }
/*********************************************************************** + * macdrv_set_cocoa_window_state + * + * Update a Cocoa window's state. + */ +void macdrv_set_cocoa_window_state(macdrv_window w, + const struct macdrv_window_state* state) +{ + WineWindow* window = (WineWindow*)w; + + OnMainThread(^{ + [window setMacDrvState:state]; + }); +} + +/*********************************************************************** * macdrv_set_cocoa_window_title * * Set a Cocoa window's title. diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h index 4cebcef..e2a735b 100644 --- a/dlls/winemac.drv/macdrv_cocoa.h +++ b/dlls/winemac.drv/macdrv_cocoa.h @@ -125,11 +125,17 @@ struct macdrv_window_features { unsigned int shadow:1; };
+struct macdrv_window_state { + unsigned int disabled:1; +}; + extern macdrv_window macdrv_create_cocoa_window(const struct macdrv_window_features* wf, CGRect frame) DECLSPEC_HIDDEN; extern void macdrv_destroy_cocoa_window(macdrv_window w) DECLSPEC_HIDDEN; extern void macdrv_set_cocoa_window_features(macdrv_window w, const struct macdrv_window_features* wf) DECLSPEC_HIDDEN; +extern void macdrv_set_cocoa_window_state(macdrv_window w, + const struct macdrv_window_state* state) DECLSPEC_HIDDEN; extern void macdrv_set_cocoa_window_title(macdrv_window w, const UniChar* title, size_t length) DECLSPEC_HIDDEN; extern int macdrv_order_cocoa_window(macdrv_window w, macdrv_window prev, diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index 696941c..8520afa 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -74,6 +74,18 @@ static void get_cocoa_window_features(struct macdrv_win_data *data,
/*********************************************************************** + * get_cocoa_window_state + */ +static void get_cocoa_window_state(struct macdrv_win_data *data, + DWORD style, DWORD ex_style, + struct macdrv_window_state* state) +{ + memset(state, 0, sizeof(*state)); + state->disabled = (style & WS_DISABLED) != 0; +} + + +/*********************************************************************** * get_mac_rect_offset * * Helper for macdrv_window_to_mac_rect and macdrv_mac_to_window_rect. @@ -268,12 +280,16 @@ static void set_cocoa_window_properties(struct macdrv_win_data *data) { DWORD style, ex_style; struct macdrv_window_features wf; + struct macdrv_window_state state;
style = GetWindowLongW(data->hwnd, GWL_STYLE); ex_style = GetWindowLongW(data->hwnd, GWL_EXSTYLE);
get_cocoa_window_features(data, style, ex_style, &wf); macdrv_set_cocoa_window_features(data->cocoa_window, &wf); + + get_cocoa_window_state(data, style, ex_style, &state); + macdrv_set_cocoa_window_state(data->cocoa_window, &state); }