diff --git a/dlls/winemac.drv/cocoa_window.h b/dlls/winemac.drv/cocoa_window.h index 3b9dc906718..1edcd9c85a5 100644 --- a/dlls/winemac.drv/cocoa_window.h +++ b/dlls/winemac.drv/cocoa_window.h @@ -22,4 +22,9 @@ @interface WineWindow : NSPanel +{ + NSUInteger normalStyleMask; + BOOL disabled; +} + @end diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index 608f7506c54..848e49e0a32 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -60,6 +60,8 @@ @interface WineContentView : NSView @interface WineWindow () +@property (nonatomic) BOOL disabled; + + (void) flipRect:(NSRect*)rect; @end @@ -77,6 +79,8 @@ - (BOOL) isFlipped @implementation WineWindow + @synthesize disabled; + + (WineWindow*) createWindowWithFeatures:(const struct macdrv_window_features*)wf windowFrame:(NSRect)window_frame { @@ -90,6 +94,9 @@ + (WineWindow*) createWindowWithFeatures:(const struct macdrv_window_features*)w 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 @@ + (void) flipRect:(NSRect*)rect 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 @@ - (BOOL) setFrameIfOnScreen:(NSRect)contentRect 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 @@ -247,6 +284,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 * diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h index 4cebceff086..e2a735bcf4d 100644 --- a/dlls/winemac.drv/macdrv_cocoa.h +++ b/dlls/winemac.drv/macdrv_cocoa.h @@ -125,11 +125,17 @@ 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 696941cae23..8520afafb4b 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -73,6 +73,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 * @@ -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); }