diff --git a/dlls/winemac.drv/cocoa_app.h b/dlls/winemac.drv/cocoa_app.h index cf168c1f9a2..0f8926da0fe 100644 --- a/dlls/winemac.drv/cocoa_app.h +++ b/dlls/winemac.drv/cocoa_app.h @@ -97,6 +97,8 @@ @interface WineApplicationController : NSObject @property (readonly, copy, nonatomic) NSEvent* lastFlagsChanged; @property (readonly, nonatomic) BOOL areDisplaysCaptured; +@property (readonly) BOOL clippingCursor; + + (WineApplicationController*) sharedController; - (void) transformProcessToForeground; diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m index dff69772f8d..ab045b292bd 100644 --- a/dlls/winemac.drv/cocoa_app.m +++ b/dlls/winemac.drv/cocoa_app.m @@ -100,6 +100,8 @@ @implementation WineApplicationController @synthesize cursorFrames, cursorTimer, cursor; @synthesize mouseCaptureWindow; + @synthesize clippingCursor; + + (void) initialize { if (self == [WineApplicationController class]) @@ -1354,6 +1356,16 @@ - (void) updateCursorClippingState [self deactivateCursorClipping]; } + - (void) updateWindowsForCursorClipping + { + WineWindow* window; + for (window in [NSApp windows]) + { + if ([window isKindOfClass:[WineWindow class]]) + [window updateForCursorClipping]; + } + } + - (BOOL) startClippingCursor:(CGRect)rect { CGError err; @@ -1372,6 +1384,7 @@ - (BOOL) startClippingCursor:(CGRect)rect clippingCursor = TRUE; cursorClipRect = rect; [self updateCursorClippingState]; + [self updateWindowsForCursorClipping]; return TRUE; } @@ -1384,6 +1397,7 @@ - (BOOL) stopClippingCursor clippingCursor = FALSE; [self updateCursorClippingState]; + [self updateWindowsForCursorClipping]; return TRUE; } diff --git a/dlls/winemac.drv/cocoa_window.h b/dlls/winemac.drv/cocoa_window.h index 68905a508e5..88ef23dfd2d 100644 --- a/dlls/winemac.drv/cocoa_window.h +++ b/dlls/winemac.drv/cocoa_window.h @@ -88,4 +88,6 @@ - (void) postBroughtForwardEvent; - (WineWindow*) ancestorWineWindow; + - (void) updateForCursorClipping; + @end diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index bb173e9b75d..48d0651c299 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -628,7 +628,8 @@ - (void) dealloc - (BOOL) preventResizing { - return ([self styleMask] & NSResizableWindowMask) && (disabled || !resizable || maximized); + BOOL preventForClipping = cursor_clipping_locks_windows && [[WineApplicationController sharedController] clippingCursor]; + return ([self styleMask] & NSResizableWindowMask) && (disabled || !resizable || maximized || preventForClipping); } - (void) adjustFeaturesForState @@ -659,8 +660,15 @@ - (void) adjustFeaturesForState [self setContentMinSize:savedContentMinSize]; } - if (allow_immovable_windows) - [self setMovable:!disabled && !maximized]; + if (allow_immovable_windows || cursor_clipping_locks_windows) + { + if (allow_immovable_windows && (disabled || maximized)) + [self setMovable:NO]; + else if (cursor_clipping_locks_windows && [[WineApplicationController sharedController] clippingCursor]) + [self setMovable:NO]; + else + [self setMovable:YES]; + } } - (void) adjustFullScreenBehavior:(NSWindowCollectionBehavior)behavior @@ -1494,6 +1502,11 @@ - (void) postBroughtForwardEvent macdrv_release_event(event); } + - (void) updateForCursorClipping + { + [self adjustFeaturesForState]; + } + /* * ---------- NSWindow method overrides ---------- diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h index 6dbaae107ad..d3d3ffc256c 100644 --- a/dlls/winemac.drv/macdrv_cocoa.h +++ b/dlls/winemac.drv/macdrv_cocoa.h @@ -147,6 +147,7 @@ extern int left_option_is_alt DECLSPEC_HIDDEN; extern int right_option_is_alt DECLSPEC_HIDDEN; extern int allow_immovable_windows DECLSPEC_HIDDEN; +extern int cursor_clipping_locks_windows DECLSPEC_HIDDEN; extern int macdrv_start_cocoa_app(unsigned long long tickcount) DECLSPEC_HIDDEN; extern void macdrv_window_rejected_focus(const struct macdrv_event *event) DECLSPEC_HIDDEN; diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c index 1aab785b1fa..300b1a7b1cb 100644 --- a/dlls/winemac.drv/macdrv_main.c +++ b/dlls/winemac.drv/macdrv_main.c @@ -55,6 +55,7 @@ int right_option_is_alt = 0; BOOL allow_software_rendering = FALSE; BOOL disable_window_decorations = FALSE; int allow_immovable_windows = TRUE; +int cursor_clipping_locks_windows = TRUE; HMODULE macdrv_module = 0; @@ -175,6 +176,9 @@ static void setup_options(void) if (!get_config_key(hkey, appkey, "AllowImmovableWindows", buffer, sizeof(buffer))) allow_immovable_windows = IS_OPTION_TRUE(buffer[0]); + if (!get_config_key(hkey, appkey, "CursorClippingLocksWindows", buffer, sizeof(buffer))) + cursor_clipping_locks_windows = IS_OPTION_TRUE(buffer[0]); + if (appkey) RegCloseKey(appkey); if (hkey) RegCloseKey(hkey); }