Module: wine Branch: master Commit: b3cc34e5b0a3e40288e7b9888773dc6aeb6dd37d URL: http://source.winehq.org/git/wine.git/?a=commit;h=b3cc34e5b0a3e40288e7b98887...
Author: Ken Thomases ken@codeweavers.com Date: Wed Dec 11 12:50:47 2013 -0600
winemac: While a window is being dragged, suppress mouse events and disable cursor clipping and warping.
---
dlls/winemac.drv/cocoa_app.h | 2 ++ dlls/winemac.drv/cocoa_app.m | 39 +++++++++++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 4 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_app.h b/dlls/winemac.drv/cocoa_app.h index 07a4bc8..cf168c1 100644 --- a/dlls/winemac.drv/cocoa_app.h +++ b/dlls/winemac.drv/cocoa_app.h @@ -89,6 +89,8 @@ enum { NSImage* applicationIcon;
BOOL beenActive; + + NSMutableSet* windowsBeingDragged; }
@property (nonatomic) CGEventSourceKeyboardType keyboardType; diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m index c9f51d6..857c019 100644 --- a/dlls/winemac.drv/cocoa_app.m +++ b/dlls/winemac.drv/cocoa_app.m @@ -154,6 +154,8 @@ int macdrv_err_on;
warpRecords = [[NSMutableArray alloc] init];
+ windowsBeingDragged = [[NSMutableSet alloc] init]; + if (!requests || !requestsManipQueue || !eventQueues || !eventQueuesLock || !keyWindows || !originalDisplayModes || !latentDisplayModes || !warpRecords) { @@ -173,6 +175,7 @@ int macdrv_err_on;
- (void) dealloc { + [windowsBeingDragged release]; [cursor release]; [screenFrameCGRects release]; [applicationIcon release]; @@ -1258,7 +1261,9 @@ int macdrv_err_on; { BOOL ret;
- if (clippingCursor) + if ([windowsBeingDragged count]) + ret = FALSE; + else if (clippingCursor) { [self clipCursorLocation:&pos];
@@ -1335,7 +1340,7 @@ int macdrv_err_on;
- (void) updateCursorClippingState { - if (clippingCursor && [NSApp isActive]) + if (clippingCursor && [NSApp isActive] && ![windowsBeingDragged count]) [self activateCursorClipping]; else [self deactivateCursorClipping]; @@ -1395,7 +1400,9 @@ int macdrv_err_on; WineWindow* targetWindow; BOOL drag = [anEvent type] != NSMouseMoved;
- if (mouseCaptureWindow) + if ([windowsBeingDragged count]) + targetWindow = nil; + else if (mouseCaptureWindow) targetWindow = mouseCaptureWindow; else if (drag) targetWindow = (WineWindow*)[anEvent window]; @@ -1620,7 +1627,9 @@ int macdrv_err_on; } }
- if (mouseCaptureWindow) + if ([windowsBeingDragged count]) + window = nil; + else if (mouseCaptureWindow) window = mouseCaptureWindow;
if ([window isKindOfClass:[WineWindow class]]) @@ -1861,6 +1870,26 @@ int macdrv_err_on; [window postKeyEvent:anEvent]; } } + else if (type == NSAppKitDefined) + { + short subtype = [anEvent subtype]; + + // These subtypes are not documented but they appear to mean + // "a window is being dragged" and "a window is no longer being + // dragged", respectively. + if (subtype == 20 || subtype == 21) + { + WineWindow* window = (WineWindow*)[anEvent window]; + if ([window isKindOfClass:[WineWindow class]]) + { + if (subtype == 20) + [windowsBeingDragged addObject:window]; + else + [windowsBeingDragged removeObject:window]; + [self updateCursorClippingState]; + } + } + }
return ret; } @@ -1917,6 +1946,8 @@ int macdrv_err_on; [self updateFullscreenWindows]; }); } + [windowsBeingDragged removeObject:window]; + [self updateCursorClippingState]; }];
[nc addObserver:self