X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=cut-n-paste%2Ftotem-screensaver%2Ftotem-scrsaver.c;h=36d314ef20b615ab29ef2afc4bd44300fa7669e7;hb=27222504c062735202103d58e9bff861c5589e1c;hp=09cbe59dba82bda3347fd76828a88d43c935c842;hpb=517d7683711bf1bba1d7e28902739d49ec5e4c2b;p=evince.git diff --git a/cut-n-paste/totem-screensaver/totem-scrsaver.c b/cut-n-paste/totem-screensaver/totem-scrsaver.c index 09cbe59d..36d314ef 100644 --- a/cut-n-paste/totem-screensaver/totem-scrsaver.c +++ b/cut-n-paste/totem-screensaver/totem-scrsaver.c @@ -26,8 +26,6 @@ #include "config.h" -#include - #include #ifdef GDK_WINDOWING_X11 @@ -47,15 +45,21 @@ #define XSCREENSAVER_MIN_TIMEOUT 60 +enum { + PROP_0, + PROP_REASON +}; + static void totem_scrsaver_finalize (GObject *object); struct TotemScrsaverPrivate { /* Whether the screensaver is disabled */ gboolean disabled; + /* The reason for the inhibition */ + char *reason; GDBusProxy *gs_proxy; gboolean have_screensaver_dbus; - guint watch_id; guint32 cookie; gboolean old_dbus_api; @@ -93,12 +97,13 @@ on_inhibit_cb (GObject *source_object, 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)", - _("Running in presentation mode")), + scr->priv->reason), G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, NULL, @@ -169,11 +174,12 @@ screensaver_inhibit_dbus (TotemScrsaver *scr, scr->priv->old_dbus_api = FALSE; if (inhibit) { + g_return_if_fail (scr->priv->reason != NULL); g_dbus_proxy_call (priv->gs_proxy, "Inhibit", g_variant_new ("(ss)", - "Evince", - _("Running in presentation mode")), + g_get_application_name (), + scr->priv->reason), G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, NULL, @@ -204,71 +210,76 @@ 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_update_dbus_presence (TotemScrsaver *scr) { - TotemScrsaver *scr = TOTEM_SCRSAVER (user_data); TotemScrsaverPrivate *priv = scr->priv; + gchar *name_owner; - priv->gs_proxy = g_object_ref (proxy); - - priv->have_screensaver_dbus = TRUE; + 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_disappeared_cb (GDBusConnection *connection, - const gchar *name, - gpointer user_data) +screensaver_dbus_owner_changed_cb (GObject *object, + GParamSpec *pspec, + gpointer user_data) { 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->have_screensaver_dbus = FALSE; + screensaver_update_dbus_presence (scr); } static void -screensaver_init_dbus (TotemScrsaver *scr) +screensaver_dbus_proxy_new_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) { + TotemScrsaver *scr = TOTEM_SCRSAVER (user_data); 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); + priv->gs_proxy = g_dbus_proxy_new_for_bus_finish (result, NULL); + 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); } static void -screensaver_finalize_dbus (TotemScrsaver *scr) +screensaver_init_dbus (TotemScrsaver *scr) { - TotemScrsaverPrivate *priv = scr->priv; + 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) +{ 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 static void screensaver_enable_x11 (TotemScrsaver *scr) { + Display *xdisplay; #ifdef HAVE_XTEST if (scr->priv->have_xtest != FALSE) @@ -278,13 +289,14 @@ screensaver_enable_x11 (TotemScrsaver *scr) } #endif /* HAVE_XTEST */ - XLockDisplay (GDK_DISPLAY()); - XSetScreenSaver (GDK_DISPLAY(), + xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); + XLockDisplay (xdisplay); + XSetScreenSaver (xdisplay, scr->priv->timeout, scr->priv->interval, scr->priv->prefer_blanking, scr->priv->allow_exposures); - XUnlockDisplay (GDK_DISPLAY()); + XUnlockDisplay (xdisplay); } #ifdef HAVE_XTEST @@ -293,12 +305,15 @@ fake_event (TotemScrsaver *scr) { if (scr->priv->disabled) { - XLockDisplay (GDK_DISPLAY()); - XTestFakeKeyEvent (GDK_DISPLAY(), *scr->priv->keycode, + Display *display; + + xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); + XLockDisplay (xdisplay); + XTestFakeKeyEvent (xdisplay, *scr->priv->keycode, True, CurrentTime); - XTestFakeKeyEvent (GDK_DISPLAY(), *scr->priv->keycode, + XTestFakeKeyEvent (xdisplay, *scr->priv->keycode, False, CurrentTime); - XUnlockDisplay (GDK_DISPLAY()); + XUnlockDisplay (xdisplay); /* Swap the keycode */ if (scr->priv->keycode == &scr->priv->keycode1) scr->priv->keycode = &scr->priv->keycode2; @@ -313,16 +328,19 @@ fake_event (TotemScrsaver *scr) static void screensaver_disable_x11 (TotemScrsaver *scr) { + Display *xdisplay; + + xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); #ifdef HAVE_XTEST if (scr->priv->have_xtest != FALSE) { - XLockDisplay (GDK_DISPLAY()); - XGetScreenSaver(GDK_DISPLAY(), &scr->priv->timeout, + XLockDisplay (xdisplay); + XGetScreenSaver(xdisplay, &scr->priv->timeout, &scr->priv->interval, &scr->priv->prefer_blanking, &scr->priv->allow_exposures); - XUnlockDisplay (GDK_DISPLAY()); + XUnlockDisplay (xdisplay); if (scr->priv->timeout != 0) { g_timeout_add_seconds (scr->priv->timeout / 2, @@ -336,14 +354,14 @@ screensaver_disable_x11 (TotemScrsaver *scr) } #endif /* HAVE_XTEST */ - XLockDisplay (GDK_DISPLAY()); - XGetScreenSaver(GDK_DISPLAY(), &scr->priv->timeout, + XLockDisplay (xdisplay); + XGetScreenSaver(xdisplay, &scr->priv->timeout, &scr->priv->interval, &scr->priv->prefer_blanking, &scr->priv->allow_exposures); - XSetScreenSaver(GDK_DISPLAY(), 0, 0, + XSetScreenSaver(xdisplay, 0, 0, DontPreferBlanking, DontAllowExposures); - XUnlockDisplay (GDK_DISPLAY()); + XUnlockDisplay (xdisplay); } static void @@ -351,25 +369,28 @@ screensaver_init_x11 (TotemScrsaver *scr) { #ifdef HAVE_XTEST int a, b, c, d; + Display *display; + + xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); - XLockDisplay (GDK_DISPLAY()); - scr->priv->have_xtest = (XTestQueryExtension (GDK_DISPLAY(), &a, &b, &c, &d) == True); + XLockDisplay (xdisplay); + scr->priv->have_xtest = (XTestQueryExtension (xdisplay, &a, &b, &c, &d) == True); if (scr->priv->have_xtest != FALSE) { - scr->priv->keycode1 = XKeysymToKeycode (GDK_DISPLAY(), XK_Alt_L); + scr->priv->keycode1 = XKeysymToKeycode (xdisplay, 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 (xdisplay, XK_Alt_R); if (scr->priv->keycode2 == 0) { - scr->priv->keycode2 = XKeysymToKeycode (GDK_DISPLAY(), XK_Alt_L); + scr->priv->keycode2 = XKeysymToKeycode (xdisplay, 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 (xdisplay); #endif /* HAVE_XTEST */ } @@ -380,6 +401,47 @@ screensaver_finalize_x11 (TotemScrsaver *scr) } #endif +static void +totem_scrsaver_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + TotemScrsaver *scr; + + scr = TOTEM_SCRSAVER (object); + + switch (property_id) + { + case PROP_REASON: + g_value_set_string (value, scr->priv->reason); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +totem_scrsaver_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + TotemScrsaver *scr; + + scr = TOTEM_SCRSAVER (object); + + switch (property_id) + { + case PROP_REASON: + g_free (scr->priv->reason); + scr->priv->reason = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + static void totem_scrsaver_class_init (TotemScrsaverClass *klass) { @@ -387,7 +449,14 @@ totem_scrsaver_class_init (TotemScrsaverClass *klass) g_type_class_add_private (klass, sizeof (TotemScrsaverPrivate)); + object_class->set_property = totem_scrsaver_set_property; + object_class->get_property = totem_scrsaver_get_property; object_class->finalize = totem_scrsaver_finalize; + + g_object_class_install_property (object_class, PROP_REASON, + g_param_spec_string ("reason", NULL, NULL, + NULL, G_PARAM_READWRITE)); + } /** @@ -454,7 +523,7 @@ totem_scrsaver_enable (TotemScrsaver *scr) if (screensaver_is_running_dbus (scr) != FALSE) screensaver_enable_dbus (scr); - else + else #ifdef GDK_WINDOWING_X11 screensaver_enable_x11 (scr); #else @@ -482,6 +551,8 @@ totem_scrsaver_finalize (GObject *object) { TotemScrsaver *scr = TOTEM_SCRSAVER (object); + g_free (scr->priv->reason); + screensaver_finalize_dbus (scr); #ifdef GDK_WINDOWING_X11 screensaver_finalize_x11 (scr);