Ken Thomases : winemac: While a window is being dragged, suppress mouse events and disable cursor clipping and warping.
Alexandre Julliard
julliard at winehq.org
Thu Dec 12 12:48:07 CST 2013
Module: wine
Branch: master
Commit: b3cc34e5b0a3e40288e7b9888773dc6aeb6dd37d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b3cc34e5b0a3e40288e7b9888773dc6aeb6dd37d
Author: Ken Thomases <ken at 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
More information about the wine-cvs
mailing list