From 51b3953cfc3b440aa0b7b1b06d33626426e54556 Mon Sep 17 00:00:00 2001 From: TSRBerry <20988865+TSRBerry@users.noreply.github.com> Date: Mon, 9 Jan 2023 04:55:37 +0100 Subject: [PATCH] [Headless] Add missing arguments & Fix typos (#4193) * 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 --- Ryujinx.Headless.SDL2/HideCursor.cs | 9 ++ Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs | 11 ++- Ryujinx.Headless.SDL2/Options.cs | 82 +++++++++------- Ryujinx.Headless.SDL2/Program.cs | 90 +++++++++--------- .../Ryujinx.Headless.SDL2.csproj | 4 + Ryujinx.Headless.SDL2/Ryujinx.bmp | Bin 0 -> 1122442 bytes Ryujinx.Headless.SDL2/SDL2MouseDriver.cs | 87 ++++++++++++++--- Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs | 10 +- Ryujinx.Headless.SDL2/WindowBase.cs | 55 ++++++++++- Ryujinx.Input/HLE/NpadManager.cs | 2 +- 10 files changed, 248 insertions(+), 102 deletions(-) create mode 100644 Ryujinx.Headless.SDL2/HideCursor.cs create mode 100644 Ryujinx.Headless.SDL2/Ryujinx.bmp diff --git a/Ryujinx.Headless.SDL2/HideCursor.cs b/Ryujinx.Headless.SDL2/HideCursor.cs new file mode 100644 index 00000000..2dc0bd6a --- /dev/null +++ b/Ryujinx.Headless.SDL2/HideCursor.cs @@ -0,0 +1,9 @@ +namespace Ryujinx.Headless.SDL2 +{ + public enum HideCursor + { + Never, + OnIdle, + Always + } +} \ No newline at end of file diff --git a/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs b/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs index d1d0872b..69b0f42f 100644 --- a/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs +++ b/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs @@ -5,7 +5,6 @@ using Ryujinx.Common.Logging; using Ryujinx.Graphics.OpenGL; using Ryujinx.Input.HLE; using System; - using static SDL2.SDL; namespace Ryujinx.Headless.SDL2.OpenGL @@ -103,7 +102,13 @@ namespace Ryujinx.Headless.SDL2.OpenGL private GraphicsDebugLevel _glLogLevel; private SDL2OpenGLContext _openGLContext; - public OpenGLWindow(InputManager inputManager, GraphicsDebugLevel glLogLevel, AspectRatio aspectRatio, bool enableMouse) : base(inputManager, glLogLevel, aspectRatio, enableMouse) + public OpenGLWindow( + InputManager inputManager, + GraphicsDebugLevel glLogLevel, + AspectRatio aspectRatio, + bool enableMouse, + HideCursor hideCursor) + : base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursor) { _glLogLevel = glLogLevel; } @@ -161,4 +166,4 @@ namespace Ryujinx.Headless.SDL2.OpenGL SDL_GL_SwapWindow(WindowHandle); } } -} +} \ No newline at end of file diff --git a/Ryujinx.Headless.SDL2/Options.cs b/Ryujinx.Headless.SDL2/Options.cs index 209ce228..49233bce 100644 --- a/Ryujinx.Headless.SDL2/Options.cs +++ b/Ryujinx.Headless.SDL2/Options.cs @@ -6,6 +6,14 @@ namespace Ryujinx.Headless.SDL2 { public class Options { + // General + + [Option("root-data-dir", Required = false, HelpText = "Set the custom folder path for Ryujinx data.")] + public string BaseDataDir { get; set; } + + [Option("profile", Required = false, HelpText = "Set the user profile to launch the game with.")] + public string UserProfile { get; set; } + // Input [Option("input-profile-1", Required = false, HelpText = "Set the input profile in use for Player 1.")] @@ -23,7 +31,7 @@ namespace Ryujinx.Headless.SDL2 [Option("input-profile-5", Required = false, HelpText = "Set the input profile in use for Player 5.")] public string InputProfile5Name { get; set; } - [Option("input-profile-6", Required = false, HelpText = "Set the input profile in use for Player 5.")] + [Option("input-profile-6", Required = false, HelpText = "Set the input profile in use for Player 6.")] public string InputProfile6Name { get; set; } [Option("input-profile-7", Required = false, HelpText = "Set the input profile in use for Player 7.")] @@ -63,42 +71,45 @@ namespace Ryujinx.Headless.SDL2 public string InputIdHandheld { get; set; } [Option("enable-keyboard", Required = false, Default = false, HelpText = "Enable or disable keyboard support (Independent from controllers binding).")] - public bool? EnableKeyboard { get; set; } + public bool EnableKeyboard { get; set; } [Option("enable-mouse", Required = false, Default = false, HelpText = "Enable or disable mouse support.")] - public bool? EnableMouse { get; set; } + public bool EnableMouse { get; set; } + + [Option("hide-cursor", Required = false, Default = HideCursor.OnIdle, HelpText = "Change when the cursor gets hidden.")] + public HideCursor HideCursor { get; set; } [Option("list-input-profiles", Required = false, HelpText = "List inputs profiles.")] - public bool? ListInputProfiles { get; set; } + public bool ListInputProfiles { get; set; } [Option("list-inputs-ids", Required = false, HelpText = "List inputs ids.")] public bool ListInputIds { get; set; } // System - [Option("enable-ptc", Required = false, Default = true, HelpText = "Enables profiled translation cache persistency.")] - public bool? EnablePtc { get; set; } + [Option("disable-ptc", Required = false, HelpText = "Disables profiled persistent translation cache.")] + public bool DisablePtc { get; set; } [Option("enable-internet-connection", Required = false, Default = false, HelpText = "Enables guest Internet connection.")] - public bool? EnableInternetAccess { get; set; } + public bool EnableInternetAccess { get; set; } - [Option("enable-fs-integrity-checks", Required = false, Default = true, HelpText = "Enables integrity checks on Game content files.")] - public bool? EnableFsIntegrityChecks { get; set; } + [Option("disable-fs-integrity-checks", Required = false, HelpText = "Disables integrity checks on Game content files.")] + public bool DisableFsIntegrityChecks { get; set; } [Option("fs-global-access-log-mode", Required = false, Default = 0, HelpText = "Enables FS access log output to the console.")] public int FsGlobalAccessLogMode { get; set; } - [Option("enable-vsync", Required = false, Default = true, HelpText = "Enables Vertical Sync.")] - public bool? EnableVsync { get; set; } + [Option("disable-vsync", Required = false, HelpText = "Disables Vertical Sync.")] + public bool DisableVsync { get; set; } - [Option("enable-shader-cache", Required = false, Default = true, HelpText = "Enables Shader cache.")] - public bool? EnableShaderCache { get; set; } + [Option("disable-shader-cache", Required = false, HelpText = "Disables Shader cache.")] + public bool DisableShaderCache { get; set; } [Option("enable-texture-recompression", Required = false, Default = false, HelpText = "Enables Texture recompression.")] - public bool? EnableTextureRecompression { get; set; } + public bool EnableTextureRecompression { get; set; } - [Option("enable-docked-mode", Required = false, Default = true, HelpText = "Enables Docked Mode.")] - public bool? EnableDockedMode { get; set; } + [Option("disable-docked-mode", Required = false, HelpText = "Disables Docked Mode.")] + public bool DisableDockedMode { get; set; } [Option("system-language", Required = false, Default = SystemLanguage.AmericanEnglish, HelpText = "Change System Language.")] public SystemLanguage SystemLanguage { get; set; } @@ -120,32 +131,32 @@ namespace Ryujinx.Headless.SDL2 // Logging - [Option("enable-file-logging", Required = false, Default = false, HelpText = "Enables logging to a file on disk.")] - public bool? EnableFileLog { get; set; } + [Option("disable-file-logging", Required = false, Default = false, HelpText = "Disables logging to a file on disk.")] + public bool DisableFileLog { get; set; } [Option("enable-debug-logs", Required = false, Default = false, HelpText = "Enables printing debug log messages.")] - public bool? LoggingEnableDebug { get; set; } + public bool LoggingEnableDebug { get; set; } - [Option("enable-stub-logs", Required = false, Default = true, HelpText = "Enables printing stub log messages.")] - public bool? LoggingEnableStub { get; set; } + [Option("disable-stub-logs", Required = false, HelpText = "Disables printing stub log messages.")] + public bool LoggingDisableStub { get; set; } - [Option("enable-info-logs", Required = false, Default = true, HelpText = "Enables printing info log messages.")] - public bool? LoggingEnableInfo { get; set; } + [Option("disable-info-logs", Required = false, HelpText = "Disables printing info log messages.")] + public bool LoggingDisableInfo { get; set; } - [Option("enable-warning-logs", Required = false, Default = true, HelpText = "Enables printing warning log messages.")] - public bool? LoggingEnableWarning { get; set; } + [Option("disable-warning-logs", Required = false, HelpText = "Disables printing warning log messages.")] + public bool LoggingDisableWarning { get; set; } - [Option("enable-error-logs", Required = false, Default = true, HelpText = "Enables printing error log messages.")] - public bool? LoggingEnableError { get; set; } + [Option("disable-error-logs", Required = false, HelpText = "Disables printing error log messages.")] + public bool LoggingEnableError { get; set; } [Option("enable-trace-logs", Required = false, Default = false, HelpText = "Enables printing trace log messages.")] - public bool? LoggingEnableTrace { get; set; } + public bool LoggingEnableTrace { get; set; } - [Option("enable-guest-logs", Required = false, Default = true, HelpText = "Enables printing guest log messages.")] - public bool? LoggingEnableGuest { get; set; } + [Option("disable-guest-logs", Required = false, HelpText = "Disables printing guest log messages.")] + public bool LoggingDisableGuest { get; set; } [Option("enable-fs-access-logs", Required = false, Default = false, HelpText = "Enables printing FS access log messages.")] - public bool? LoggingEnableFsAccessLog { get; set; } + public bool LoggingEnableFsAccessLog { get; set; } [Option("graphics-debug-level", Required = false, Default = GraphicsDebugLevel.None, HelpText = "Change Graphics API debug log level.")] public GraphicsDebugLevel LoggingGraphicsDebugLevel { get; set; } @@ -164,6 +175,9 @@ namespace Ryujinx.Headless.SDL2 [Option("backend-threading", Required = false, Default = BackendThreading.Auto, HelpText = "Whether or not backend threading is enabled. The \"Auto\" setting will determine whether threading should be enabled at runtime.")] public BackendThreading BackendThreading { get; set; } + [Option("disable-macro-hle", Required= false, HelpText = "Disables high-level emulation of Macro code. Leaving this enabled improves performance but may cause graphical glitches in some games.")] + public bool DisableMacroHLE { get; set; } + [Option("graphics-shaders-dump-path", Required = false, HelpText = "Dumps shaders in this local directory. (Developer only)")] public string GraphicsShadersDumpPath { get; set; } @@ -176,14 +190,14 @@ namespace Ryujinx.Headless.SDL2 // Hacks [Option("expand-ram", Required = false, Default = false, HelpText = "Expands the RAM amount on the emulated system from 4GiB to 6GiB.")] - public bool? ExpandRam { get; set; } + public bool ExpandRam { get; set; } [Option("ignore-missing-services", Required = false, Default = false, HelpText = "Enable ignoring missing services.")] - public bool? IgnoreMissingServices { get; set; } + public bool IgnoreMissingServices { get; set; } // Values [Value(0, MetaName = "input", HelpText = "Input to load.", Required = true)] public string InputPath { get; set; } } -} +} \ No newline at end of file diff --git a/Ryujinx.Headless.SDL2/Program.cs b/Ryujinx.Headless.SDL2/Program.cs index 84363e1f..6ea3a98d 100644 --- a/Ryujinx.Headless.SDL2/Program.cs +++ b/Ryujinx.Headless.SDL2/Program.cs @@ -33,7 +33,6 @@ using System.Collections.Generic; using System.IO; using System.Text.Json; using System.Threading; - using ConfigGamepadInputId = Ryujinx.Common.Configuration.Hid.Controller.GamepadInputId; using ConfigStickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId; using Key = Ryujinx.Common.Configuration.Hid.Key; @@ -63,20 +62,6 @@ namespace Ryujinx.Headless.SDL2 Console.Title = $"Ryujinx Console {Version} (Headless SDL2)"; - AppDataManager.Initialize(null); - - _virtualFileSystem = VirtualFileSystem.CreateInstance(); - _libHacHorizonManager = new LibHacHorizonManager(); - - _libHacHorizonManager.InitializeFsServer(_virtualFileSystem); - _libHacHorizonManager.InitializeArpServer(); - _libHacHorizonManager.InitializeBcatServer(); - _libHacHorizonManager.InitializeSystemClients(); - - _contentManager = new ContentManager(_virtualFileSystem); - _accountManager = new AccountManager(_libHacHorizonManager.RyujinxClient); - _userChannelPersistence = new UserChannelPersistence(); - if (OperatingSystem.IsMacOS() || OperatingSystem.IsLinux()) { AutoResetEvent invoked = new AutoResetEvent(false); @@ -97,15 +82,9 @@ namespace Ryujinx.Headless.SDL2 }; } - _inputManager = new InputManager(new SDL2KeyboardDriver(), new SDL2GamepadDriver()); - - GraphicsConfig.EnableShaderCache = true; - Parser.Default.ParseArguments(args) - .WithParsed(options => Load(options)) + .WithParsed(Load) .WithNotParsed(errors => errors.Output()); - - _inputManager.Dispose(); } private static InputConfig HandlePlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index) @@ -343,6 +322,24 @@ namespace Ryujinx.Headless.SDL2 static void Load(Options option) { + AppDataManager.Initialize(option.BaseDataDir); + + _virtualFileSystem = VirtualFileSystem.CreateInstance(); + _libHacHorizonManager = new LibHacHorizonManager(); + + _libHacHorizonManager.InitializeFsServer(_virtualFileSystem); + _libHacHorizonManager.InitializeArpServer(); + _libHacHorizonManager.InitializeBcatServer(); + _libHacHorizonManager.InitializeSystemClients(); + + _contentManager = new ContentManager(_virtualFileSystem); + _accountManager = new AccountManager(_libHacHorizonManager.RyujinxClient, option.UserProfile); + _userChannelPersistence = new UserChannelPersistence(); + + _inputManager = new InputManager(new SDL2KeyboardDriver(), new SDL2GamepadDriver()); + + GraphicsConfig.EnableShaderCache = true; + IGamepad gamepad; if (option.ListInputIds) @@ -378,8 +375,8 @@ namespace Ryujinx.Headless.SDL2 } _inputConfiguration = new List(); - _enableKeyboard = (bool)option.EnableKeyboard; - _enableMouse = (bool)option.EnableMouse; + _enableKeyboard = option.EnableKeyboard; + _enableMouse = option.EnableMouse; void LoadPlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index) { @@ -407,16 +404,16 @@ namespace Ryujinx.Headless.SDL2 } // Setup logging level - Logger.SetEnable(LogLevel.Debug, (bool)option.LoggingEnableDebug); - Logger.SetEnable(LogLevel.Stub, (bool)option.LoggingEnableStub); - Logger.SetEnable(LogLevel.Info, (bool)option.LoggingEnableInfo); - Logger.SetEnable(LogLevel.Warning, (bool)option.LoggingEnableWarning); - Logger.SetEnable(LogLevel.Error, (bool)option.LoggingEnableError); - Logger.SetEnable(LogLevel.Trace, (bool)option.LoggingEnableTrace); - Logger.SetEnable(LogLevel.Guest, (bool)option.LoggingEnableGuest); - Logger.SetEnable(LogLevel.AccessLog, (bool)option.LoggingEnableFsAccessLog); + Logger.SetEnable(LogLevel.Debug, option.LoggingEnableDebug); + Logger.SetEnable(LogLevel.Stub, !option.LoggingDisableStub); + Logger.SetEnable(LogLevel.Info, !option.LoggingDisableInfo); + Logger.SetEnable(LogLevel.Warning, !option.LoggingDisableWarning); + Logger.SetEnable(LogLevel.Error, option.LoggingEnableError); + Logger.SetEnable(LogLevel.Trace, option.LoggingEnableTrace); + Logger.SetEnable(LogLevel.Guest, !option.LoggingDisableGuest); + Logger.SetEnable(LogLevel.AccessLog, option.LoggingEnableFsAccessLog); - if ((bool)option.EnableFileLog) + if (!option.DisableFileLog) { Logger.AddTarget(new AsyncLogTargetWrapper( new FileLogTarget(ReleaseInformation.GetBaseApplicationDirectory(), "file"), @@ -426,11 +423,12 @@ namespace Ryujinx.Headless.SDL2 } // Setup graphics configuration - GraphicsConfig.EnableShaderCache = (bool)option.EnableShaderCache; - GraphicsConfig.EnableTextureRecompression = (bool)option.EnableTextureRecompression; + GraphicsConfig.EnableShaderCache = !option.DisableShaderCache; + GraphicsConfig.EnableTextureRecompression = option.EnableTextureRecompression; GraphicsConfig.ResScale = option.ResScale; GraphicsConfig.MaxAnisotropy = option.MaxAnisotropy; GraphicsConfig.ShadersDumpPath = option.GraphicsShadersDumpPath; + GraphicsConfig.EnableMacroHLE = !option.DisableMacroHLE; while (true) { @@ -443,6 +441,8 @@ namespace Ryujinx.Headless.SDL2 _userChannelPersistence.ShouldRestart = false; } + + _inputManager.Dispose(); } private static void SetupProgressHandler() @@ -479,8 +479,8 @@ namespace Ryujinx.Headless.SDL2 private static WindowBase CreateWindow(Options options) { return options.GraphicsBackend == GraphicsBackend.Vulkan - ? new VulkanWindow(_inputManager, options.LoggingGraphicsDebugLevel, options.AspectRatio, (bool)options.EnableMouse) - : new OpenGLWindow(_inputManager, options.LoggingGraphicsDebugLevel, options.AspectRatio, (bool)options.EnableMouse); + ? new VulkanWindow(_inputManager, options.LoggingGraphicsDebugLevel, options.AspectRatio, options.EnableMouse, options.HideCursor) + : new OpenGLWindow(_inputManager, options.LoggingGraphicsDebugLevel, options.AspectRatio, options.EnableMouse, options.HideCursor); } private static IRenderer CreateRenderer(Options options, WindowBase window) @@ -533,20 +533,20 @@ namespace Ryujinx.Headless.SDL2 _userChannelPersistence, renderer, new SDL2HardwareDeviceDriver(), - (bool)options.ExpandRam ? MemoryConfiguration.MemoryConfiguration6GiB : MemoryConfiguration.MemoryConfiguration4GiB, + options.ExpandRam ? MemoryConfiguration.MemoryConfiguration6GiB : MemoryConfiguration.MemoryConfiguration4GiB, window, options.SystemLanguage, options.SystemRegion, - (bool)options.EnableVsync, - (bool)options.EnableDockedMode, - (bool)options.EnablePtc, - (bool)options.EnableInternetAccess, - (bool)options.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None, + !options.DisableVsync, + !options.DisableDockedMode, + !options.DisablePtc, + options.EnableInternetAccess, + !options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None, options.FsGlobalAccessLogMode, options.SystemTimeOffset, options.SystemTimeZone, options.MemoryManagerMode, - (bool)options.IgnoreMissingServices, + options.IgnoreMissingServices, options.AspectRatio, options.AudioVolume); @@ -649,7 +649,7 @@ namespace Ryujinx.Headless.SDL2 } else { - Logger.Warning?.Print(LogClass.Application, "Please specify a valid XCI/NCA/NSP/PFS0/NRO file."); + Logger.Warning?.Print(LogClass.Application, $"Couldn't load '{options.InputPath}'. Please specify a valid XCI/NCA/NSP/PFS0/NRO file."); _emulationContext.Dispose(); diff --git a/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj b/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj index 44a16205..81ef53fe 100644 --- a/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj +++ b/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj @@ -42,6 +42,10 @@ + + + + false diff --git a/Ryujinx.Headless.SDL2/Ryujinx.bmp b/Ryujinx.Headless.SDL2/Ryujinx.bmp new file mode 100644 index 0000000000000000000000000000000000000000..413f3b21bb8af18fa2e47aa2468df02546dd359a GIT binary patch literal 1122442 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
;ISff6)c9rVC*GVXglT5c>a_lbvi0m&as& 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 XF#!7i9{=I{<8i5;p 0 && rawButton <= (int)MouseButton.Count) + CheckIdle(); + } + + private void CheckIdle() + { + if (_hideCursor != HideCursor.OnIdle) + { + return; + } + + long cursorMoveDelta = Stopwatch.GetTimestamp() - _lastCursorMoveTime; + + if (cursorMoveDelta >= CursorHideIdleTime * Stopwatch.Frequency) + { + if (!_isHidden) { - PressedButtons[(int)DriverButtonToMouseButton(rawButton)] = evnt.type == SDL_EventType.SDL_MOUSEBUTTONDOWN; - - CurrentPosition = new Vector2(evnt.button.x, evnt.button.y); + 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 diff --git a/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs b/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs index 18323339..172b7685 100644 --- a/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs +++ b/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs @@ -12,7 +12,13 @@ namespace Ryujinx.Headless.SDL2.Vulkan { private GraphicsDebugLevel _glLogLevel; - public VulkanWindow(InputManager inputManager, GraphicsDebugLevel glLogLevel, AspectRatio aspectRatio, bool enableMouse) : base(inputManager, glLogLevel, aspectRatio, enableMouse) + public VulkanWindow( + InputManager inputManager, + GraphicsDebugLevel glLogLevel, + AspectRatio aspectRatio, + bool enableMouse, + HideCursor hideCursor) + : base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursor) { _glLogLevel = glLogLevel; } @@ -95,4 +101,4 @@ namespace Ryujinx.Headless.SDL2.Vulkan protected override void SwapBuffers() { } } -} +} \ No newline at end of file diff --git a/Ryujinx.Headless.SDL2/WindowBase.cs b/Ryujinx.Headless.SDL2/WindowBase.cs index 88b0d573..db6c8ec4 100644 --- a/Ryujinx.Headless.SDL2/WindowBase.cs +++ b/Ryujinx.Headless.SDL2/WindowBase.cs @@ -14,13 +14,16 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; using System.Threading; using static SDL2.SDL; using Switch = Ryujinx.HLE.Switch; namespace Ryujinx.Headless.SDL2 { - abstract class WindowBase : IHostUiHandler, IDisposable + abstract partial class WindowBase : IHostUiHandler, IDisposable { protected const int DefaultWidth = 1280; protected const int DefaultHeight = 720; @@ -29,6 +32,10 @@ namespace Ryujinx.Headless.SDL2 private static ConcurrentQueue MainThreadActions = new ConcurrentQueue(); + [LibraryImport("SDL2")] + // TODO: Remove this as soon as SDL2-CS was updated to expose this method publicly + private static partial IntPtr SDL_LoadBMP_RW(IntPtr src, int freesrc); + public static void QueueMainThreadAction(Action action) { MainThreadActions.Enqueue(action); @@ -66,9 +73,14 @@ namespace Ryujinx.Headless.SDL2 private AspectRatio _aspectRatio; private bool _enableMouse; - public WindowBase(InputManager inputManager, GraphicsDebugLevel glLogLevel, AspectRatio aspectRatio, bool enableMouse) + public WindowBase( + InputManager inputManager, + GraphicsDebugLevel glLogLevel, + AspectRatio aspectRatio, + bool enableMouse, + HideCursor hideCursor) { - MouseDriver = new SDL2MouseDriver(); + MouseDriver = new SDL2MouseDriver(hideCursor); _inputManager = inputManager; _inputManager.SetMouseDriver(MouseDriver); NpadManager = _inputManager.CreateNpadManager(); @@ -103,6 +115,34 @@ namespace Ryujinx.Headless.SDL2 TouchScreenManager.Initialize(device); } + private void SetWindowIcon() + { + Stream iconStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Ryujinx.Headless.SDL2.Ryujinx.bmp"); + byte[] iconBytes = new byte[iconStream!.Length]; + + if (iconStream.Read(iconBytes, 0, iconBytes.Length) != iconBytes.Length) + { + Logger.Error?.Print(LogClass.Application, "Failed to read icon to byte array."); + iconStream.Close(); + + return; + } + + iconStream.Close(); + + unsafe + { + fixed (byte* iconPtr = iconBytes) + { + IntPtr rwOpsStruct = SDL_RWFromConstMem((IntPtr)iconPtr, iconBytes.Length); + IntPtr iconHandle = SDL_LoadBMP_RW(rwOpsStruct, 1); + + SDL_SetWindowIcon(WindowHandle, iconHandle); + SDL_FreeSurface(iconHandle); + } + } + } + private void InitializeWindow() { string titleNameSection = string.IsNullOrWhiteSpace(Device.Application.TitleName) ? string.Empty @@ -127,6 +167,8 @@ namespace Ryujinx.Headless.SDL2 throw new Exception(errorMessage); } + SetWindowIcon(); + _windowId = SDL_GetWindowID(WindowHandle); SDL2Driver.Instance.RegisterWindow(_windowId, HandleWindowEvent); @@ -146,9 +188,11 @@ namespace Ryujinx.Headless.SDL2 Renderer?.Window.SetSize(Width, Height); MouseDriver.SetClientSize(Width, Height); break; + case SDL_WindowEventID.SDL_WINDOWEVENT_CLOSE: Exit(); break; + default: break; } @@ -331,6 +375,9 @@ namespace Ryujinx.Headless.SDL2 Device.Hid.DebugPad.Update(); + // TODO: Replace this with MouseDriver.CheckIdle() when mouse motion events are received on every supported platform. + MouseDriver.UpdatePosition(); + return true; } @@ -451,4 +498,4 @@ namespace Ryujinx.Headless.SDL2 } } } -} +} \ No newline at end of file diff --git a/Ryujinx.Input/HLE/NpadManager.cs b/Ryujinx.Input/HLE/NpadManager.cs index 34e05687..5290ecbb 100644 --- a/Ryujinx.Input/HLE/NpadManager.cs +++ b/Ryujinx.Input/HLE/NpadManager.cs @@ -163,7 +163,7 @@ namespace Ryujinx.Input.HLE ReloadConfiguration(inputConfig, enableKeyboard, enableMouse); } - public void Update(float aspectRatio = 0) + public void Update(float aspectRatio = 1) { lock (_lock) {