#include "display_sleep_control.h" #ifdef _WIN32 #include #elif defined(__APPLE__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wold-style-cast" #include #pragma GCC diagnostic pop static IOPMAssertionID s_pm_assertion = kIOPMNullAssertionID; #elif defined(HAVE_QTDBUS) #include #include #include #include #include "util/types.hpp" static u32 s_dbus_cookie = 0; #endif bool display_sleep_control_supported() { #if defined(_WIN32) || defined(__APPLE__) return true; #elif defined(HAVE_QTDBUS) for (const char* service : { "org.freedesktop.ScreenSaver", "org.mate.ScreenSaver" }) { QDBusInterface interface(service, "/ScreenSaver", service, QDBusConnection::sessionBus()); if (interface.isValid()) { return true; } } return false; #else return false; #endif } void enable_display_sleep() { if (!display_sleep_control_supported()) { return; } #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) { for (const char* service : { "org.freedesktop.ScreenSaver", "org.mate.ScreenSaver" }) { QDBusInterface interface(service, "/ScreenSaver", service, QDBusConnection::sessionBus()); if (interface.isValid()) { interface.call("UnInhibit", s_dbus_cookie); break; } } s_dbus_cookie = 0; } #endif } void disable_display_sleep() { if (!display_sleep_control_supported()) { return; } #ifdef _WIN32 SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED); #elif defined(__APPLE__) #pragma GCC diagnostic push // Necessary as some of those values are macro using old casts #pragma GCC diagnostic ignored "-Wold-style-cast" IOPMAssertionCreateWithName(kIOPMAssertionTypePreventUserIdleDisplaySleep, kIOPMAssertionLevelOn, CFSTR("Game running"), &s_pm_assertion); #pragma GCC diagnostic pop #elif defined(HAVE_QTDBUS) for (const char* service : { "org.freedesktop.ScreenSaver", "org.mate.ScreenSaver" }) { QDBusInterface interface(service, "/ScreenSaver", service, QDBusConnection::sessionBus()); if (interface.isValid()) { QDBusReply reply = interface.call("Inhibit", "rpcs3", "Game running"); if (reply.isValid()) { s_dbus_cookie = reply.value(); } break; } } #endif }