Module: wine Branch: master Commit: 9d6a14305a42b1595344429ac04d5122bc1cab5b URL: http://source.winehq.org/git/wine.git/?a=commit;h=9d6a14305a42b1595344429ac0...
Author: Ken Thomases ken@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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); } }