ScreenSaverWrapper
xscreensaver
Detect
Use $DISPLAY and search to find a window with the unique XA_SCREENSAVER_VERSION property.
xscreensaver-demo (the control panel) is driver/demo-Gtk.c and uses:
xscreensaver_running_p (state *s) { char *rversion = NULL; server_xscreensaver_version (dpy, &rversion, 0, 0); return rversion != NULL; }
To do it from the command line:
$ xscreensaver-command -version xscreensaver-command: no screensaver is running on display :0.0
Communicate
Uses $DISPLAY and then send a custom XAtom via an Xevent:
$ xscreensaver-command -deactive XA_DEACTIVATE = XInternAtom (dpy, "DEACTIVATE", False); if (!strncmp (s, "-deactivate", L)) cmd = &XA_DEACTIVATE; event.xclient.message_type = XA_SCREENSAVER; event.xclient.data.l[0] = (long) command;
Notes
after matching, xscreensaver-4.23/driver/screensaver-command.c which calls into remote.c for the dirty work.
gnome-screensaver
gnome-screensaver-2.13.92/src/gnome-screensaver-command.c:
Detect
Use the Session DBus to check for org.gnome.ScreenSaver being owned:
connection = dbus_bus_get (DBUS_BUS_SESSION, &dbus_error); dbus_bus_name_has_owner(connection, "org.gnome.ScreenSaver");
On the command-line:
$ gnome-screensaver-command --version gnome-screensaver-command 2.14.0
Communicate
Sends a Message over the session DBus:
message = dbus_message_new_method_call( "org.gnome.ScreenSaver", "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver", "Poke"); message = dbus_message_new_method_call( "org.gnome.ScreenSaver", "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver", ("setActive", FALSE));
Or on the command-line:
$ gnome-screensaver --poke $ gnome-screensaver --deactivate
...which basically end up doing the same thing after 4 levels of indirection as Poke calls gs_watcher_reset() which calls:
gs_watcher_set_active (watcher, FALSE); gs_watcher_set_active (watcher, TRUE);
Kscreensaver
Kscreensaver already has code to (a) detect (b) ping xscreensaver and kscreensaver: http://www.koders.com/cpp/fid5EFB9027E1545F96F8B3A51780B37B88AB255A0D.aspx
PaulSladen/ScreenSaverWrapper (last edited 2008-08-06 16:37:12 by localhost)