X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=cut-n-paste%2Ftotem-screensaver%2Ftotem-scrsaver.c;h=aaa74bd9cf41ff80cf47a688936a88362e12f749;hb=1e63533e4d2fe74b17883a51f984ecacb9138231;hp=c8dcc09edf1a3b3cc1ec92356931fbad6643b933;hpb=2297bff1e7d745f0f837d44feeda03244368d7f1;p=evince.git diff --git a/cut-n-paste/totem-screensaver/totem-scrsaver.c b/cut-n-paste/totem-screensaver/totem-scrsaver.c index c8dcc09e..aaa74bd9 100644 --- a/cut-n-paste/totem-screensaver/totem-scrsaver.c +++ b/cut-n-paste/totem-screensaver/totem-scrsaver.c @@ -26,7 +26,9 @@ #include "config.h" -#include +#include + +#include #ifdef GDK_WINDOWING_X11 #include @@ -39,15 +41,18 @@ #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,9 +64,9 @@ struct TotemScrsaverPrivate { char *reason; GDBusProxy *gs_proxy; - gboolean have_screensaver_dbus; + gboolean have_session_dbus; guint32 cookie; - gboolean old_dbus_api; + GtkWindow *window; /* To save the screensaver info */ int timeout; @@ -80,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 @@ -95,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; @@ -123,6 +113,8 @@ on_inhibit_cb (GObject *source_object, else scr->priv->cookie = 0; g_variant_unref (value); + + g_object_unref (scr); } static void @@ -137,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; @@ -160,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 @@ -167,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); + } } } @@ -209,31 +206,6 @@ screensaver_disable_dbus (TotemScrsaver *scr) screensaver_inhibit_dbus (scr, TRUE); } -static void -screensaver_update_dbus_presence (TotemScrsaver *scr) -{ - TotemScrsaverPrivate *priv = scr->priv; - gchar *name_owner; - - name_owner = g_dbus_proxy_get_name_owner (priv->gs_proxy); - if (name_owner) { - priv->have_screensaver_dbus = TRUE; - g_free (name_owner); - } else { - priv->have_screensaver_dbus = FALSE; - } -} - -static void -screensaver_dbus_owner_changed_cb (GObject *object, - GParamSpec *pspec, - gpointer user_data) -{ - TotemScrsaver *scr = TOTEM_SCRSAVER (user_data); - - screensaver_update_dbus_presence (scr); -} - static void screensaver_dbus_proxy_new_cb (GObject *source, GAsyncResult *result, @@ -246,11 +218,9 @@ screensaver_dbus_proxy_new_cb (GObject *source, if (!priv->gs_proxy) return; - screensaver_update_dbus_presence (scr); - - g_signal_connect (priv->gs_proxy, "notify::g-name-owner", - G_CALLBACK (screensaver_dbus_owner_changed_cb), - scr); + priv->have_session_dbus = TRUE; + if (priv->reason != NULL && scr->priv->disabled) + screensaver_disable_dbus (scr); } static void @@ -288,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 @@ -303,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; @@ -327,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, @@ -346,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 @@ -362,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 */ } @@ -405,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); } @@ -426,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); } @@ -445,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)); } /** @@ -482,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; @@ -491,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 @@ -503,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; @@ -524,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; @@ -541,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