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