Procházet zdrojové kódy

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)
Frank Praznik před 3 týdny
rodič
revize
462b1f7b0d
1 změnil soubory, kde provedl 9 přidání a 0 odebrání
  1. 9 0
      src/core/linux/SDL_dbus.c

+ 9 - 0
src/core/linux/SDL_dbus.c

@@ -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);