Folds the parked client-side-cursor machinery (cursorMode auto/always/ never, hidden while disabled) into the cross-client mouse model: MouseInputMode capture|desktop under DefaultsKey.mouseMode, picked in Settings ▸ Keyboard & mouse (macOS), resolved at session start and gated off on gamescope hosts (relative-only EIS). Desktop model = the un-neutered absolute path with the SDL cursor policy: pointer never disassociated (enters/leaves the stream freely), monitor forwards letterboxed absolute positions, and the local cursor hides only while over the view via an invisible-cursor rect (the host's composited cursor is the one you see; AppKit manages the rect, so no hide/unhide balancing). ⌘⇧C becomes ⌃⌥⇧M — the same chord as the SDL clients — flipping the model live with an atomic release/re-engage. Verified: swift build + full test suites green (macOS arm64). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
13 lines
734 B
Swift
13 lines
734 B
Swift
/// How a physical mouse drives the host — the cross-client mouse model (the SDL clients'
|
|
/// `MouseMode` / `Settings::mouse_mode`, design/remote-desktop-sweep.md M1). Stored stringly
|
|
/// under `DefaultsKey.mouseMode`.
|
|
public enum MouseInputMode: String, CaseIterable, Sendable {
|
|
/// Pointer capture (disassociated, hidden cursor, relative deltas) — the game model,
|
|
/// and the default: the only cursor you see is the host's.
|
|
case capture
|
|
/// Absolute pointer, uncaptured: the cursor enters and leaves the stream freely and
|
|
/// motion is forwarded as absolute positions through the letterbox. The remote desktop
|
|
/// model. Requires a host injector with absolute support (not gamescope).
|
|
case desktop
|
|
}
|