Ken Thomases : winemac: Add another workaround for bad side effects of CGWarpMouseCursorPosition( ).

Alexandre Julliard julliard at wine.codeweavers.com
Thu Oct 29 09:32:11 CDT 2015


Module: wine
Branch: master
Commit: 9d6a14305a42b1595344429ac04d5122bc1cab5b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9d6a14305a42b1595344429ac04d5122bc1cab5b

Author: Ken Thomases <ken at codeweavers.com>
Date:   Wed Oct 28 17:01:54 2015 -0500

winemac: Add another workaround for bad side effects of CGWarpMouseCursorPosition().

Signed-off-by: Ken Thomases <ken at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winemac.drv/cocoa_app.m | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m
index 8e1f318..7f6ca23 100644
--- a/dlls/winemac.drv/cocoa_app.m
+++ b/dlls/winemac.drv/cocoa_app.m
@@ -1307,20 +1307,27 @@ int macdrv_err_on;
         }
         else
         {
+            // 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
+            // and events carry a constant location (the warped-to position)
+            // even though they have delta values.  For apps which warp the
+            // cursor frequently (like after every mouse move), this makes
+            // cursor movement horribly laggy and jerky, as only a fraction of
+            // mouse move events have any effect.
+            //
+            // On some versions of OS X, it's sufficient to forcibly reassociate
+            // the mouse and cursor position.  On others, it's necessary to set
+            // the local events suppression interval to 0 for the warp.  That's
+            // deprecated, but I'm not aware of any other way.  For good
+            // measure, we do both.
+            CGSetLocalEventsSuppressionInterval(0);
             ret = (CGWarpMouseCursorPosition(pos) == kCGErrorSuccess);
+            CGSetLocalEventsSuppressionInterval(0.25);
             if (ret)
             {
                 lastSetCursorPositionTime = [[NSProcessInfo processInfo] systemUptime];
 
-                // 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
-                // and events carry a constant location (the warped-to position)
-                // even though they have delta values.  This screws us up because
-                // the accumulated deltas we send to Wine don't match any eventual
-                // absolute position we send (like with a button press).  We can
-                // work around this by simply forcibly reassociating the mouse and
-                // cursor position.
                 CGAssociateMouseAndMouseCursorPosition(true);
             }
         }




More information about the wine-cvs mailing list