From d83ecb05828b41d2d8ba86bc808bdedc0d309126 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Tue, 17 Jun 2025 18:36:31 +1000 Subject: [PATCH] Qt: Fix return to desktop mode with -nogui -bigpicture --- src/duckstation-qt/qthost.cpp | 28 +++++++++++++++++++++++++++- src/duckstation-qt/qthost.h | 1 + 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/duckstation-qt/qthost.cpp b/src/duckstation-qt/qthost.cpp index 193043876..3f65cabd1 100644 --- a/src/duckstation-qt/qthost.cpp +++ b/src/duckstation-qt/qthost.cpp @@ -739,6 +739,32 @@ void EmuThread::stopFullscreenUI() } } +void EmuThread::exitFullscreenUI() +{ + if (!isCurrentThread()) + { + QMetaObject::invokeMethod(this, &EmuThread::exitFullscreenUI, Qt::QueuedConnection); + return; + } + + const bool was_in_nogui_mode = std::exchange(s_nogui_mode, false); + + // force a return to main window before exiting, otherwise qt will terminate the application + if (!m_is_rendering_to_main) + { + m_is_fullscreen = false; + m_is_rendering_to_main = true; + GPUThread::UpdateDisplayWindow(false); + } + + // then stop as normal + stopFullscreenUI(); + + // if we were in nogui mode, the game list won't have been populated yet. do it now. + if (was_in_nogui_mode) + g_main_window->refreshGameList(false); +} + void EmuThread::bootSystem(std::shared_ptr params) { if (!isCurrentThread()) @@ -2541,7 +2567,7 @@ void Host::RequestExitApplication(bool allow_confirm) void Host::RequestExitBigPicture() { - g_emu_thread->stopFullscreenUI(); + g_emu_thread->exitFullscreenUI(); } std::optional Host::GetTopLevelWindowInfo() diff --git a/src/duckstation-qt/qthost.h b/src/duckstation-qt/qthost.h index 61265dec2..f077ecac4 100644 --- a/src/duckstation-qt/qthost.h +++ b/src/duckstation-qt/qthost.h @@ -186,6 +186,7 @@ public Q_SLOTS: void closeInputSources(); void startFullscreenUI(); void stopFullscreenUI(); + void exitFullscreenUI(); void refreshAchievementsAllProgress(); void bootSystem(std::shared_ptr params); void resumeSystemFromMostRecentState();