This is so wrong, it hurts.
authorSam Lantinga <slouken@libsdl.org>
Mon, 12 Jan 2009 08:26:24 +0000
changeset 3030 f13ad181f5b2
parent 3029 89f8a72e1ee9
child 3031 86918831452f
This is so wrong, it hurts. Instead of the GNOME screensaver respecting the MIT-SCREEN-SAVER extension and registering for the screensaver idle event, it uses a completely different control mechanism. Our alternatives are to use dbus (very complicated) or this really painful hack.
src/video/x11/SDL_x11events.c
--- a/src/video/x11/SDL_x11events.c	Mon Jan 12 08:23:47 2009 +0000
+++ b/src/video/x11/SDL_x11events.c	Mon Jan 12 08:26:24 2009 +0000
@@ -410,6 +410,33 @@
     }
 }
 
+/* This is so wrong it hurts */
+#define GNOME_SCREENSAVER_HACK
+#ifdef GNOME_SCREENSAVER_HACK
+#include <unistd.h>
+static pid_t screensaver_inhibit_pid;
+static void gnome_screensaver_disable()
+{
+    screensaver_inhibit_pid = fork();
+    if (screensaver_inhibit_pid == 0) {
+        //close(0);
+        //close(1);
+        //close(2);
+        execl("/usr/bin/gnome-screensaver-command",
+              "gnome-screensaver-command",
+              "--inhibit",
+              "--reason",
+              "GNOME screensaver doesn't respect MIT-SCREEN-SAVER",
+              NULL);
+        exit(2);
+    }
+}
+static void gnome_screensaver_enable()
+{
+    kill(screensaver_inhibit_pid, 15);
+}
+#endif
+
 void
 X11_SuspendScreenSaver(_THIS)
 {
@@ -418,20 +445,26 @@
     int dummy;
     int major_version, minor_version;
 
-    if (!SDL_X11_HAVE_XSS) {
-        return;
-    }
+    if (SDL_X11_HAVE_XSS) {
+        /* XScreenSaverSuspend was introduced in MIT-SCREEN-SAVER 1.1 */
+        if (!XScreenSaverQueryExtension(data->display, &dummy, &dummy) ||
+            !XScreenSaverQueryVersion(data->display,
+                                      &major_version, &minor_version) ||
+            major_version < 1 || (major_version == 1 && minor_version < 1)) {
+            return;
+        }
 
-    /* XScreenSaverSuspend was introduced in MIT-SCREEN-SAVER 1.1 */
-    if (!XScreenSaverQueryExtension(data->display, &dummy, &dummy) ||
-        !XScreenSaverQueryVersion(data->display,
-                                  &major_version, &minor_version) ||
-        major_version < 1 || (major_version == 1 && minor_version < 1)) {
-        return;
+        XScreenSaverSuspend(data->display, _this->suspend_screensaver);
+        XResetScreenSaver(data->display);
     }
+#endif
 
-    XScreenSaverSuspend(data->display, _this->suspend_screensaver);
-    XResetScreenSaver(data->display);
+#ifdef GNOME_SCREENSAVER_HACK
+    if (_this->suspend_screensaver) {
+        gnome_screensaver_disable();
+    } else {
+        gnome_screensaver_enable();
+    }
 #endif
 }