diff options
author | TSRBerry <20988865+TSRBerry@users.noreply.github.com> | 2023-01-09 04:55:37 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-09 04:55:37 +0100 |
commit | 51b3953cfc3b440aa0b7b1b06d33626426e54556 (patch) | |
tree | b6bc77a46d8d0b2d635ce135ac822d188787344c /Ryujinx.Headless.SDL2/SDL2MouseDriver.cs | |
parent | 610eecc1c1fec2203fff1ebd71cd10798fbcc05a (diff) |
[Headless] Add missing arguments & Fix typos (#4193)1.1.525
* headless: Fix typos in command line options
* Remove nullable from command line options
Add EnableMacroHLE option
Add HideCursorOnIdle option
* headless: Adjust enable-ptc help text
* headless: Use switch statement instead of if-else chain
* headless: Improve formatting for long constructors
* headless: Remove discards from SDL_ShowCursor()
* headless: Add window icon
* Fix hiding cursor on idle
At least on Wayland, SDL2 doesn't produce any mouse motion events.
* Add new command line args: BaseDataDir and UserProfile
* headless: Read icon from embedded resource
* headless: Skip SetWindowIcon() on Windows if dll isn't present
* headless: Fix division by zero
* headless: Fix command line options not working correctly
* headless: Fix crash when viewing command line options
* headless: Load window icon bmp from memory
* Add comment to the workaround for SDL_LoadBMP_RW
* headless: Enable logging to file by default
* headless: Add 3 options for --hide-cursor
Replaces --disable-hide-cursor-on-idle
Diffstat (limited to 'Ryujinx.Headless.SDL2/SDL2MouseDriver.cs')
-rw-r--r-- | Ryujinx.Headless.SDL2/SDL2MouseDriver.cs | 87 |
1 files changed, 74 insertions, 13 deletions
diff --git a/Ryujinx.Headless.SDL2/SDL2MouseDriver.cs b/Ryujinx.Headless.SDL2/SDL2MouseDriver.cs index 236d4769..bdf428cc 100644 --- a/Ryujinx.Headless.SDL2/SDL2MouseDriver.cs +++ b/Ryujinx.Headless.SDL2/SDL2MouseDriver.cs @@ -10,7 +10,12 @@ namespace Ryujinx.Headless.SDL2 { class SDL2MouseDriver : IGamepadDriver { + private const int CursorHideIdleTime = 8; // seconds + private bool _isDisposed; + private HideCursor _hideCursor; + private bool _isHidden; + private long _lastCursorMoveTime; public bool[] PressedButtons { get; } @@ -18,9 +23,16 @@ namespace Ryujinx.Headless.SDL2 public Vector2 Scroll { get; private set; } public Size _clientSize; - public SDL2MouseDriver() + public SDL2MouseDriver(HideCursor hideCursor) { PressedButtons = new bool[(int)MouseButton.Count]; + _hideCursor = hideCursor; + + if (_hideCursor == HideCursor.Always) + { + SDL_ShowCursor(SDL_DISABLE); + _isHidden = true; + } } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -31,26 +43,75 @@ namespace Ryujinx.Headless.SDL2 return (MouseButton)(rawButton - 1); } - public void Update(SDL_Event evnt) + public void UpdatePosition() { - if (evnt.type == SDL_EventType.SDL_MOUSEBUTTONDOWN || evnt.type == SDL_EventType.SDL_MOUSEBUTTONUP) + SDL_GetMouseState(out int posX, out int posY); + Vector2 position = new(posX, posY); + + if (CurrentPosition != position) { - uint rawButton = evnt.button.button; + CurrentPosition = position; + _lastCursorMoveTime = Stopwatch.GetTimestamp(); + } - if (rawButton > 0 && rawButton <= (int)MouseButton.Count) - { - PressedButtons[(int)DriverButtonToMouseButton(rawButton)] = evnt.type == SDL_EventType.SDL_MOUSEBUTTONDOWN; + CheckIdle(); + } + + private void CheckIdle() + { + if (_hideCursor != HideCursor.OnIdle) + { + return; + } + + long cursorMoveDelta = Stopwatch.GetTimestamp() - _lastCursorMoveTime; - CurrentPosition = new Vector2(evnt.button.x, evnt.button.y); + if (cursorMoveDelta >= CursorHideIdleTime * Stopwatch.Frequency) + { + if (!_isHidden) + { + SDL_ShowCursor(SDL_DISABLE); + _isHidden = true; } } - else if (evnt.type == SDL_EventType.SDL_MOUSEMOTION) + else { - CurrentPosition = new Vector2(evnt.motion.x, evnt.motion.y); + if (_isHidden) + { + SDL_ShowCursor(SDL_ENABLE); + _isHidden = false; + } } - else if (evnt.type == SDL_EventType.SDL_MOUSEWHEEL) + } + + public void Update(SDL_Event evnt) + { + switch (evnt.type) { - Scroll = new Vector2(evnt.wheel.x, evnt.wheel.y); + case SDL_EventType.SDL_MOUSEBUTTONDOWN: + case SDL_EventType.SDL_MOUSEBUTTONUP: + uint rawButton = evnt.button.button; + + if (rawButton > 0 && rawButton <= (int)MouseButton.Count) + { + PressedButtons[(int)DriverButtonToMouseButton(rawButton)] = evnt.type == SDL_EventType.SDL_MOUSEBUTTONDOWN; + + CurrentPosition = new Vector2(evnt.button.x, evnt.button.y); + } + + break; + + // NOTE: On Linux using Wayland mouse motion events won't be received at all. + case SDL_EventType.SDL_MOUSEMOTION: + CurrentPosition = new Vector2(evnt.motion.x, evnt.motion.y); + _lastCursorMoveTime = Stopwatch.GetTimestamp(); + + break; + + case SDL_EventType.SDL_MOUSEWHEEL: + Scroll = new Vector2(evnt.wheel.x, evnt.wheel.y); + + break; } } @@ -100,4 +161,4 @@ namespace Ryujinx.Headless.SDL2 _isDisposed = true; } } -} +}
\ No newline at end of file |