diff --git a/dlls/winemac.drv/cocoa_app.h b/dlls/winemac.drv/cocoa_app.h
index 07a4bc858670511037ca195f52df54aeeff79321..cf168c1f9a2e56dc0079113c7e31844c0d525c78 100644
--- a/dlls/winemac.drv/cocoa_app.h
+++ b/dlls/winemac.drv/cocoa_app.h
@@ -89,6 +89,8 @@ @interface WineApplicationController : NSObject <NSApplicationDelegate>
     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 c9f51d69adbef7a96b5e4db5b979c5cffacb9cc0..857c0199a2cf4c4c7f4d15e2c1006b10498f9f54 100644
--- a/dlls/winemac.drv/cocoa_app.m
+++ b/dlls/winemac.drv/cocoa_app.m
@@ -154,6 +154,8 @@ - (id) init
 
             warpRecords = [[NSMutableArray alloc] init];
 
+            windowsBeingDragged = [[NSMutableSet alloc] init];
+
             if (!requests || !requestsManipQueue || !eventQueues || !eventQueuesLock ||
                 !keyWindows || !originalDisplayModes || !latentDisplayModes || !warpRecords)
             {
@@ -173,6 +175,7 @@ - (id) init
 
     - (void) dealloc
     {
+        [windowsBeingDragged release];
         [cursor release];
         [screenFrameCGRects release];
         [applicationIcon release];
@@ -1258,7 +1261,9 @@ - (BOOL) setCursorPosition:(CGPoint)pos
     {
         BOOL ret;
 
-        if (clippingCursor)
+        if ([windowsBeingDragged count])
+            ret = FALSE;
+        else if (clippingCursor)
         {
             [self clipCursorLocation:&pos];
 
@@ -1335,7 +1340,7 @@ - (void) deactivateCursorClipping
 
     - (void) updateCursorClippingState
     {
-        if (clippingCursor && [NSApp isActive])
+        if (clippingCursor && [NSApp isActive] && ![windowsBeingDragged count])
             [self activateCursorClipping];
         else
             [self deactivateCursorClipping];
@@ -1395,7 +1400,9 @@ - (void) handleMouseMove:(NSEvent*)anEvent
         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 @@ - (void) handleMouseButton:(NSEvent*)theEvent
             }
         }
 
-        if (mouseCaptureWindow)
+        if ([windowsBeingDragged count])
+            window = nil;
+        else if (mouseCaptureWindow)
             window = mouseCaptureWindow;
 
         if ([window isKindOfClass:[WineWindow class]])
@@ -1861,6 +1870,26 @@ - (BOOL) handleEvent:(NSEvent*)anEvent
                     [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 @@ - (void) setupObservations
                     [self updateFullscreenWindows];
                 });
             }
+            [windowsBeingDragged removeObject:window];
+            [self updateCursorClippingState];
         }];
 
         [nc addObserver:self