diff --git a/Source/Core/Core/Config/MainSettings.cpp b/Source/Core/Core/Config/MainSettings.cpp index 2365db135f..6715a2a877 100644 --- a/Source/Core/Core/Config/MainSettings.cpp +++ b/Source/Core/Core/Config/MainSettings.cpp @@ -123,7 +123,7 @@ const Info MAIN_RENDER_WINDOW_HEIGHT{{System::Main, "Display", "RenderWindo const Info MAIN_RENDER_WINDOW_AUTOSIZE{{System::Main, "Display", "RenderWindowAutoSize"}, false}; const Info MAIN_KEEP_WINDOW_ON_TOP{{System::Main, "Display", "KeepWindowOnTop"}, false}; -const Info MAIN_DISABLE_SCREENSAVER{{System::Main, "Display", "DisableScreenSaver"}, false}; +const Info MAIN_DISABLE_SCREENSAVER{{System::Main, "Display", "DisableScreenSaver"}, true}; // Main.DSP diff --git a/Source/Core/DolphinNoGUI/PlatformWin32.cpp b/Source/Core/DolphinNoGUI/PlatformWin32.cpp index b9331f56ab..75d30b8b2c 100644 --- a/Source/Core/DolphinNoGUI/PlatformWin32.cpp +++ b/Source/Core/DolphinNoGUI/PlatformWin32.cpp @@ -107,6 +107,9 @@ bool PlatformWin32::Init() ProcessEvents(); } + if (Config::Get(Config::MAIN_DISABLE_SCREENSAVER)) + SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED); + UpdateWindowPosition(); return true; } diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp index 4e654c8b64..9a82a6bb53 100644 --- a/Source/Core/DolphinQt/MainWindow.cpp +++ b/Source/Core/DolphinQt/MainWindow.cpp @@ -737,7 +737,6 @@ void MainWindow::Play(const std::optional& savestate_path) if (selection) { StartGame(selection->GetFilePath(), ScanForSecondDisc::Yes, savestate_path); - EnableScreenSaver(false); } else { @@ -745,7 +744,6 @@ void MainWindow::Play(const std::optional& savestate_path) if (!default_path.isEmpty() && QFile::exists(default_path)) { StartGame(default_path, ScanForSecondDisc::Yes, savestate_path); - EnableScreenSaver(false); } else { @@ -776,7 +774,6 @@ void MainWindow::OnStopComplete() { m_stop_requested = false; HideRenderWidget(); - EnableScreenSaver(true); #ifdef USE_DISCORD_PRESENCE if (!m_netplay_dialog->isVisible()) Discord::UpdateDiscordPresence(); @@ -993,13 +990,6 @@ void MainWindow::StartGame(std::unique_ptr&& parameters) if (Config::Get(Config::MAIN_FULLSCREEN)) m_fullscreen_requested = true; - -#ifdef Q_OS_WIN - // Prevents Windows from sleeping, turning off the display, or idling - EXECUTION_STATE shouldScreenSave = - Config::Get(Config::MAIN_DISABLE_SCREENSAVER) ? ES_DISPLAY_REQUIRED : 0; - SetThreadExecutionState(ES_CONTINUOUS | shouldScreenSave | ES_SYSTEM_REQUIRED); -#endif } void MainWindow::SetFullScreenResolution(bool fullscreen) @@ -1304,6 +1294,10 @@ void MainWindow::NetPlayInit() Discord::InitNetPlayFunctionality(*m_netplay_discord); m_netplay_discord->Start(); #endif + connect(&Settings::Instance(), &Settings::ConfigChanged, this, + &MainWindow::UpdateScreenSaverInhibition); + connect(&Settings::Instance(), &Settings::EmulationStateChanged, this, + &MainWindow::UpdateScreenSaverInhibition); } bool MainWindow::NetPlayJoin() @@ -1435,13 +1429,16 @@ void MainWindow::NetPlayQuit() #endif } -void MainWindow::EnableScreenSaver(bool enable) +void MainWindow::UpdateScreenSaverInhibition() { + const bool inhibit = + Config::Get(Config::MAIN_DISABLE_SCREENSAVER) && (Core::GetState() == Core::State::Running); + #if defined(HAVE_XRANDR) && HAVE_XRANDR if (GetWindowSystemType() == WindowSystemType::X11) - UICommon::EnableScreenSaver(winId(), enable); + UICommon::InhibitScreenSaver(winId(), inhibit); #else - UICommon::EnableScreenSaver(enable); + UICommon::InhibitScreenSaver(inhibit); #endif } diff --git a/Source/Core/DolphinQt/MainWindow.h b/Source/Core/DolphinQt/MainWindow.h index 4a1c4833fd..77fea6839f 100644 --- a/Source/Core/DolphinQt/MainWindow.h +++ b/Source/Core/DolphinQt/MainWindow.h @@ -182,7 +182,7 @@ private: QStringList PromptFileNames(); - void EnableScreenSaver(bool enable); + void UpdateScreenSaverInhibition(); void OnStopComplete(); void dragEnterEvent(QDragEnterEvent* event) override; diff --git a/Source/Core/DolphinQt/Settings/InterfacePane.cpp b/Source/Core/DolphinQt/Settings/InterfacePane.cpp index 4b629686d2..145d532213 100644 --- a/Source/Core/DolphinQt/Settings/InterfacePane.cpp +++ b/Source/Core/DolphinQt/Settings/InterfacePane.cpp @@ -148,12 +148,14 @@ void InterfacePane::CreateUI() new QCheckBox(tr("Download Game Covers from GameTDB.com for Use in Grid Mode")); m_checkbox_show_debugging_ui = new QCheckBox(tr("Show Debugging UI")); m_checkbox_focused_hotkeys = new QCheckBox(tr("Hotkeys Require Window Focus")); + m_checkbox_disable_screensaver = new QCheckBox(tr("Inhibit Screensaver During Emulation")); groupbox_layout->addWidget(m_checkbox_use_builtin_title_database); groupbox_layout->addWidget(m_checkbox_use_userstyle); groupbox_layout->addWidget(m_checkbox_use_covers); groupbox_layout->addWidget(m_checkbox_show_debugging_ui); groupbox_layout->addWidget(m_checkbox_focused_hotkeys); + groupbox_layout->addWidget(m_checkbox_disable_screensaver); } void InterfacePane::CreateInGame() @@ -185,6 +187,7 @@ void InterfacePane::ConnectLayout() connect(m_checkbox_use_builtin_title_database, &QCheckBox::toggled, this, &InterfacePane::OnSaveConfig); connect(m_checkbox_use_covers, &QCheckBox::toggled, this, &InterfacePane::OnSaveConfig); + connect(m_checkbox_disable_screensaver, &QCheckBox::toggled, this, &InterfacePane::OnSaveConfig); connect(m_checkbox_show_debugging_ui, &QCheckBox::toggled, this, &InterfacePane::OnSaveConfig); connect(m_checkbox_focused_hotkeys, &QCheckBox::toggled, this, &InterfacePane::OnSaveConfig); connect(m_combobox_theme, qOverload(&QComboBox::currentIndexChanged), this, @@ -237,6 +240,7 @@ void InterfacePane::LoadConfig() m_checkbox_use_covers->setChecked(Config::Get(Config::MAIN_USE_GAME_COVERS)); m_checkbox_focused_hotkeys->setChecked(Config::Get(Config::MAIN_FOCUSED_HOTKEYS)); m_checkbox_hide_mouse->setChecked(Settings::Instance().GetHideCursor()); + m_checkbox_disable_screensaver->setChecked(Config::Get(Config::MAIN_DISABLE_SCREENSAVER)); } void InterfacePane::OnSaveConfig() @@ -280,6 +284,7 @@ void InterfacePane::OnSaveConfig() } Config::SetBase(Config::MAIN_FOCUSED_HOTKEYS, m_checkbox_focused_hotkeys->isChecked()); + Config::SetBase(Config::MAIN_DISABLE_SCREENSAVER, m_checkbox_disable_screensaver->isChecked()); settings.SaveSettings(); } diff --git a/Source/Core/DolphinQt/Settings/InterfacePane.h b/Source/Core/DolphinQt/Settings/InterfacePane.h index 22e07da7ca..d135de5992 100644 --- a/Source/Core/DolphinQt/Settings/InterfacePane.h +++ b/Source/Core/DolphinQt/Settings/InterfacePane.h @@ -37,6 +37,7 @@ private: QCheckBox* m_checkbox_show_debugging_ui; QCheckBox* m_checkbox_focused_hotkeys; QCheckBox* m_checkbox_use_covers; + QCheckBox* m_checkbox_disable_screensaver; QCheckBox* m_checkbox_confirm_on_stop; QCheckBox* m_checkbox_use_panic_handlers; diff --git a/Source/Core/UICommon/UICommon.cpp b/Source/Core/UICommon/UICommon.cpp index 84466cca0b..0d8c4f5d2b 100644 --- a/Source/Core/UICommon/UICommon.cpp +++ b/Source/Core/UICommon/UICommon.cpp @@ -397,57 +397,42 @@ bool TriggerSTMPowerEvent() } #if defined(HAVE_XRANDR) && HAVE_XRANDR -void EnableScreenSaver(Window win, bool enable) +void InhibitScreenSaver(Window win, bool inhibit) #else -void EnableScreenSaver(bool enable) +void InhibitScreenSaver(bool inhibit) #endif { // Inhibit the screensaver. Depending on the operating system this may also // disable low-power states and/or screen dimming. #if defined(HAVE_X11) && HAVE_X11 - if (Config::Get(Config::MAIN_DISABLE_SCREENSAVER)) - { - X11Utils::InhibitScreensaver(win, !enable); - } + X11Utils::InhibitScreensaver(win, inhibit); #endif #ifdef _WIN32 // Prevents Windows from sleeping, turning off the display, or idling - if (enable) - { - SetThreadExecutionState(ES_CONTINUOUS); - } - else - { - EXECUTION_STATE should_screen_save = - Config::Get(Config::MAIN_DISABLE_SCREENSAVER) ? ES_DISPLAY_REQUIRED : 0; - SetThreadExecutionState(ES_CONTINUOUS | should_screen_save | ES_SYSTEM_REQUIRED); - } + SetThreadExecutionState(ES_CONTINUOUS | + (inhibit ? (ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED) : 0)); #endif #ifdef __APPLE__ static IOPMAssertionID s_power_assertion = kIOPMNullAssertionID; - - if (Config::Get(Config::MAIN_DISABLE_SCREENSAVER)) + if (inhibit) { - if (enable) + CFStringRef reason_for_activity = CFSTR("Emulation Running"); + if (IOPMAssertionCreateWithName(kIOPMAssertionTypePreventUserIdleDisplaySleep, + kIOPMAssertionLevelOn, reason_for_activity, + &s_power_assertion) != kIOReturnSuccess) { - if (s_power_assertion != kIOPMNullAssertionID) - { - IOPMAssertionRelease(s_power_assertion); - s_power_assertion = kIOPMNullAssertionID; - } + s_power_assertion = kIOPMNullAssertionID; } - else + } + else + { + if (s_power_assertion != kIOPMNullAssertionID) { - CFStringRef reason_for_activity = CFSTR("Emulation Running"); - if (IOPMAssertionCreateWithName(kIOPMAssertionTypePreventUserIdleDisplaySleep, - kIOPMAssertionLevelOn, reason_for_activity, - &s_power_assertion) != kIOReturnSuccess) - { - s_power_assertion = kIOPMNullAssertionID; - } + IOPMAssertionRelease(s_power_assertion); + s_power_assertion = kIOPMNullAssertionID; } } #endif diff --git a/Source/Core/UICommon/UICommon.h b/Source/Core/UICommon/UICommon.h index 2722559a2a..830dc064e5 100644 --- a/Source/Core/UICommon/UICommon.h +++ b/Source/Core/UICommon/UICommon.h @@ -14,9 +14,9 @@ void Init(); void Shutdown(); #if defined(HAVE_XRANDR) && HAVE_XRANDR -void EnableScreenSaver(unsigned long win, bool enable); +void InhibitScreenSaver(unsigned long win, bool enable); #else -void EnableScreenSaver(bool enable); +void InhibitScreenSaver(bool enable); #endif // Calls std::locale::global, selecting a fallback locale if the