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