[PATCH 0/5] winemac.drv: New ClipCursor implementation

Dean Greer gcenx83 at gmail.com
Fri Jan 21 15:21:22 CST 2022


I was hoping Brendon or Chip would give some feedback on this but guessing
there busy and not noticed this yet.

This looks good to me and has been tested with a couple of games.

On Wed, Jan 19, 2022 at 2:40 PM Tim Clem <tclem at codeweavers.com> wrote:

> The Mac driver has historically used session-wide CGEventTaps to
> implement ClipCursor. In macOS Mojave, such event taps started
> requiring Accessibility permission from the user. That's problematic
> on two levels:
>
> First, it's a hassle. Unlike, say, microphone permissions, the user
> can't just click "Approve" on a dialog box. Instead they have to go to
> the System Preferences app, enter their password, and click a checkbox
> (which will have the name of the preloader). This is especially bad
> because ClipCursor is frequently called by fullscreen games, which
> means the permission prompt will be hidden.
>
> Second, many apps misbehave if ClipCursor fails. For instance, some
> Unity games (e.g. Raft, The Forest) exhibit erratic mouse movement in
> that case. But apps are likely to end up in that state since
> Accessibility permission is deny-by-default and there is no blocking
> call to check for the permission. The attempt to install an event tap
> immediately fails until the permission is granted.
>
> As of 10.13, there is an undocumented NSWindow method
> -setMouseConfinementRect: that is in many ways a better option. It
> does not support certain uncommon scenarios (clipping to regions
> outside of a window), but it is far simpler and requires fewer
> workarounds than the event tap. It also does not require permission
> from the user.
>
> This series of patches factors the existing clipping code out of
> cocoa_app.m into its own class. It then adds a second implementation
> of that interface that uses -setMouseConfinementRect:. Finally it
> enables that approach by default in 10.13+, adding a registry key to
> enable the old behavior if needed.
>
> I'd welcome any feedback or suggestions. If you know of any apps that
> clip the cursor to a region outside of a single frontmost window, I'd
> also love to hear about those.
>
> Tim Clem (5):
>   winemac.drv: Factor out cursor clipping code to its own class.
>   winemac.drv: Create a protocol to represent a cursor clipping handler.
>   winemac.drv: Factor common cursor clipping methods into functions.
>   winemac.drv: Add a cursor clipping implementation using
>     -setMouseConfinementRect:.
>   winemac.drv: Use -setMouseConfinementRect: for cursor clipping by
>     default.
>
>  dlls/winemac.drv/Makefile.in            |   1 +
>  dlls/winemac.drv/cocoa_app.h            |  11 +-
>  dlls/winemac.drv/cocoa_app.m            | 333 ++--------------
>  dlls/winemac.drv/cocoa_cursorclipping.h |  73 ++++
>  dlls/winemac.drv/cocoa_cursorclipping.m | 510 ++++++++++++++++++++++++
>  dlls/winemac.drv/macdrv_cocoa.h         |   1 +
>  dlls/winemac.drv/macdrv_main.c          |   4 +
>  7 files changed, 626 insertions(+), 307 deletions(-)
>  create mode 100644 dlls/winemac.drv/cocoa_cursorclipping.h
>  create mode 100644 dlls/winemac.drv/cocoa_cursorclipping.m
>
> --
> 2.34.1
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20220121/d48af4c2/attachment.htm>


More information about the wine-devel mailing list