df097cd376ba8cdd97026169df8acfac6f65f0a2
1 //http://www.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html#gs-method-SimulateUserActivity
2 //simulate user activity might be better than the following:
3 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
5 Copyright (C) 2004-2006 Bastien Nocera <hadess@hadess.net>
7 The Gnome Library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public License as
9 published by the Free Software Foundation; either version 2 of the
10 License, or (at your option) any later version.
12 The Gnome Library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details.
17 You should have received a copy of the GNU Library General Public
18 License along with the Gnome Library; see the file COPYING.LIB. If not,
19 write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301 USA.
22 Author: Bastien Nocera <hadess@hadess.net>
28 #include <glib/gi18n.h>
32 #ifdef GDK_WINDOWING_X11
34 #include <X11/keysym.h>
37 #include <X11/extensions/XTest.h>
38 #endif /* HAVE_XTEST */
39 #endif /* GDK_WINDOWING_X11 */
42 #include <dbus/dbus.h>
43 #include <dbus/dbus-glib.h>
45 #define GS_SERVICE "org.gnome.ScreenSaver"
46 #define GS_PATH "/org/gnome/ScreenSaver"
47 #define GS_INTERFACE "org.gnome.ScreenSaver"
48 #endif /* WITH_DBUS */
50 #include "totem-scrsaver.h"
52 #define XSCREENSAVER_MIN_TIMEOUT 60
54 static GObjectClass
*parent_class
= NULL
;
55 static void totem_scrsaver_finalize (GObject
*object
);
58 struct TotemScrsaverPrivate
{
59 /* Whether the screensaver is disabled */
63 DBusGConnection
*connection
;
66 #endif /* WITH_DBUS */
68 /* To save the screensaver info */
74 /* For use with XTest */
75 int keycode1
, keycode2
;
80 G_DEFINE_TYPE(TotemScrsaver
, totem_scrsaver
, G_TYPE_OBJECT
)
83 screensaver_is_running_dbus (TotemScrsaver
*scr
)
86 if (! scr
->priv
->connection
)
89 if (! scr
->priv
->gs_proxy
)
95 #endif /* WITH_DBUS */
99 screensaver_inhibit_dbus (TotemScrsaver
*scr
,
106 g_return_if_fail (scr
!= NULL
);
107 g_return_if_fail (scr
->priv
->connection
!= NULL
);
108 g_return_if_fail (scr
->priv
->gs_proxy
!= NULL
);
116 application
= g_strdup ("Totem");
117 reason
= g_strdup (_("Playing a movie"));
119 res
= dbus_g_proxy_call (scr
->priv
->gs_proxy
,
122 G_TYPE_STRING
, application
,
123 G_TYPE_STRING
, reason
,
125 G_TYPE_UINT
, &cookie
,
129 /* save the cookie */
130 scr
->priv
->cookie
= cookie
;
132 /* try the old API */
133 res
= dbus_g_proxy_call (scr
->priv
->gs_proxy
,
136 G_TYPE_STRING
, reason
,
142 g_free (application
);
145 res
= dbus_g_proxy_call (scr
->priv
->gs_proxy
,
148 G_TYPE_UINT
, scr
->priv
->cookie
,
152 /* clear the cookie */
153 scr
->priv
->cookie
= 0;
155 /* try the old API */
156 res
= dbus_g_proxy_call (scr
->priv
->gs_proxy
,
166 g_warning ("Problem inhibiting the screensaver: %s", error
->message
);
167 g_error_free (error
);
170 #endif /* WITH_DBUS */
174 screensaver_enable_dbus (TotemScrsaver
*scr
)
176 screensaver_inhibit_dbus (scr
, FALSE
);
180 screensaver_disable_dbus (TotemScrsaver
*scr
)
182 screensaver_inhibit_dbus (scr
, TRUE
);
187 gs_proxy_destroy_cb (GObject
*proxy
,
190 g_warning ("Detected that GNOME screensaver has left the bus");
192 /* just invalidate for now */
193 scr
->priv
->gs_proxy
= NULL
;
198 screensaver_init_dbus (TotemScrsaver
*scr
)
201 GError
*error
= NULL
;
203 scr
->priv
->connection
= dbus_g_bus_get (DBUS_BUS_SESSION
, &error
);
205 if (! scr
->priv
->connection
) {
207 g_warning ("Failed to connect to the session bus: %s", error
->message
);
208 g_error_free (error
);
213 scr
->priv
->gs_proxy
= dbus_g_proxy_new_for_name_owner (scr
->priv
->connection
,
218 if (scr
->priv
->gs_proxy
!= NULL
) {
219 g_signal_connect_object (scr
->priv
->gs_proxy
,
221 G_CALLBACK (gs_proxy_destroy_cb
),
227 #endif /* WITH_DBUS */
231 screensaver_finalize_dbus (TotemScrsaver
*scr
)
234 if (scr
->priv
->gs_proxy
) {
235 g_object_unref (scr
->priv
->gs_proxy
);
237 #endif /* WITH_DBUS */
240 #ifdef GDK_WINDOWING_X11
242 screensaver_enable_x11 (TotemScrsaver
*scr
)
246 if (scr
->priv
->have_xtest
!= FALSE
)
248 g_source_remove_by_user_data (scr
);
251 #endif /* HAVE_XTEST */
253 XLockDisplay (GDK_DISPLAY());
254 XSetScreenSaver (GDK_DISPLAY(),
257 scr
->priv
->prefer_blanking
,
258 scr
->priv
->allow_exposures
);
259 XUnlockDisplay (GDK_DISPLAY());
264 fake_event (TotemScrsaver
*scr
)
266 if (scr
->priv
->disabled
)
268 XLockDisplay (GDK_DISPLAY());
269 XTestFakeKeyEvent (GDK_DISPLAY(), *scr
->priv
->keycode
,
271 XTestFakeKeyEvent (GDK_DISPLAY(), *scr
->priv
->keycode
,
273 XUnlockDisplay (GDK_DISPLAY());
274 /* Swap the keycode */
275 if (scr
->priv
->keycode
== &scr
->priv
->keycode1
)
276 scr
->priv
->keycode
= &scr
->priv
->keycode2
;
278 scr
->priv
->keycode
= &scr
->priv
->keycode1
;
283 #endif /* HAVE_XTEST */
286 screensaver_disable_x11 (TotemScrsaver
*scr
)
290 if (scr
->priv
->have_xtest
!= FALSE
)
292 XLockDisplay (GDK_DISPLAY());
293 XGetScreenSaver(GDK_DISPLAY(), &scr
->priv
->timeout
,
294 &scr
->priv
->interval
,
295 &scr
->priv
->prefer_blanking
,
296 &scr
->priv
->allow_exposures
);
297 XUnlockDisplay (GDK_DISPLAY());
299 if (scr
->priv
->timeout
!= 0) {
300 g_timeout_add_seconds (scr
->priv
->timeout
/ 2,
301 (GSourceFunc
) fake_event
, scr
);
303 g_timeout_add_seconds (XSCREENSAVER_MIN_TIMEOUT
/ 2,
304 (GSourceFunc
) fake_event
, scr
);
309 #endif /* HAVE_XTEST */
311 XLockDisplay (GDK_DISPLAY());
312 XGetScreenSaver(GDK_DISPLAY(), &scr
->priv
->timeout
,
313 &scr
->priv
->interval
,
314 &scr
->priv
->prefer_blanking
,
315 &scr
->priv
->allow_exposures
);
316 XSetScreenSaver(GDK_DISPLAY(), 0, 0,
317 DontPreferBlanking
, DontAllowExposures
);
318 XUnlockDisplay (GDK_DISPLAY());
322 screensaver_init_x11 (TotemScrsaver
*scr
)
327 XLockDisplay (GDK_DISPLAY());
328 scr
->priv
->have_xtest
= (XTestQueryExtension (GDK_DISPLAY(), &a
, &b
, &c
, &d
) == True
);
329 if (scr
->priv
->have_xtest
!= FALSE
)
331 scr
->priv
->keycode1
= XKeysymToKeycode (GDK_DISPLAY(), XK_Alt_L
);
332 if (scr
->priv
->keycode1
== 0) {
333 g_warning ("scr->priv->keycode1 not existant");
335 scr
->priv
->keycode2
= XKeysymToKeycode (GDK_DISPLAY(), XK_Alt_R
);
336 if (scr
->priv
->keycode2
== 0) {
337 scr
->priv
->keycode2
= XKeysymToKeycode (GDK_DISPLAY(), XK_Alt_L
);
338 if (scr
->priv
->keycode2
== 0) {
339 g_warning ("scr->priv->keycode2 not existant");
342 scr
->priv
->keycode
= &scr
->priv
->keycode1
;
344 XUnlockDisplay (GDK_DISPLAY());
345 #endif /* HAVE_XTEST */
349 screensaver_finalize_x11 (TotemScrsaver
*scr
)
351 g_source_remove_by_user_data (scr
);
356 totem_scrsaver_class_init (TotemScrsaverClass
*klass
)
358 GObjectClass
*object_class
= G_OBJECT_CLASS (klass
);
360 parent_class
= g_type_class_peek_parent (klass
);
362 object_class
->finalize
= totem_scrsaver_finalize
;
366 totem_scrsaver_new (void)
368 return TOTEM_SCRSAVER (g_object_new (TOTEM_TYPE_SCRSAVER
, NULL
));
372 totem_scrsaver_init (TotemScrsaver
*scr
)
374 scr
->priv
= g_new0 (TotemScrsaverPrivate
, 1);
376 screensaver_init_dbus (scr
);
377 #ifdef GDK_WINDOWING_X11
378 screensaver_init_x11 (scr
);
380 #warning Unimplemented
385 totem_scrsaver_disable (TotemScrsaver
*scr
)
387 g_return_if_fail (TOTEM_SCRSAVER (scr
));
389 if (scr
->priv
->disabled
!= FALSE
)
392 scr
->priv
->disabled
= TRUE
;
394 if (screensaver_is_running_dbus (scr
) != FALSE
)
395 screensaver_disable_dbus (scr
);
397 #ifdef GDK_WINDOWING_X11
398 screensaver_disable_x11 (scr
);
400 #warning Unimplemented
406 totem_scrsaver_enable (TotemScrsaver
*scr
)
408 g_return_if_fail (TOTEM_SCRSAVER (scr
));
410 if (scr
->priv
->disabled
== FALSE
)
413 scr
->priv
->disabled
= FALSE
;
415 if (screensaver_is_running_dbus (scr
) != FALSE
)
416 screensaver_enable_dbus (scr
);
418 #ifdef GDK_WINDOWING_X11
419 screensaver_enable_x11 (scr
);
421 #warning Unimplemented
427 totem_scrsaver_set_state (TotemScrsaver
*scr
, gboolean enable
)
429 g_return_if_fail (TOTEM_SCRSAVER (scr
));
431 if (scr
->priv
->disabled
== !enable
)
434 scr
->priv
->disabled
= !enable
;
435 if (scr
->priv
->disabled
!= FALSE
)
436 totem_scrsaver_disable (scr
);
438 totem_scrsaver_enable (scr
);
442 totem_scrsaver_finalize (GObject
*object
)
444 TotemScrsaver
*scr
= TOTEM_SCRSAVER (object
);
446 screensaver_finalize_dbus (scr
);
447 #ifdef GDK_WINDOWING_X11
448 screensaver_finalize_x11 (scr
);
450 #warning Unimplemented
456 if (G_OBJECT_CLASS (parent_class
)->finalize
!= NULL
) {
457 (* G_OBJECT_CLASS (parent_class
)->finalize
) (object
);