#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);
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;
static gboolean
screensaver_is_running_dbus (TotemScrsaver *scr)
{
- return scr->priv->have_screensaver_dbus;
+ return scr->priv->have_session_dbus;
}
static void
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;
else
scr->priv->cookie = 0;
g_variant_unref (value);
+
+ g_object_unref (scr);
}
static void
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;
/* clear the cookie */
scr->priv->cookie = 0;
g_variant_unref (value);
+
+ g_object_unref (scr);
}
static void
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);
+ }
}
}
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,
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
static void
screensaver_enable_x11 (TotemScrsaver *scr)
{
- Display *xdisplay;
#ifdef HAVE_XTEST
if (scr->priv->have_xtest != FALSE)
}
#endif /* HAVE_XTEST */
- xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
- XLockDisplay (xdisplay);
- XSetScreenSaver (xdisplay,
+ 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 (xdisplay);
+ XUnlockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
}
#ifdef HAVE_XTEST
{
if (scr->priv->disabled)
{
- Display *display;
-
- xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
- XLockDisplay (xdisplay);
- XTestFakeKeyEvent (xdisplay, *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 (xdisplay, *scr->priv->keycode,
+ XTestFakeKeyEvent (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), *scr->priv->keycode,
False, CurrentTime);
- XUnlockDisplay (xdisplay);
+ XUnlockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
/* Swap the keycode */
if (scr->priv->keycode == &scr->priv->keycode1)
scr->priv->keycode = &scr->priv->keycode2;
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 (xdisplay);
- XGetScreenSaver(xdisplay, &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 (xdisplay);
+ XUnlockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
if (scr->priv->timeout != 0) {
g_timeout_add_seconds (scr->priv->timeout / 2,
}
#endif /* HAVE_XTEST */
- XLockDisplay (xdisplay);
- XGetScreenSaver(xdisplay, &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(xdisplay, 0, 0,
+ XSetScreenSaver(GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), 0, 0,
DontPreferBlanking, DontAllowExposures);
- XUnlockDisplay (xdisplay);
+ XUnlockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
}
static void
{
#ifdef HAVE_XTEST
int a, b, c, d;
- Display *display;
-
- xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
- XLockDisplay (xdisplay);
- scr->priv->have_xtest = (XTestQueryExtension (xdisplay, &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 (xdisplay, 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 (xdisplay, 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 (xdisplay, 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 (xdisplay);
+ XUnlockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
#endif /* HAVE_XTEST */
}
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);
}
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);
}
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));
}
/**
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;
if (screensaver_is_running_dbus (scr) != FALSE)
screensaver_disable_dbus (scr);
- else
+ else
#ifdef GDK_WINDOWING_X11
screensaver_disable_x11 (scr);
#else
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;
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;
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