#include "config.h"
-#include <glib/gi18n.h>
-
#include <gdk/gdk.h>
#ifdef GDK_WINDOWING_X11
#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;
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,
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,
}
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
}
#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)
{
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));
+
}
/**
if (screensaver_is_running_dbus (scr) != FALSE)
screensaver_enable_dbus (scr);
- else
+ else
#ifdef GDK_WINDOWING_X11
screensaver_enable_x11 (scr);
#else
{
TotemScrsaver *scr = TOTEM_SCRSAVER (object);
+ g_free (scr->priv->reason);
+
screensaver_finalize_dbus (scr);
#ifdef GDK_WINDOWING_X11
screensaver_finalize_x11 (scr);