From 42dd7e6ea806e42be5ac665e28ab7a154be0d682 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 27 Jan 2019 13:19:27 +0000 Subject: [PATCH] Add initial screensaver inhibiting code --- daemon/dbus_messaging.c | 65 +++++++++++++++++++++++++++++++++++++++++ daemon/dbus_messaging.h | 5 ++++ daemon/gamemode.c | 7 +++++ 3 files changed, 77 insertions(+) diff --git a/daemon/dbus_messaging.c b/daemon/dbus_messaging.c index 629bb8b..cf21358 100644 --- a/daemon/dbus_messaging.c +++ b/daemon/dbus_messaging.c @@ -187,3 +187,68 @@ void game_mode_context_loop(GameModeContext *context) } } } + +/** + * Attempts to inhibit the screensaver + * Uses the "org.freedesktop.ScreenSaver" interface + */ +static unsigned int screensaver_inhibit_cookie = 0; +int game_mode_inhibit_screensaver(bool inhibit) +{ + const char *service = "org.freedesktop.ScreenSaver"; + const char *object_path = "/org/freedesktop/ScreenSaver"; + const char *interface = service; + const char *function = inhibit ? "Inhibit" : "UnInhibit"; + + sd_bus_message *msg = NULL; + sd_bus *bus = NULL; + + int result = -1; + + // Open the user bus + int ret = sd_bus_open_user(&bus); + if (ret < 0) { + LOG_ERROR("Could not connect to user bus: %s\n", strerror(-ret)); + } else { + if (inhibit) { + ret = sd_bus_call_method(bus, + service, + object_path, + interface, + function, + NULL, + &msg, + "s", + "GameMode", + "s", + "GameMode Activated", + "u", + &screensaver_inhibit_cookie); + + } else { + ret = sd_bus_call_method(bus, + service, + object_path, + interface, + function, + NULL, + &msg, + "u", + screensaver_inhibit_cookie); + } + if (ret < 0) { + LOG_ERROR("Could not call %s on %s: %s\n", function, service, strerror(-ret)); + } else { + // Read the reply + ret = sd_bus_message_read(msg, "i", &result); + if (ret < 0) { + LOG_ERROR("Failure to parse response from %s on %s: %s\n", + function, + service, + strerror(-ret)); + } + } + } + + return result; +} diff --git a/daemon/dbus_messaging.h b/daemon/dbus_messaging.h index fa845be..2ab8eac 100644 --- a/daemon/dbus_messaging.h +++ b/daemon/dbus_messaging.h @@ -39,3 +39,8 @@ POSSIBILITY OF SUCH DAMAGE. * Run the main D-BUS loop "forever" */ void game_mode_context_loop(GameModeContext *context); + +/** + * Inhibit the screensaver + */ +int game_mode_inhibit_screensaver(bool inhibit); diff --git a/daemon/gamemode.c b/daemon/gamemode.c index c844897..52a82f9 100644 --- a/daemon/gamemode.c +++ b/daemon/gamemode.c @@ -33,6 +33,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "gamemode.h" #include "daemon_config.h" +#include "dbus_messaging.h" #include "governors-query.h" #include "governors.h" #include "helpers.h" @@ -202,6 +203,9 @@ static void game_mode_context_enter(GameModeContext *self) memset(self->initial_cpu_mode, 0, sizeof(self->initial_cpu_mode)); } } + + /* Inhibit the screensaver */ + game_mode_inhibit_screensaver(true); } /** @@ -215,6 +219,9 @@ static void game_mode_context_leave(GameModeContext *self) LOG_MSG("Leaving Game Mode...\n"); sd_notifyf(0, "STATUS=%sGameMode is currently deactivated.%s\n", "\x1B[1;36m", "\x1B[0m"); + /* UnInhibit the screensaver */ + game_mode_inhibit_screensaver(false); + /* Reset the governer state back to initial */ if (self->initial_cpu_mode[0] != '\0') { /* Choose the governor to reset to, using the config to override */