diff --git a/src/duckstation-nogui/drm_host_interface.cpp b/src/duckstation-nogui/drm_host_interface.cpp index af95ced68..578ee030d 100644 --- a/src/duckstation-nogui/drm_host_interface.cpp +++ b/src/duckstation-nogui/drm_host_interface.cpp @@ -58,7 +58,7 @@ void DRMHostInterface::FixIncompatibleSettings(bool display_osd_messages) g_settings.confim_power_off = false; } -bool DRMHostInterface::CreatePlatformWindow() +bool DRMHostInterface::CreatePlatformWindow(bool fullscreen) { Assert(!m_drm_display); m_drm_display = std::make_unique(); diff --git a/src/duckstation-nogui/drm_host_interface.h b/src/duckstation-nogui/drm_host_interface.h index 49c9247ef..b696245d3 100644 --- a/src/duckstation-nogui/drm_host_interface.h +++ b/src/duckstation-nogui/drm_host_interface.h @@ -22,7 +22,7 @@ public: protected: virtual void FixIncompatibleSettings(bool display_osd_messages) override; - bool CreatePlatformWindow() override; + bool CreatePlatformWindow(bool fullscreen) override; void DestroyPlatformWindow() override; std::optional GetPlatformWindowInfo() override; diff --git a/src/duckstation-nogui/nogui_host_interface.cpp b/src/duckstation-nogui/nogui_host_interface.cpp index 671262121..ec16dacd2 100644 --- a/src/duckstation-nogui/nogui_host_interface.cpp +++ b/src/duckstation-nogui/nogui_host_interface.cpp @@ -48,7 +48,8 @@ bool NoGUIHostInterface::Initialize() CreateImGuiContext(); - if (!CreatePlatformWindow()) + const bool start_fullscreen = m_command_line_flags.start_fullscreen || g_settings.start_fullscreen; + if (!CreatePlatformWindow(start_fullscreen)) { Log_ErrorPrintf("Failed to create platform window"); ImGui::DestroyContext(); @@ -264,12 +265,14 @@ bool NoGUIHostInterface::AcquireHostDisplay() if (needs_switch) { + const bool was_fullscreen = IsFullscreen(); + ImGui::EndFrame(); DestroyDisplay(); // We need to recreate the window, otherwise bad things happen... DestroyPlatformWindow(); - if (!CreatePlatformWindow()) + if (!CreatePlatformWindow(was_fullscreen)) Panic("Failed to recreate platform window on GPU renderer switch"); if (!CreateDisplay()) diff --git a/src/duckstation-nogui/nogui_host_interface.h b/src/duckstation-nogui/nogui_host_interface.h index 28b2c79bc..949779344 100644 --- a/src/duckstation-nogui/nogui_host_interface.h +++ b/src/duckstation-nogui/nogui_host_interface.h @@ -55,7 +55,7 @@ protected: void RequestExit() override; virtual void PollAndUpdate() override; - virtual bool CreatePlatformWindow() = 0; + virtual bool CreatePlatformWindow(bool fullscreen) = 0; virtual void DestroyPlatformWindow() = 0; virtual std::optional GetPlatformWindowInfo() = 0; void OnPlatformWindowResized(u32 new_width, u32 new_height, float new_scale); diff --git a/src/duckstation-nogui/sdl_host_interface.cpp b/src/duckstation-nogui/sdl_host_interface.cpp index 483fc10d4..7859f28ea 100644 --- a/src/duckstation-nogui/sdl_host_interface.cpp +++ b/src/duckstation-nogui/sdl_host_interface.cpp @@ -131,7 +131,7 @@ ALWAYS_INLINE static TinyString GetWindowTitle() return TinyString::FromFormat("DuckStation %s (%s)", g_scm_tag_str, g_scm_branch_str); } -bool SDLHostInterface::CreatePlatformWindow() +bool SDLHostInterface::CreatePlatformWindow(bool fullscreen) { // Create window. const u32 window_flags = SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI; @@ -165,8 +165,11 @@ bool SDLHostInterface::CreatePlatformWindow() SDL_FreeSurface(icon_surface); } - if (m_fullscreen) + if (fullscreen || m_fullscreen) + { SDL_SetWindowFullscreen(m_window, SDL_WINDOW_FULLSCREEN_DESKTOP); + m_fullscreen = true; + } ImGui_ImplSDL2_Init(m_window); diff --git a/src/duckstation-nogui/sdl_host_interface.h b/src/duckstation-nogui/sdl_host_interface.h index 2954a6075..91f4b9934 100644 --- a/src/duckstation-nogui/sdl_host_interface.h +++ b/src/duckstation-nogui/sdl_host_interface.h @@ -29,7 +29,7 @@ protected: std::optional GetHostKeyCode(const std::string_view key_code) const override; - bool CreatePlatformWindow() override; + bool CreatePlatformWindow(bool fullscreen) override; void DestroyPlatformWindow() override; std::optional GetPlatformWindowInfo() override; diff --git a/src/duckstation-nogui/win32_host_interface.cpp b/src/duckstation-nogui/win32_host_interface.cpp index 30fd41f75..f741b221d 100644 --- a/src/duckstation-nogui/win32_host_interface.cpp +++ b/src/duckstation-nogui/win32_host_interface.cpp @@ -57,7 +57,7 @@ bool Win32HostInterface::RegisterWindowClass() return true; } -bool Win32HostInterface::CreatePlatformWindow() +bool Win32HostInterface::CreatePlatformWindow(bool fullscreen) { m_hwnd = CreateWindowExW(WS_EX_CLIENTEDGE, WINDOW_CLASS_NAME, _T("DuckStation"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT, nullptr, nullptr, diff --git a/src/duckstation-nogui/win32_host_interface.h b/src/duckstation-nogui/win32_host_interface.h index c25a067ec..ee86f27f7 100644 --- a/src/duckstation-nogui/win32_host_interface.h +++ b/src/duckstation-nogui/win32_host_interface.h @@ -16,7 +16,7 @@ public: static std::unique_ptr Create(); protected: - bool CreatePlatformWindow() override; + bool CreatePlatformWindow(bool fullscreen) override; void DestroyPlatformWindow() override; std::optional GetPlatformWindowInfo() override; diff --git a/src/frontend-common/common_host_interface.cpp b/src/frontend-common/common_host_interface.cpp index 007a24b43..81649479b 100644 --- a/src/frontend-common/common_host_interface.cpp +++ b/src/frontend-common/common_host_interface.cpp @@ -304,6 +304,7 @@ bool CommonHostInterface::ParseCommandLineParameters(int argc, char* argv[], else if (CHECK_ARG("-fullscreen")) { Log_InfoPrintf("Going fullscreen after booting."); + m_command_line_flags.start_fullscreen = true; force_fullscreen = true; continue; } diff --git a/src/frontend-common/common_host_interface.h b/src/frontend-common/common_host_interface.h index b7f850dab..dce2e05ac 100644 --- a/src/frontend-common/common_host_interface.h +++ b/src/frontend-common/common_host_interface.h @@ -405,6 +405,9 @@ protected: // disable controller interface (buggy devices with SDL) BitField disable_controller_interface; + + // starting fullscreen (outside of boot options) + BitField start_fullscreen; } m_command_line_flags = {}; private: