From 75fbb3d55167ed6db64a59341db3c1c773b7e35f Mon Sep 17 00:00:00 2001 From: Megamouse Date: Mon, 13 Feb 2023 22:13:31 +0100 Subject: [PATCH] Qt: save last gs_frame screen and re-use it in no-gui mode --- rpcs3/rpcs3qt/gs_frame.cpp | 16 ++++++++++++++++ rpcs3/rpcs3qt/gui_application.cpp | 19 +++++++++++++++---- rpcs3/rpcs3qt/gui_settings.h | 1 + 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/rpcs3/rpcs3qt/gs_frame.cpp b/rpcs3/rpcs3qt/gs_frame.cpp index 95ef424890..6abf71b72e 100644 --- a/rpcs3/rpcs3qt/gs_frame.cpp +++ b/rpcs3/rpcs3qt/gs_frame.cpp @@ -146,6 +146,22 @@ gs_frame::gs_frame(QScreen* screen, const QRect& geometry, const QIcon& appIcon, gs_frame::~gs_frame() { g_user_asked_for_screenshot = false; + + // Save active screen to gui settings + const QScreen* current_screen = screen(); + const QList screens = QGuiApplication::screens(); + int screen_index = 0; + + for (int i = 0; i < screens.count(); i++) + { + if (current_screen == ::at32(screens, i)) + { + screen_index = i; + break; + } + } + + m_gui_settings->SetValue(gui::gs_screen, screen_index); } void gs_frame::paintEvent(QPaintEvent *event) diff --git a/rpcs3/rpcs3qt/gui_application.cpp b/rpcs3/rpcs3qt/gui_application.cpp index 56bd944be9..e538836484 100644 --- a/rpcs3/rpcs3qt/gui_application.cpp +++ b/rpcs3/rpcs3qt/gui_application.cpp @@ -291,13 +291,23 @@ std::unique_ptr gui_application::get_gs_frame() QScreen* screen = nullptr; QRect base_geometry{}; - if (m_game_screen_index >= 0) + // Use screen index set by CLI argument + int screen_index = m_game_screen_index; + + // In no-gui mode: use last used screen if no CLI index was set + if (screen_index < 0 && !m_main_window) + { + screen_index = m_gui_settings->GetValue(gui::gs_screen).toInt(); + } + + // Try to find the specified screen + if (screen_index >= 0) { const QList available_screens = screens(); - if (m_game_screen_index < available_screens.count()) + if (screen_index < available_screens.count()) { - screen = ::at32(available_screens, m_game_screen_index); + screen = ::at32(available_screens, screen_index); if (screen) { @@ -307,10 +317,11 @@ std::unique_ptr gui_application::get_gs_frame() if (!screen) { - gui_log.error("The selected game screen with index %d is not available (available screens: %d)", m_game_screen_index, available_screens.count()); + gui_log.error("The selected game screen with index %d is not available (available screens: %d)", screen_index, available_screens.count()); } } + // Fallback to the screen of the main window. Use the primary screen as last resort. if (!screen) { screen = m_main_window ? m_main_window->screen() : primaryScreen(); diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h index 73b396a9a1..9e52fd17f0 100644 --- a/rpcs3/rpcs3qt/gui_settings.h +++ b/rpcs3/rpcs3qt/gui_settings.h @@ -221,6 +221,7 @@ namespace gui const gui_save gs_lockMouseFs = gui_save(gs_frame, "lockMouseInFullscreen", true); const gui_save gs_resize = gui_save(gs_frame, "resize", false); const gui_save gs_resize_manual = gui_save(gs_frame, "resizeManual", true); + const gui_save gs_screen = gui_save(gs_frame, "screen", 0); const gui_save gs_width = gui_save(gs_frame, "width", 1280); const gui_save gs_height = gui_save(gs_frame, "height", 720); const gui_save gs_hideMouseIdle = gui_save(gs_frame, "hideMouseOnIdle", false);