mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-09-29 07:21:20 +00:00
Add option for preventing display sleep (#5783)
Adds support for preventing the display from sleeping while a game is running. Supports Windows, Linux (with the org.freedesktop.ScreenSaver D-Bus service), and macOS.
This commit is contained in:
parent
07022fd3b6
commit
3ad743ecaa
@ -38,6 +38,7 @@ add_subdirectory(rpcs3qt)
|
|||||||
set(RPCS3_SRC
|
set(RPCS3_SRC
|
||||||
basic_keyboard_handler.cpp
|
basic_keyboard_handler.cpp
|
||||||
basic_mouse_handler.cpp
|
basic_mouse_handler.cpp
|
||||||
|
display_sleep_control.cpp
|
||||||
ds3_pad_handler.cpp
|
ds3_pad_handler.cpp
|
||||||
ds4_pad_handler.cpp
|
ds4_pad_handler.cpp
|
||||||
evdev_joystick_handler.cpp
|
evdev_joystick_handler.cpp
|
||||||
|
@ -2,10 +2,6 @@
|
|||||||
#include "PadHandler.h"
|
#include "PadHandler.h"
|
||||||
#include "pad_thread.h"
|
#include "pad_thread.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <Windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
cfg_input g_cfg_input;
|
cfg_input g_cfg_input;
|
||||||
|
|
||||||
PadHandlerBase::PadHandlerBase(pad_handler type) : m_type(type)
|
PadHandlerBase::PadHandlerBase(pad_handler type) : m_type(type)
|
||||||
@ -621,16 +617,5 @@ void PadHandlerBase::ThreadProc()
|
|||||||
get_mapping(device, pad);
|
get_mapping(device, pad);
|
||||||
get_extended_info(device, pad);
|
get_extended_info(device, pad);
|
||||||
apply_pad_data(device, pad);
|
apply_pad_data(device, pad);
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
for (const auto& btn : pad->m_buttons)
|
|
||||||
{
|
|
||||||
if (pad->m_buttons[i].m_pressed)
|
|
||||||
{
|
|
||||||
SetThreadExecutionState(ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,8 @@
|
|||||||
|
|
||||||
#include "Utilities/JIT.h"
|
#include "Utilities/JIT.h"
|
||||||
|
|
||||||
|
#include "display_sleep_control.h"
|
||||||
|
|
||||||
#if defined(_WIN32) || defined(HAVE_VULKAN)
|
#if defined(_WIN32) || defined(HAVE_VULKAN)
|
||||||
#include "Emu/RSX/VK/VulkanAPI.h"
|
#include "Emu/RSX/VK/VulkanAPI.h"
|
||||||
#endif
|
#endif
|
||||||
@ -1655,6 +1657,11 @@ void Emulator::Run()
|
|||||||
|
|
||||||
idm::select<named_thread<ppu_thread>>(on_select);
|
idm::select<named_thread<ppu_thread>>(on_select);
|
||||||
idm::select<named_thread<spu_thread>>(on_select);
|
idm::select<named_thread<spu_thread>>(on_select);
|
||||||
|
|
||||||
|
if (g_cfg.misc.prevent_display_sleep)
|
||||||
|
{
|
||||||
|
disable_display_sleep();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Emulator::Pause()
|
bool Emulator::Pause()
|
||||||
@ -1682,6 +1689,12 @@ bool Emulator::Pause()
|
|||||||
|
|
||||||
idm::select<named_thread<ppu_thread>>(on_select);
|
idm::select<named_thread<ppu_thread>>(on_select);
|
||||||
idm::select<named_thread<spu_thread>>(on_select);
|
idm::select<named_thread<spu_thread>>(on_select);
|
||||||
|
|
||||||
|
if (g_cfg.misc.prevent_display_sleep)
|
||||||
|
{
|
||||||
|
enable_display_sleep();
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1747,6 +1760,11 @@ void Emulator::Resume()
|
|||||||
idm::select<named_thread<ppu_thread>>(on_select);
|
idm::select<named_thread<ppu_thread>>(on_select);
|
||||||
idm::select<named_thread<spu_thread>>(on_select);
|
idm::select<named_thread<spu_thread>>(on_select);
|
||||||
GetCallbacks().on_resume();
|
GetCallbacks().on_resume();
|
||||||
|
|
||||||
|
if (g_cfg.misc.prevent_display_sleep)
|
||||||
|
{
|
||||||
|
disable_display_sleep();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Emulator::Stop(bool restart)
|
void Emulator::Stop(bool restart)
|
||||||
@ -1818,6 +1836,11 @@ void Emulator::Stop(bool restart)
|
|||||||
klic.clear();
|
klic.clear();
|
||||||
|
|
||||||
m_force_boot = false;
|
m_force_boot = false;
|
||||||
|
|
||||||
|
if (g_cfg.misc.prevent_display_sleep)
|
||||||
|
{
|
||||||
|
enable_display_sleep();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string cfg_root::node_vfs::get(const cfg::string& _cfg, const char* _def) const
|
std::string cfg_root::node_vfs::get(const cfg::string& _cfg, const char* _def) const
|
||||||
|
@ -612,6 +612,7 @@ struct cfg_root : cfg::node
|
|||||||
cfg::_bool autostart{this, "Automatically start games after boot", true};
|
cfg::_bool autostart{this, "Automatically start games after boot", true};
|
||||||
cfg::_bool autoexit{this, "Exit RPCS3 when process finishes"};
|
cfg::_bool autoexit{this, "Exit RPCS3 when process finishes"};
|
||||||
cfg::_bool start_fullscreen{ this, "Start games in fullscreen mode" };
|
cfg::_bool start_fullscreen{ this, "Start games in fullscreen mode" };
|
||||||
|
cfg::_bool prevent_display_sleep{ this, "Prevent display sleep while running games", true};
|
||||||
cfg::_bool show_fps_in_title{ this, "Show FPS counter in window title", true};
|
cfg::_bool show_fps_in_title{ this, "Show FPS counter in window title", true};
|
||||||
cfg::_bool show_trophy_popups{ this, "Show trophy popups", true};
|
cfg::_bool show_trophy_popups{ this, "Show trophy popups", true};
|
||||||
cfg::_bool show_shader_compilation_hint{ this, "Show shader compilation hint", true };
|
cfg::_bool show_shader_compilation_hint{ this, "Show shader compilation hint", true };
|
||||||
|
@ -80,6 +80,7 @@
|
|||||||
"exitOnStop": "Automatically close RPCS3 when closing a game, or when a game closes itself.",
|
"exitOnStop": "Automatically close RPCS3 when closing a game, or when a game closes itself.",
|
||||||
"alwaysStart": "Leave this enabled unless you are a developer.",
|
"alwaysStart": "Leave this enabled unless you are a developer.",
|
||||||
"startGameFullscreen": "Automatically puts the game window in fullscreen.\nDouble click on the game window or press alt+enter to toggle fullscreen and windowed mode.",
|
"startGameFullscreen": "Automatically puts the game window in fullscreen.\nDouble click on the game window or press alt+enter to toggle fullscreen and windowed mode.",
|
||||||
|
"preventDisplaySleep": "Prevent the display from sleeping while a game is running.\nThis requires the org.freedesktop.ScreenSaver D-Bus service on Linux.\nThis option will be disabled if the current platform does not support display sleep control.",
|
||||||
"showFPSInTitle": "Shows the frame rate in the game window title. May cause buggy or outdated recording software to not notice RPCS3.",
|
"showFPSInTitle": "Shows the frame rate in the game window title. May cause buggy or outdated recording software to not notice RPCS3.",
|
||||||
"gs_resizeOnBoot": "Automatically resizes the game window on boot.\nThis does not change the internal game resolution.",
|
"gs_resizeOnBoot": "Automatically resizes the game window on boot.\nThis does not change the internal game resolution.",
|
||||||
"showTrophyPopups": "Show trophy pop-ups when a trophy is unlocked.",
|
"showTrophyPopups": "Show trophy pop-ups when a trophy is unlocked.",
|
||||||
|
70
rpcs3/display_sleep_control.cpp
Normal file
70
rpcs3/display_sleep_control.cpp
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#include "display_sleep_control.h"
|
||||||
|
|
||||||
|
#include "Emu/System.h"
|
||||||
|
#include "Utilities/Log.h"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
#include <IOKit/pwr_mgt/IOPMLib.h>
|
||||||
|
|
||||||
|
static IOPMAssertionID s_pm_assertion = kIOPMNullAssertionID;
|
||||||
|
|
||||||
|
#elif defined(HAVE_QTDBUS)
|
||||||
|
#include <QtDBus/QDBusConnection>
|
||||||
|
#include <QtDBus/QDBusInterface>
|
||||||
|
#include <QtDBus/QDBusMessage>
|
||||||
|
#include <QDBusReply>
|
||||||
|
|
||||||
|
static u32 s_dbus_cookie = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool display_sleep_control_supported()
|
||||||
|
{
|
||||||
|
#if defined(_WIN32) || defined(__APPLE__)
|
||||||
|
return true;
|
||||||
|
#elif defined(HAVE_QTDBUS)
|
||||||
|
QDBusInterface interface("org.freedesktop.ScreenSaver", "/ScreenSaver", "org.freedesktop.ScreenSaver", QDBusConnection::sessionBus());
|
||||||
|
return interface.isValid();
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void enable_display_sleep()
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
SetThreadExecutionState(ES_CONTINUOUS);
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
if (s_pm_assertion != kIOPMNullAssertionID)
|
||||||
|
{
|
||||||
|
IOPMAssertionRelease(s_pm_assertion);
|
||||||
|
s_pm_assertion = kIOPMNullAssertionID;
|
||||||
|
}
|
||||||
|
#elif defined(HAVE_QTDBUS)
|
||||||
|
if (s_dbus_cookie != 0)
|
||||||
|
{
|
||||||
|
QDBusInterface interface("org.freedesktop.ScreenSaver", "/ScreenSaver", "org.freedesktop.ScreenSaver", QDBusConnection::sessionBus());
|
||||||
|
interface.call("UnInhibit", s_dbus_cookie);
|
||||||
|
s_dbus_cookie = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void disable_display_sleep()
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED);
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
IOPMAssertionCreateWithName(kIOPMAssertionTypePreventUserIdleDisplaySleep, kIOPMAssertionLevelOn, CFSTR("Game running"), &s_pm_assertion);
|
||||||
|
#elif defined(HAVE_QTDBUS)
|
||||||
|
QDBusInterface interface("org.freedesktop.ScreenSaver", "/ScreenSaver", "org.freedesktop.ScreenSaver", QDBusConnection::sessionBus());
|
||||||
|
QDBusReply<u32> reply = interface.call("Inhibit", "rpcs3", "Game running");
|
||||||
|
if (reply.isValid())
|
||||||
|
{
|
||||||
|
s_dbus_cookie = reply.value();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
5
rpcs3/display_sleep_control.h
Normal file
5
rpcs3/display_sleep_control.h
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
bool display_sleep_control_supported();
|
||||||
|
void enable_display_sleep();
|
||||||
|
void disable_display_sleep();
|
@ -332,6 +332,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="basic_keyboard_handler.cpp" />
|
<ClCompile Include="basic_keyboard_handler.cpp" />
|
||||||
<ClCompile Include="basic_mouse_handler.cpp" />
|
<ClCompile Include="basic_mouse_handler.cpp" />
|
||||||
|
<ClCompile Include="display_sleep_control.cpp" />
|
||||||
<ClCompile Include="ds3_pad_handler.cpp" />
|
<ClCompile Include="ds3_pad_handler.cpp" />
|
||||||
<ClCompile Include="ds4_pad_handler.cpp" />
|
<ClCompile Include="ds4_pad_handler.cpp" />
|
||||||
<ClCompile Include="evdev_joystick_handler.cpp" />
|
<ClCompile Include="evdev_joystick_handler.cpp" />
|
||||||
@ -1207,6 +1208,7 @@
|
|||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug - LLVM|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug - LLVM|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
|
<ClInclude Include="display_sleep_control.h" />
|
||||||
<ClInclude Include="ds3_pad_handler.h" />
|
<ClInclude Include="ds3_pad_handler.h" />
|
||||||
<ClInclude Include="ds4_pad_handler.h" />
|
<ClInclude Include="ds4_pad_handler.h" />
|
||||||
<ClInclude Include="evdev_joystick_handler.h" />
|
<ClInclude Include="evdev_joystick_handler.h" />
|
||||||
@ -2110,4 +2112,4 @@
|
|||||||
<UserProperties MocDir=".\QTGeneratedFiles\$(ConfigurationName)" UicDir=".\QTGeneratedFiles" RccDir=".\QTGeneratedFiles" Qt5Version_x0020_x64="$(DefaultQtVersion)" />
|
<UserProperties MocDir=".\QTGeneratedFiles\$(ConfigurationName)" UicDir=".\QTGeneratedFiles" RccDir=".\QTGeneratedFiles" Qt5Version_x0020_x64="$(DefaultQtVersion)" />
|
||||||
</VisualStudio>
|
</VisualStudio>
|
||||||
</ProjectExtensions>
|
</ProjectExtensions>
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -127,6 +127,7 @@ public:
|
|||||||
ExitRPCS3OnFinish,
|
ExitRPCS3OnFinish,
|
||||||
StartOnBoot,
|
StartOnBoot,
|
||||||
StartGameFullscreen,
|
StartGameFullscreen,
|
||||||
|
PreventDisplaySleep,
|
||||||
ShowFPSInTitle,
|
ShowFPSInTitle,
|
||||||
ShowTrophyPopups,
|
ShowTrophyPopups,
|
||||||
ShowWelcomeScreen,
|
ShowWelcomeScreen,
|
||||||
@ -358,6 +359,7 @@ private:
|
|||||||
{ ExitRPCS3OnFinish, { "Miscellaneous", "Exit RPCS3 when process finishes" }},
|
{ ExitRPCS3OnFinish, { "Miscellaneous", "Exit RPCS3 when process finishes" }},
|
||||||
{ StartOnBoot, { "Miscellaneous", "Automatically start games after boot" }},
|
{ StartOnBoot, { "Miscellaneous", "Automatically start games after boot" }},
|
||||||
{ StartGameFullscreen, { "Miscellaneous", "Start games in fullscreen mode"}},
|
{ StartGameFullscreen, { "Miscellaneous", "Start games in fullscreen mode"}},
|
||||||
|
{ PreventDisplaySleep, { "Miscellaneous", "Prevent display sleep while running games"}},
|
||||||
{ ShowFPSInTitle, { "Miscellaneous", "Show FPS counter in window title"}},
|
{ ShowFPSInTitle, { "Miscellaneous", "Show FPS counter in window title"}},
|
||||||
{ ShowTrophyPopups, { "Miscellaneous", "Show trophy popups"}},
|
{ ShowTrophyPopups, { "Miscellaneous", "Show trophy popups"}},
|
||||||
{ ShowWelcomeScreen, { "Miscellaneous", "Show Welcome Screen"}},
|
{ ShowWelcomeScreen, { "Miscellaneous", "Show Welcome Screen"}},
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QScreen>
|
#include <QScreen>
|
||||||
|
|
||||||
|
#include "display_sleep_control.h"
|
||||||
#include "qt_utils.h"
|
#include "qt_utils.h"
|
||||||
#include "settings_dialog.h"
|
#include "settings_dialog.h"
|
||||||
#include "ui_settings_dialog.h"
|
#include "ui_settings_dialog.h"
|
||||||
@ -1142,6 +1143,10 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> guiSettings, std:
|
|||||||
xemu_settings->EnhanceCheckBox(ui->startGameFullscreen, emu_settings::StartGameFullscreen);
|
xemu_settings->EnhanceCheckBox(ui->startGameFullscreen, emu_settings::StartGameFullscreen);
|
||||||
SubscribeTooltip(ui->startGameFullscreen, json_emu_misc["startGameFullscreen"].toString());
|
SubscribeTooltip(ui->startGameFullscreen, json_emu_misc["startGameFullscreen"].toString());
|
||||||
|
|
||||||
|
xemu_settings->EnhanceCheckBox(ui->preventDisplaySleep, emu_settings::PreventDisplaySleep);
|
||||||
|
SubscribeTooltip(ui->preventDisplaySleep, json_emu_misc["preventDisplaySleep"].toString());
|
||||||
|
ui->preventDisplaySleep->setEnabled(display_sleep_control_supported());
|
||||||
|
|
||||||
xemu_settings->EnhanceCheckBox(ui->showFPSInTitle, emu_settings::ShowFPSInTitle);
|
xemu_settings->EnhanceCheckBox(ui->showFPSInTitle, emu_settings::ShowFPSInTitle);
|
||||||
SubscribeTooltip(ui->showFPSInTitle, json_emu_misc["showFPSInTitle"].toString());
|
SubscribeTooltip(ui->showFPSInTitle, json_emu_misc["showFPSInTitle"].toString());
|
||||||
|
|
||||||
|
@ -1899,6 +1899,13 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="preventDisplaySleep">
|
||||||
|
<property name="text">
|
||||||
|
<string>Prevent display sleep while running games</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="showFPSInTitle">
|
<widget class="QCheckBox" name="showFPSInTitle">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
|
Loading…
Reference in New Issue
Block a user