From 42dd7e6ea806e42be5ac665e28ab7a154be0d682 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 27 Jan 2019 13:19:27 +0000 Subject: [PATCH 1/2] 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 */ From b4ba947255c8c4e335cb35a88cc9a86790cf74e9 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 27 Jan 2019 14:17:38 +0000 Subject: [PATCH 2/2] Fix up calling screensaver, now appears to work --- daemon/dbus_messaging.c | 84 +++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/daemon/dbus_messaging.c b/daemon/dbus_messaging.c index cf21358..c411e0a 100644 --- a/daemon/dbus_messaging.c +++ b/daemon/dbus_messaging.c @@ -197,11 +197,13 @@ 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 *interface = "org.freedesktop.ScreenSaver"; const char *function = inhibit ? "Inhibit" : "UnInhibit"; sd_bus_message *msg = NULL; sd_bus *bus = NULL; + sd_bus_error err; + memset(&err, 0, sizeof(sd_bus_error)); int result = -1; @@ -209,45 +211,55 @@ int game_mode_inhibit_screensaver(bool inhibit) 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); + return -1; + } - } else { - ret = sd_bus_call_method(bus, - service, - object_path, - interface, - function, - NULL, - &msg, - "u", - screensaver_inhibit_cookie); - } + if (inhibit) { + ret = sd_bus_call_method(bus, + service, + object_path, + interface, + function, + &err, + &msg, + "ss", + "com.feralinteractive.GameMode", + "GameMode Activated"); + } else { + ret = sd_bus_call_method(bus, + service, + object_path, + interface, + function, + &err, + &msg, + "u", + screensaver_inhibit_cookie); + } + + if (ret < 0) { + LOG_ERROR( + "Could not call %s on %s: %s\n" + "\t%s\n" + "\t%s\n", + function, + service, + strerror(-ret), + err.name, + err.message); + } else if (inhibit) { + // Read the reply + ret = sd_bus_message_read(msg, "u", &screensaver_inhibit_cookie); if (ret < 0) { - LOG_ERROR("Could not call %s on %s: %s\n", function, service, strerror(-ret)); + LOG_ERROR("Failure to parse response from %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)); - } + result = 0; } + } else { + result = 0; } return result;