From 462b1f7b0dfd8de35edcc11213d95654994a392f Mon Sep 17 00:00:00 2001
From: Frank Praznik <[EMAIL REDACTED]>
Date: Mon, 20 Apr 2026 12:41:48 -0400
Subject: [PATCH] dbus: Return false if the screensaver inhibitor interface is
unavailable
Returning true with an unavailable interface in no-op cases can prevent fallback to other inhibition methods. If the inhibitor interface was previously tried and marked as unavailable, just return false.
(cherry picked from commit 125ed508c2fafba26ecf6615e136aaf54c90da52)
---
src/core/linux/SDL_dbus.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/src/core/linux/SDL_dbus.c b/src/core/linux/SDL_dbus.c
index 9a2bef87e1e04..cd7f77a1006af 100644
--- a/src/core/linux/SDL_dbus.c
+++ b/src/core/linux/SDL_dbus.c
@@ -579,8 +579,14 @@ bool SDL_DBus_OpenURI(const char *uri, const char *window_id, const char *activa
bool SDL_DBus_ScreensaverInhibit(bool inhibit)
{
+ static bool interface_unavailable = false;
const char *default_inhibit_reason = "Playing a game";
+ // If the interface was previously queried and is unavailable, return false.
+ if (interface_unavailable) {
+ return false;
+ }
+
if ((inhibit && (screensaver_cookie != 0 || inhibit_handle)) || (!inhibit && (screensaver_cookie == 0 && !inhibit_handle))) {
return true;
}
@@ -631,6 +637,8 @@ bool SDL_DBus_ScreensaverInhibit(bool inhibit)
if (SDL_DBus_CallWithBasicReply(dbus.session_conn, &reply, msg, DBUS_TYPE_OBJECT_PATH, &reply_path)) {
inhibit_handle = SDL_strdup(reply_path);
result = true;
+ } else {
+ interface_unavailable = true;
}
SDL_DBus_FreeReply(&reply);
dbus.message_unref(msg);
@@ -657,6 +665,7 @@ bool SDL_DBus_ScreensaverInhibit(bool inhibit)
if (!SDL_DBus_CallMethod(NULL, bus_name, path, interface, "Inhibit",
DBUS_TYPE_STRING, &app, DBUS_TYPE_STRING, &reason, DBUS_TYPE_INVALID,
DBUS_TYPE_UINT32, &screensaver_cookie, DBUS_TYPE_INVALID)) {
+ interface_unavailable = true;
return false;
}
return (screensaver_cookie != 0);