Headless: Add support for fullscreen option (#5339)

* Headless: Added support for fullscreen option

* Headless: cleanup of fullscreen support

* Headless: fullscreen support : implemented proposed changes

* Headless: fullscreen support: cleanup

* Headless: fullscreen support: fix for OpenGL scaling

* Headless: fullscreen support: cleanup

* Headless: fullscreen support: cleanup

* Headless: fullscreen support: add. macOS fullscreen fix

* Headless: fullscreen support: cleanup

* Headless: fullscreen support: cleanup

* Headless: fullscreen support: cleanup
This commit is contained in:
Theun de Bruijn 2023-07-06 20:10:15 +10:00 committed by GitHub
parent 1c7a90ef35
commit c19c8bbade
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 38 additions and 7 deletions

View file

@ -151,9 +151,23 @@ namespace Ryujinx.Headless.SDL2.OpenGL
GL.Clear(ClearBufferMask.ColorBufferBit); GL.Clear(ClearBufferMask.ColorBufferBit);
SwapBuffers(); SwapBuffers();
if (IsFullscreen)
{
// NOTE: grabbing the main display's dimensions directly as OpenGL doesn't scale along like the VulkanWindow.
// we might have to amend this if people run this on a non-primary display set to a different resolution.
SDL_Rect displayBounds;
SDL_GetDisplayBounds(0, out displayBounds);
Renderer?.Window.SetSize(displayBounds.w, displayBounds.h);
MouseDriver.SetClientSize(displayBounds.w, displayBounds.h);
}
else
{
Renderer?.Window.SetSize(DefaultWidth, DefaultHeight); Renderer?.Window.SetSize(DefaultWidth, DefaultHeight);
MouseDriver.SetClientSize(DefaultWidth, DefaultHeight); MouseDriver.SetClientSize(DefaultWidth, DefaultHeight);
} }
}
protected override void InitializeRenderer() { } protected override void InitializeRenderer() { }

View file

@ -14,6 +14,9 @@ namespace Ryujinx.Headless.SDL2
[Option("profile", Required = false, HelpText = "Set the user profile to launch the game with.")] [Option("profile", Required = false, HelpText = "Set the user profile to launch the game with.")]
public string UserProfile { get; set; } public string UserProfile { get; set; }
[Option("fullscreen", Required = false, HelpText = "Launch the game in fullscreen mode.")]
public bool IsFullscreen { get; set; }
// Input // Input
[Option("input-profile-1", Required = false, HelpText = "Set the input profile in use for Player 1.")] [Option("input-profile-1", Required = false, HelpText = "Set the input profile in use for Player 1.")]

View file

@ -64,6 +64,9 @@ namespace Ryujinx.Headless.SDL2
{ {
Version = ReleaseInformation.GetVersion(); Version = ReleaseInformation.GetVersion();
// Make process DPI aware for proper window sizing on high-res screens.
ForceDpiAware.Windows();
Console.Title = $"Ryujinx Console {Version} (Headless SDL2)"; Console.Title = $"Ryujinx Console {Version} (Headless SDL2)";
if (OperatingSystem.IsMacOS() || OperatingSystem.IsLinux()) if (OperatingSystem.IsMacOS() || OperatingSystem.IsLinux())
@ -592,6 +595,8 @@ namespace Ryujinx.Headless.SDL2
_window = window; _window = window;
_window.IsFullscreen = options.IsFullscreen;
_emulationContext = InitializeEmulationContext(window, renderer, options); _emulationContext = InitializeEmulationContext(window, renderer, options);
SystemVersion firmwareVersion = _contentManager.GetCurrentFirmwareVersion(); SystemVersion firmwareVersion = _contentManager.GetCurrentFirmwareVersion();

View file

@ -55,6 +55,7 @@ namespace Ryujinx.Headless.SDL2
public IHostUiTheme HostUiTheme { get; } public IHostUiTheme HostUiTheme { get; }
public int Width { get; private set; } public int Width { get; private set; }
public int Height { get; private set; } public int Height { get; private set; }
public bool IsFullscreen { get; set; }
protected SDL2MouseDriver MouseDriver; protected SDL2MouseDriver MouseDriver;
private readonly InputManager _inputManager; private readonly InputManager _inputManager;
@ -158,7 +159,9 @@ namespace Ryujinx.Headless.SDL2
string titleIdSection = string.IsNullOrWhiteSpace(activeProcess.ProgramIdText) ? string.Empty : $" ({activeProcess.ProgramIdText.ToUpper()})"; string titleIdSection = string.IsNullOrWhiteSpace(activeProcess.ProgramIdText) ? string.Empty : $" ({activeProcess.ProgramIdText.ToUpper()})";
string titleArchSection = activeProcess.Is64Bit ? " (64-bit)" : " (32-bit)"; string titleArchSection = activeProcess.Is64Bit ? " (64-bit)" : " (32-bit)";
WindowHandle = SDL_CreateWindow($"Ryujinx {Program.Version}{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, DefaultWidth, DefaultHeight, DefaultFlags | GetWindowFlags()); SDL_WindowFlags fullscreenFlag = IsFullscreen ? SDL_WindowFlags.SDL_WINDOW_FULLSCREEN_DESKTOP : 0;
WindowHandle = SDL_CreateWindow($"Ryujinx {Program.Version}{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, DefaultWidth, DefaultHeight, DefaultFlags | fullscreenFlag | GetWindowFlags());
if (WindowHandle == IntPtr.Zero) if (WindowHandle == IntPtr.Zero)
{ {
@ -185,10 +188,16 @@ namespace Ryujinx.Headless.SDL2
switch (evnt.window.windowEvent) switch (evnt.window.windowEvent)
{ {
case SDL_WindowEventID.SDL_WINDOWEVENT_SIZE_CHANGED: case SDL_WindowEventID.SDL_WINDOWEVENT_SIZE_CHANGED:
// Unlike on Windows, this event fires on macOS when triggering fullscreen mode.
// And promptly crashes the process because `Renderer?.window.SetSize` is undefined.
// As we don't need this to fire in either case we can test for isFullscreen.
if (!IsFullscreen)
{
Width = evnt.window.data1; Width = evnt.window.data1;
Height = evnt.window.data2; Height = evnt.window.data2;
Renderer?.Window.SetSize(Width, Height); Renderer?.Window.SetSize(Width, Height);
MouseDriver.SetClientSize(Width, Height); MouseDriver.SetClientSize(Width, Height);
}
break; break;
case SDL_WindowEventID.SDL_WINDOWEVENT_CLOSE: case SDL_WindowEventID.SDL_WINDOWEVENT_CLOSE: