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 125ed508c2)
This commit is contained in:
Frank Praznik
2026-04-20 12:41:48 -04:00
parent 7ca97d0791
commit 462b1f7b0d

View File

@@ -579,8 +579,14 @@ done:
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);