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/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