mirror of
https://github.com/ryujinx-mirror/ryujinx.git
synced 2024-11-25 19:45:13 +00:00
51b3953cfc
* 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
164 lines
No EOL
4.4 KiB
C#
164 lines
No EOL
4.4 KiB
C#
using Ryujinx.Input;
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.Numerics;
|
|
using System.Runtime.CompilerServices;
|
|
using static SDL2.SDL;
|
|
|
|
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; }
|
|
|
|
public Vector2 CurrentPosition { get; private set; }
|
|
public Vector2 Scroll { get; private set; }
|
|
public Size _clientSize;
|
|
|
|
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)]
|
|
private static MouseButton DriverButtonToMouseButton(uint rawButton)
|
|
{
|
|
Debug.Assert(rawButton > 0 && rawButton <= (int)MouseButton.Count);
|
|
|
|
return (MouseButton)(rawButton - 1);
|
|
}
|
|
|
|
public void UpdatePosition()
|
|
{
|
|
SDL_GetMouseState(out int posX, out int posY);
|
|
Vector2 position = new(posX, posY);
|
|
|
|
if (CurrentPosition != position)
|
|
{
|
|
CurrentPosition = position;
|
|
_lastCursorMoveTime = Stopwatch.GetTimestamp();
|
|
}
|
|
|
|
CheckIdle();
|
|
}
|
|
|
|
private void CheckIdle()
|
|
{
|
|
if (_hideCursor != HideCursor.OnIdle)
|
|
{
|
|
return;
|
|
}
|
|
|
|
long cursorMoveDelta = Stopwatch.GetTimestamp() - _lastCursorMoveTime;
|
|
|
|
if (cursorMoveDelta >= CursorHideIdleTime * Stopwatch.Frequency)
|
|
{
|
|
if (!_isHidden)
|
|
{
|
|
SDL_ShowCursor(SDL_DISABLE);
|
|
_isHidden = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (_isHidden)
|
|
{
|
|
SDL_ShowCursor(SDL_ENABLE);
|
|
_isHidden = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Update(SDL_Event evnt)
|
|
{
|
|
switch (evnt.type)
|
|
{
|
|
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;
|
|
}
|
|
}
|
|
|
|
public void SetClientSize(int width, int height)
|
|
{
|
|
_clientSize = new Size(width, height);
|
|
}
|
|
|
|
public bool IsButtonPressed(MouseButton button)
|
|
{
|
|
return PressedButtons[(int)button];
|
|
}
|
|
|
|
public Size GetClientSize()
|
|
{
|
|
return _clientSize;
|
|
}
|
|
|
|
public string DriverName => "SDL2";
|
|
|
|
public event Action<string> OnGamepadConnected
|
|
{
|
|
add { }
|
|
remove { }
|
|
}
|
|
|
|
public event Action<string> OnGamepadDisconnected
|
|
{
|
|
add { }
|
|
remove { }
|
|
}
|
|
|
|
public ReadOnlySpan<string> GamepadsIds => new[] { "0" };
|
|
|
|
public IGamepad GetGamepad(string id)
|
|
{
|
|
return new SDL2Mouse(this);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
if (_isDisposed)
|
|
{
|
|
return;
|
|
}
|
|
|
|
_isDisposed = true;
|
|
}
|
|
}
|
|
} |