]> www.fi.muni.cz Git - evince.git/blobdiff - cut-n-paste/totem-screensaver/totem-scrsaver.c
[dualscreen][presentation] fix Issue #9
[evince.git] / cut-n-paste / totem-screensaver / totem-scrsaver.c
index 3a0332a18a2e035d276c6febdb306167808813a2..aaa74bd9cf41ff80cf47a688936a88362e12f749 100644 (file)
@@ -26,7 +26,9 @@
 
 #include "config.h"
 
-#include <gdk/gdk.h>
+#include <glib/gi18n.h>
+
+#include <gtk/gtk.h>
 
 #ifdef GDK_WINDOWING_X11
 #include <gdk/gdkx.h>
 
 #include "totem-scrsaver.h"
 
-#define GS_SERVICE   "org.gnome.ScreenSaver"
-#define GS_PATH      "/org/gnome/ScreenSaver"
-#define GS_INTERFACE "org.gnome.ScreenSaver"
+#define GS_SERVICE   "org.gnome.SessionManager"
+#define GS_PATH      "/org/gnome/SessionManager"
+#define GS_INTERFACE "org.gnome.SessionManager"
+/* From org.gnome.SessionManager.xml */
+#define GS_NO_IDLE_FLAG 8
 
 #define XSCREENSAVER_MIN_TIMEOUT 60
 
 enum {
        PROP_0,
-       PROP_REASON
+       PROP_REASON,
+       PROP_WINDOW
 };
 
 static void totem_scrsaver_finalize   (GObject *object);
@@ -59,10 +64,9 @@ struct TotemScrsaverPrivate {
        char *reason;
 
        GDBusProxy *gs_proxy;
-        gboolean have_screensaver_dbus;
-        guint watch_id;
+        gboolean have_session_dbus;
        guint32 cookie;
-       gboolean old_dbus_api;
+       GtkWindow *window;
 
        /* To save the screensaver info */
        int timeout;
@@ -81,7 +85,7 @@ G_DEFINE_TYPE(TotemScrsaver, totem_scrsaver, G_TYPE_OBJECT)
 static gboolean
 screensaver_is_running_dbus (TotemScrsaver *scr)
 {
-        return scr->priv->have_screensaver_dbus;
+        return scr->priv->have_session_dbus;
 }
 
 static void
@@ -96,23 +100,8 @@ on_inhibit_cb (GObject      *source_object,
 
        value = g_dbus_proxy_call_finish (proxy, res, &error);
        if (!value) {
-               if (!scr->priv->old_dbus_api &&
-                   g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD)) {
-                       g_return_if_fail (scr->priv->reason != NULL);
-                       /* try the old API */
-                       scr->priv->old_dbus_api = TRUE;
-                       g_dbus_proxy_call (proxy,
-                                          "InhibitActivation",
-                                          g_variant_new ("(s)",
-                                                         scr->priv->reason),
-                                          G_DBUS_CALL_FLAGS_NO_AUTO_START,
-                                          -1,
-                                          NULL,
-                                          on_inhibit_cb,
-                                          scr);
-               } else {
-                       g_warning ("Problem inhibiting the screensaver: %s", error->message);
-               }
+               g_warning ("Problem inhibiting the screensaver: %s", error->message);
+               g_object_unref (scr);
                g_error_free (error);
 
                return;
@@ -124,6 +113,8 @@ on_inhibit_cb (GObject      *source_object,
        else
                scr->priv->cookie = 0;
        g_variant_unref (value);
+
+       g_object_unref (scr);
 }
 
 static void
@@ -138,21 +129,8 @@ on_uninhibit_cb (GObject      *source_object,
 
        value = g_dbus_proxy_call_finish (proxy, res, &error);
        if (!value) {
-               if (!scr->priv->old_dbus_api &&
-                   g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD)) {
-                       /* try the old API */
-                       scr->priv->old_dbus_api = TRUE;
-                       g_dbus_proxy_call (proxy,
-                                          "AllowActivation",
-                                          g_variant_new ("()"),
-                                          G_DBUS_CALL_FLAGS_NO_AUTO_START,
-                                          -1,
-                                          NULL,
-                                          on_uninhibit_cb,
-                                          scr);
-               } else {
-                       g_warning ("Problem uninhibiting the screensaver: %s", error->message);
-               }
+               g_warning ("Problem uninhibiting the screensaver: %s", error->message);
+               g_object_unref (scr);
                g_error_free (error);
 
                return;
@@ -161,6 +139,8 @@ on_uninhibit_cb (GObject      *source_object,
        /* clear the cookie */
        scr->priv->cookie = 0;
        g_variant_unref (value);
+
+       g_object_unref (scr);
 }
 
 static void
@@ -168,33 +148,49 @@ screensaver_inhibit_dbus (TotemScrsaver *scr,
                          gboolean       inhibit)
 {
         TotemScrsaverPrivate *priv = scr->priv;
+        GdkWindow *window;
 
-        if (!priv->have_screensaver_dbus)
+        if (!priv->have_session_dbus)
                 return;
 
-       scr->priv->old_dbus_api = FALSE;
+       g_object_ref (scr);
 
        if (inhibit) {
+               guint xid;
+
                g_return_if_fail (scr->priv->reason != NULL);
+
+               xid = 0;
+               if (scr->priv->window != NULL) {
+                       window = gtk_widget_get_window (GTK_WIDGET (scr->priv->window));
+                       if (window != NULL)
+                               xid = gdk_x11_window_get_xid (window);
+               }
+
+
                g_dbus_proxy_call (priv->gs_proxy,
                                   "Inhibit",
-                                  g_variant_new ("(ss)",
+                                  g_variant_new ("(susu)",
                                                  g_get_application_name (),
-                                                 scr->priv->reason),
+                                                 xid,
+                                                 scr->priv->reason,
+                                                 GS_NO_IDLE_FLAG),
                                   G_DBUS_CALL_FLAGS_NO_AUTO_START,
                                   -1,
                                   NULL,
                                   on_inhibit_cb,
                                   scr);
        } else {
-                g_dbus_proxy_call (priv->gs_proxy,
-                                  "UnInhibit",
-                                  g_variant_new ("(u)", priv->cookie),
-                                  G_DBUS_CALL_FLAGS_NO_AUTO_START,
-                                  -1,
-                                  NULL,
-                                  on_uninhibit_cb,
-                                  scr);
+               if (priv->cookie > 0) {
+                       g_dbus_proxy_call (priv->gs_proxy,
+                                          "Uninhibit",
+                                          g_variant_new ("(u)", priv->cookie),
+                                          G_DBUS_CALL_FLAGS_NO_AUTO_START,
+                                          -1,
+                                          NULL,
+                                          on_uninhibit_cb,
+                                          scr);
+               }
        }
 }
 
@@ -211,65 +207,42 @@ screensaver_disable_dbus (TotemScrsaver *scr)
 }
 
 static void
-screensaver_dbus_appeared_cb (GDBusConnection *connection,
-                             const gchar     *name,
-                             const gchar     *name_owner,
-                             GDBusProxy      *proxy,
-                             gpointer         user_data)
+screensaver_dbus_proxy_new_cb (GObject      *source,
+                               GAsyncResult *result,
+                               gpointer      user_data)
 {
-        TotemScrsaver *scr = TOTEM_SCRSAVER (user_data);
-        TotemScrsaverPrivate *priv = scr->priv;
-
-       priv->gs_proxy = g_object_ref (proxy);
-
-        priv->have_screensaver_dbus = TRUE;
-}
-
-static void
-screensaver_dbus_disappeared_cb (GDBusConnection *connection,
-                                const gchar     *name,
-                                gpointer         user_data)
-{
-        TotemScrsaver *scr = TOTEM_SCRSAVER (user_data);
-        TotemScrsaverPrivate *priv = scr->priv;
+       TotemScrsaver *scr = TOTEM_SCRSAVER (user_data);
+       TotemScrsaverPrivate *priv = scr->priv;
 
-       if (priv->gs_proxy) {
-               g_object_unref (priv->gs_proxy);
-               priv->gs_proxy = NULL;
-       }
+       priv->gs_proxy = g_dbus_proxy_new_for_bus_finish (result, NULL);
+       if (!priv->gs_proxy)
+               return;
 
-        priv->have_screensaver_dbus = FALSE;
+       priv->have_session_dbus = TRUE;
+       if (priv->reason != NULL && scr->priv->disabled)
+               screensaver_disable_dbus (scr);
 }
 
 static void
 screensaver_init_dbus (TotemScrsaver *scr)
 {
-       TotemScrsaverPrivate *priv = scr->priv;
-
-        priv->watch_id = g_bus_watch_proxy (G_BUS_TYPE_SESSION,
-                                           GS_SERVICE,
-                                           G_BUS_NAME_WATCHER_FLAGS_NONE,
-                                           GS_PATH,
-                                           GS_INTERFACE,
-                                           G_TYPE_DBUS_PROXY,
-                                           G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
-                                           G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
-                                           screensaver_dbus_appeared_cb,
-                                           screensaver_dbus_disappeared_cb,
-                                           scr, NULL);
+        g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+                                 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
+                                 NULL,
+                                 GS_SERVICE,
+                                 GS_PATH,
+                                 GS_INTERFACE,
+                                 NULL,
+                                 screensaver_dbus_proxy_new_cb,
+                                 scr);
 }
 
 static void
 screensaver_finalize_dbus (TotemScrsaver *scr)
 {
-        TotemScrsaverPrivate *priv = scr->priv;
-
        if (scr->priv->gs_proxy) {
                g_object_unref (scr->priv->gs_proxy);
        }
-
-       if (priv->watch_id > 0)
-               g_bus_unwatch_proxy (priv->watch_id);
 }
 
 #ifdef GDK_WINDOWING_X11
@@ -285,13 +258,13 @@ screensaver_enable_x11 (TotemScrsaver *scr)
        }
 #endif /* HAVE_XTEST */
 
-       XLockDisplay (GDK_DISPLAY());
-       XSetScreenSaver (GDK_DISPLAY(),
+       XLockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
+       XSetScreenSaver (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
                        scr->priv->timeout,
                        scr->priv->interval,
                        scr->priv->prefer_blanking,
                        scr->priv->allow_exposures);
-       XUnlockDisplay (GDK_DISPLAY());
+       XUnlockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
 }
 
 #ifdef HAVE_XTEST
@@ -300,12 +273,12 @@ fake_event (TotemScrsaver *scr)
 {
        if (scr->priv->disabled)
        {
-               XLockDisplay (GDK_DISPLAY());
-               XTestFakeKeyEvent (GDK_DISPLAY(), *scr->priv->keycode,
+               XLockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
+               XTestFakeKeyEvent (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), *scr->priv->keycode,
                                True, CurrentTime);
-               XTestFakeKeyEvent (GDK_DISPLAY(), *scr->priv->keycode,
+               XTestFakeKeyEvent (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), *scr->priv->keycode,
                                False, CurrentTime);
-               XUnlockDisplay (GDK_DISPLAY());
+               XUnlockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
                /* Swap the keycode */
                if (scr->priv->keycode == &scr->priv->keycode1)
                        scr->priv->keycode = &scr->priv->keycode2;
@@ -324,12 +297,12 @@ screensaver_disable_x11 (TotemScrsaver *scr)
 #ifdef HAVE_XTEST
        if (scr->priv->have_xtest != FALSE)
        {
-               XLockDisplay (GDK_DISPLAY());
-               XGetScreenSaver(GDK_DISPLAY(), &scr->priv->timeout,
+               XLockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
+               XGetScreenSaver(GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &scr->priv->timeout,
                                &scr->priv->interval,
                                &scr->priv->prefer_blanking,
                                &scr->priv->allow_exposures);
-               XUnlockDisplay (GDK_DISPLAY());
+               XUnlockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
 
                if (scr->priv->timeout != 0) {
                        g_timeout_add_seconds (scr->priv->timeout / 2,
@@ -343,14 +316,14 @@ screensaver_disable_x11 (TotemScrsaver *scr)
        }
 #endif /* HAVE_XTEST */
 
-       XLockDisplay (GDK_DISPLAY());
-       XGetScreenSaver(GDK_DISPLAY(), &scr->priv->timeout,
+       XLockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
+       XGetScreenSaver(GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &scr->priv->timeout,
                        &scr->priv->interval,
                        &scr->priv->prefer_blanking,
                        &scr->priv->allow_exposures);
-       XSetScreenSaver(GDK_DISPLAY(), 0, 0,
+       XSetScreenSaver(GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), 0, 0,
                        DontPreferBlanking, DontAllowExposures);
-       XUnlockDisplay (GDK_DISPLAY());
+       XUnlockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
 }
 
 static void
@@ -359,24 +332,24 @@ screensaver_init_x11 (TotemScrsaver *scr)
 #ifdef HAVE_XTEST
        int a, b, c, d;
 
-       XLockDisplay (GDK_DISPLAY());
-       scr->priv->have_xtest = (XTestQueryExtension (GDK_DISPLAY(), &a, &b, &c, &d) == True);
+       XLockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
+       scr->priv->have_xtest = (XTestQueryExtension (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &a, &b, &c, &d) == True);
        if (scr->priv->have_xtest != FALSE)
        {
-               scr->priv->keycode1 = XKeysymToKeycode (GDK_DISPLAY(), XK_Alt_L);
+               scr->priv->keycode1 = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), XK_Alt_L);
                if (scr->priv->keycode1 == 0) {
                        g_warning ("scr->priv->keycode1 not existant");
                }
-               scr->priv->keycode2 = XKeysymToKeycode (GDK_DISPLAY(), XK_Alt_R);
+               scr->priv->keycode2 = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), XK_Alt_R);
                if (scr->priv->keycode2 == 0) {
-                       scr->priv->keycode2 = XKeysymToKeycode (GDK_DISPLAY(), XK_Alt_L);
+                       scr->priv->keycode2 = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), XK_Alt_L);
                        if (scr->priv->keycode2 == 0) {
                                g_warning ("scr->priv->keycode2 not existant");
                        }
                }
                scr->priv->keycode = &scr->priv->keycode1;
        }
-       XUnlockDisplay (GDK_DISPLAY());
+       XUnlockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
 #endif /* HAVE_XTEST */
 }
 
@@ -402,6 +375,9 @@ totem_scrsaver_get_property (GObject *object,
        case PROP_REASON:
                g_value_set_string (value, scr->priv->reason);
                break;
+       case PROP_WINDOW:
+               g_value_set_object (value, scr->priv->window);
+               break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
        }
@@ -423,6 +399,11 @@ totem_scrsaver_set_property (GObject *object,
                g_free (scr->priv->reason);
                scr->priv->reason = g_value_dup_string (value);
                break;
+       case PROP_WINDOW:
+               if (scr->priv->window)
+                       g_object_unref (scr->priv->window);
+               scr->priv->window = g_value_dup_object (value);
+               break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
        }
@@ -442,7 +423,9 @@ totem_scrsaver_class_init (TotemScrsaverClass *klass)
        g_object_class_install_property (object_class, PROP_REASON,
                                         g_param_spec_string ("reason", NULL, NULL,
                                                              NULL, G_PARAM_READWRITE));
-
+       g_object_class_install_property (object_class, PROP_WINDOW,
+                                        g_param_spec_object ("window", NULL, NULL,
+                                                             GTK_TYPE_WINDOW, G_PARAM_READWRITE));
 }
 
 /**
@@ -479,7 +462,7 @@ totem_scrsaver_init (TotemScrsaver *scr)
 void
 totem_scrsaver_disable (TotemScrsaver *scr)
 {
-       g_return_if_fail (TOTEM_SCRSAVER (scr));
+       g_return_if_fail (TOTEM_IS_SCRSAVER (scr));
 
        if (scr->priv->disabled != FALSE)
                return;
@@ -488,7 +471,7 @@ totem_scrsaver_disable (TotemScrsaver *scr)
 
        if (screensaver_is_running_dbus (scr) != FALSE)
                screensaver_disable_dbus (scr);
-       else 
+       else
 #ifdef GDK_WINDOWING_X11
                screensaver_disable_x11 (scr);
 #else
@@ -500,7 +483,7 @@ totem_scrsaver_disable (TotemScrsaver *scr)
 void
 totem_scrsaver_enable (TotemScrsaver *scr)
 {
-       g_return_if_fail (TOTEM_SCRSAVER (scr));
+       g_return_if_fail (TOTEM_IS_SCRSAVER (scr));
 
        if (scr->priv->disabled == FALSE)
                return;
@@ -521,7 +504,7 @@ totem_scrsaver_enable (TotemScrsaver *scr)
 void
 totem_scrsaver_set_state (TotemScrsaver *scr, gboolean enable)
 {
-       g_return_if_fail (TOTEM_SCRSAVER (scr));
+       g_return_if_fail (TOTEM_IS_SCRSAVER (scr));
 
        if (scr->priv->disabled == !enable)
                return;
@@ -538,6 +521,8 @@ totem_scrsaver_finalize (GObject *object)
        TotemScrsaver *scr = TOTEM_SCRSAVER (object);
 
        g_free (scr->priv->reason);
+       if (scr->priv->window != NULL)
+               g_object_unref (scr->priv->window);
 
        screensaver_finalize_dbus (scr);
 #ifdef GDK_WINDOWING_X11