[pinpoint] clutter-x11: inhibit screensaver while fullscreened



commit 1a5ba77a979151077122c4a450416108c385cde8
Author: Will Thompson <will thompson collabora co uk>
Date:   Wed Nov 2 16:25:44 2011 +0000

    clutter-x11: inhibit screensaver while fullscreened
    
    Today I gave a presentation using pinpoint. I had to keep hitting the
    shift key or moving the mouse to stop the screen fading out, which was a
    little embarrassing.
    
    This patch uses the Inhibit()/Uninhibit() methods provided by
    Gnome Session Manager â 3.0. Older versions didn't have this API;
    gnome-screensaver provided it instead. Unfortunately I don't have
    details of the previous API to hand, so people using older Gnomes get to
    send their own patch if they want.
    
    Also this patch makes synchronous D-Bus calls because I am lazy.

 configure.ac |    2 +-
 pp-clutter.c |   85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 86 insertions(+), 1 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 0ca3092..5d550a0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -10,7 +10,7 @@ AC_PROG_CC
 PKG_PROG_PKG_CONFIG
 AC_HEADER_STDC
 
-PINPOINT_DEPS="clutter-1.0 >= 1.4 gio-2.0 cairo-pdf pangocairo gdk-pixbuf-2.0"
+PINPOINT_DEPS="clutter-1.0 >= 1.4 gio-2.0 >= 2.26 cairo-pdf pangocairo gdk-pixbuf-2.0"
 
 AS_COMPILER_FLAGS([MAINTAINER_CFLAGS], [-Wall])
 AC_SUBST(MAINTAINER_CFLAGS)
diff --git a/pp-clutter.c b/pp-clutter.c
index 27e2b49..da5d1fa 100644
--- a/pp-clutter.c
+++ b/pp-clutter.c
@@ -139,6 +139,15 @@ typedef struct _ClutterRenderer
                              */
 
   PinPointRenderer *cairo_renderer;
+
+  /* Proxy object for the Gnome Session Manager; used to inhibit suspend during
+   * presentations.
+   */
+  GDBusProxy       *gsm;
+  /* Token returned by the Inhibit() method; passed to Uninhibit() when we
+   * leave fullscreen to tell GSM it's free to turn the screen off now.
+   */
+  guint32           inhibit_cookie;
 } ClutterRenderer;
 
 typedef struct
@@ -776,6 +785,7 @@ clutter_renderer_init (PinPointRenderer   *pp_renderer,
   ClutterRenderer *renderer = CLUTTER_RENDERER (pp_renderer);
   GFileMonitor *monitor;
   ClutterActor *stage;
+  GDBusConnection *session_bus;
 
   renderer->stage = stage = clutter_stage_new ();
   renderer->root = clutter_group_new ();
@@ -863,6 +873,22 @@ clutter_renderer_init (PinPointRenderer   *pp_renderer,
 
   renderer->cairo_renderer = pp_cairo_renderer ();
   renderer->cairo_renderer->init (renderer->cairo_renderer, "");
+
+  session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
+  if (session_bus != NULL)
+    {
+      renderer->gsm = g_dbus_proxy_new_sync (session_bus,
+                                             G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
+                                             G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS |
+                                             G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
+                                             NULL,
+                                             "org.gnome.SessionManager",
+                                             "/org/gnome/SessionManager",
+                                             "org.gnome.SessionManager",
+                                             NULL,
+                                             NULL);
+      g_clear_object (&session_bus);
+    }
 }
 
 static gboolean update_speaker_screen (ClutterRenderer *renderer);
@@ -888,6 +914,7 @@ clutter_renderer_finalize (PinPointRenderer *pp_renderer)
 
   clutter_actor_destroy (renderer->stage);
   g_hash_table_unref (renderer->bg_cache);
+  g_clear_object (&renderer->gsm);
 }
 
 static ClutterActor *
@@ -1230,6 +1257,62 @@ toggle_speaker_screen (ClutterRenderer *renderer)
     }
 }
 
+static void
+pp_inhibit (ClutterRenderer *renderer,
+            gboolean         fullscreen)
+{
+#if HAVE_CLUTTER_X11
+  /* Hey maybe we don't have D-Bus. */
+  if (renderer->gsm == NULL)
+    return;
+
+  if (fullscreen)
+    {
+      GVariant *args = g_variant_new ("(susu)",
+                                      "Pinpoint",
+                                      clutter_x11_get_stage_window (
+                                          CLUTTER_STAGE (renderer->stage)),
+                                      "Presenting some blingin' slides",
+                                      /* The flag '8' means "Inhibit the
+                                       * session being marked as idle", as
+                                       * opposed to logging out, user
+                                       * switching, or suspending.
+                                       */
+                                      8);
+      GVariant *ret = g_dbus_proxy_call_sync (renderer->gsm,
+                                              "Inhibit",
+                                              args,
+                                              G_DBUS_CALL_FLAGS_NONE,
+                                              -1,
+                                              NULL,
+                                              NULL);
+
+      if (ret != NULL)
+        {
+          if (g_variant_is_of_type (ret, G_VARIANT_TYPE ("(u)")))
+            g_variant_get (ret, "(u)", &renderer->inhibit_cookie);
+
+          g_variant_unref (ret);
+        }
+      /* Bleh, maybe this is an older version of Gnome where it was the
+       * screensaver which had the inhibition API.
+       */
+    }
+  else if (renderer->inhibit_cookie != 0)
+    {
+      g_dbus_proxy_call_sync (renderer->gsm,
+                              "Uninhibit",
+                              g_variant_new ("(u)", renderer->inhibit_cookie),
+                              G_DBUS_CALL_FLAGS_NONE,
+                              -1,
+                              NULL,
+                              NULL);
+      renderer->inhibit_cookie = 0;
+    }
+  /* else I guess Inhibit() failed. */
+#endif /* HAVE_CLUTTER_X11 */
+}
+
 static gboolean
 key_pressed (ClutterActor    *actor,
              ClutterEvent    *event,
@@ -1279,6 +1362,8 @@ key_pressed (ClutterActor    *actor,
           if (renderer->speaker_mode && renderer->speaker_screen)
             pp_set_fullscreen (CLUTTER_STAGE (renderer->speaker_screen),
                                !was_fullscreen);
+
+          pp_inhibit (renderer, !was_fullscreen);
         }
         break;
       case CLUTTER_Return:



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]