Signed-off-by: Tim Clem tclem@codeweavers.com --- dlls/winemac.drv/cocoa_app.h | 4 ++-- dlls/winemac.drv/cocoa_app.m | 5 ++++- dlls/winemac.drv/cocoa_cursorclipping.h | 29 +++++++++++++++++-------- 3 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_app.h b/dlls/winemac.drv/cocoa_app.h index 4ddf2fb3babb..c1ddf079d47e 100644 --- a/dlls/winemac.drv/cocoa_app.h +++ b/dlls/winemac.drv/cocoa_app.h @@ -67,8 +67,8 @@
@class WineEventQueue; -@class WineEventTapClipCursorHandler; @class WineWindow; +@protocol WineClipCursorHandler;
@interface WineApplicationController : NSObject <NSApplicationDelegate> @@ -121,7 +121,7 @@ @interface WineApplicationController : NSObject <NSApplicationDelegate>
NSTimeInterval lastSetCursorPositionTime;
- WineEventTapClipCursorHandler* clipCursorHandler; + id<WineClipCursorHandler> clipCursorHandler;
NSImage* applicationIcon;
diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m index b2d54bce9087..ac52a7425dd5 100644 --- a/dlls/winemac.drv/cocoa_app.m +++ b/dlls/winemac.drv/cocoa_app.m @@ -1145,10 +1145,13 @@ - (BOOL) setCursorPosition:(CGPoint)pos
if ([windowsBeingDragged count]) ret = FALSE; - else if (self.clippingCursor) + else if (self.clippingCursor && [clipCursorHandler respondsToSelector:@selector(setCursorPosition:)]) ret = [clipCursorHandler setCursorPosition:pos]; else { + if (self.clippingCursor) + [clipCursorHandler clipCursorLocation:&pos]; + // Annoyingly, CGWarpMouseCursorPosition() effectively disassociates // the mouse from the cursor position for 0.25 seconds. This means // that mouse movement during that interval doesn't move the cursor diff --git a/dlls/winemac.drv/cocoa_cursorclipping.h b/dlls/winemac.drv/cocoa_cursorclipping.h index 132527e10396..7ce0529a1575 100644 --- a/dlls/winemac.drv/cocoa_cursorclipping.h +++ b/dlls/winemac.drv/cocoa_cursorclipping.h @@ -21,15 +21,8 @@
#import <AppKit/AppKit.h>
-@interface WineEventTapClipCursorHandler : NSObject -{ - BOOL clippingCursor; - CGRect cursorClipRect; - CFMachPortRef cursorClippingEventTap; - NSMutableArray* warpRecords; - CGPoint synthesizedLocation; - NSTimeInterval lastEventTapEventTime; -} + +@protocol WineClipCursorHandler <NSObject>
@property (readonly, nonatomic) BOOL clippingCursor; @property (readonly, nonatomic) CGRect cursorClipRect; @@ -41,6 +34,24 @@ - (void) clipCursorLocation:(CGPoint*)location;
- (void) setRetinaMode:(int)mode;
+ @optional + /* If provided, should reposition the cursor as needed given the current + * clipping rect. If not provided, the location will be clipped by + * -clipCursorLocation, and the cursor will be warped normally. + */ - (BOOL) setCursorPosition:(CGPoint)pos;
@end + + +@interface WineEventTapClipCursorHandler : NSObject <WineClipCursorHandler> +{ + BOOL clippingCursor; + CGRect cursorClipRect; + CFMachPortRef cursorClippingEventTap; + NSMutableArray* warpRecords; + CGPoint synthesizedLocation; + NSTimeInterval lastEventTapEventTime; +} + +@end