diff options
-rw-r--r-- | debian/changelog | 6 | ||||
-rw-r--r-- | src/lock-helper.c | 99 | ||||
-rw-r--r-- | src/lock-helper.h | 24 | ||||
-rw-r--r-- | src/session-service.c | 19 |
4 files changed, 144 insertions, 4 deletions
diff --git a/debian/changelog b/debian/changelog index 945f9cc..1176b50 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +indicator-session (0.1.6-0ubuntu3~ppa2~betterlock2) karmic; urgency=low + + * Throttling + + -- Ted Gould <ted@ubuntu.com> Wed, 07 Oct 2009 12:59:43 -0400 + indicator-session (0.1.6-0ubuntu3~ppa2~betterlock1) karmic; urgency=low * Merging in better locking diff --git a/src/lock-helper.c b/src/lock-helper.c index b2ae7f0..b202b9d 100644 --- a/src/lock-helper.c +++ b/src/lock-helper.c @@ -1,9 +1,31 @@ +/* +A small helper for locking the screen. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould <ted@canonical.com> + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see <http://www.gnu.org/licenses/>. +*/ #include <dbus/dbus-glib.h> #include "lock-helper.h" static DBusGProxy * gss_proxy = NULL; static GMainLoop * gss_mainloop = NULL; +static guint cookie = 0; +static DBusGProxyCall * cookie_call = NULL; static DBusGProxy * gdm_settings_proxy = NULL; static gboolean gdm_auto_login = FALSE; @@ -13,6 +35,83 @@ static gboolean is_guest = FALSE; static gdm_autologin_cb_t gdm_autologin_cb = NULL; +/* Checks to see if there is an error and reports + it. Not much else we can do. */ +static void +unthrottle_return (DBusGProxy * proxy, DBusGProxyCall * call, gpointer data) +{ + GError * error = NULL; + dbus_g_proxy_end_call(proxy, call, &error, + G_TYPE_INVALID); + + if (error != NULL) { + g_warning("Unable to unthrottle: %s", error->message); + } + return; +} + +/* Sends an unthrottle if we're throttled. */ +void +screensaver_unthrottle (void) +{ + g_return_if_fail(cookie != 0); + + dbus_g_proxy_begin_call(gss_proxy, "UnThrottle", + unthrottle_return, NULL, + NULL, + G_TYPE_UINT, cookie, + G_TYPE_INVALID); + + cookie = 0; + return; +} + +/* Gets there return cookie from the throttle command + and sets things valid */ +static void +throttle_return (DBusGProxy * proxy, DBusGProxyCall * call, gpointer data) +{ + GError * error = NULL; + cookie_call = NULL; + + dbus_g_proxy_end_call(proxy, call, &error, + G_TYPE_UINT, &cookie, + G_TYPE_INVALID); + + if (error != NULL) { + g_warning("Unable to throttle the screensaver: %s", error->message); + return; + } + + + if (cookie == 0) { + g_warning("We didn't get a throttle cookie!"); + } + + return; +} + +/* Throttling the screensaver by using the screen saver + command. */ +void +screensaver_throttle (gchar * reason) +{ + g_return_if_fail(cookie_call == NULL); + g_return_if_fail(will_lock_screen()); + + if (cookie != 0) { + screensaver_unthrottle(); + } + + cookie_call = dbus_g_proxy_begin_call(gss_proxy, "Throttle", + throttle_return, NULL, + NULL, + G_TYPE_STRING, reason, + G_TYPE_INVALID); + + return; +} + /* Setting up a call back */ void lock_screen_gdm_cb_set (gdm_autologin_cb_t cb) diff --git a/src/lock-helper.h b/src/lock-helper.h index 9a0571c..b4a382e 100644 --- a/src/lock-helper.h +++ b/src/lock-helper.h @@ -1,3 +1,24 @@ +/* +A small helper for locking the screen. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould <ted@canonical.com> + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + #ifndef LOCK_HELPER_H__ #define LOCK_HELPER_H__ @@ -5,6 +26,9 @@ typedef void (*gdm_autologin_cb_t) (void); +void screensaver_throttle (gchar * reason); +void screensaver_unthrottle (void); + gboolean will_lock_screen (void); void lock_screen (DbusmenuMenuitem * mi, gpointer data); gboolean lock_screen_setup (gpointer data); diff --git a/src/session-service.c b/src/session-service.c index 3c0535f..a4240be 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -55,6 +55,14 @@ static DbusmenuMenuitem * logout_mi = NULL; static DbusmenuMenuitem * restart_mi = NULL; static DbusmenuMenuitem * shutdown_mi = NULL; +/* A return from the command to sleep the system. Make sure + that we unthrottle the screensaver. */ +static void +sleep_response (DBusGProxy * proxy, DBusGProxyCall * call, gpointer data) +{ + screensaver_unthrottle(); + return; +} /* Let's put this machine to sleep, with some info on how it should sleep. */ @@ -67,12 +75,15 @@ sleep (DbusmenuMenuitem * mi, gpointer userdata) g_warning("Can not %s as no DeviceKit Power Proxy", type); } + screensaver_throttle(type); lock_screen(NULL, NULL); - dbus_g_proxy_call_no_reply(dkp_main_proxy, - type, - G_TYPE_INVALID, - G_TYPE_INVALID); + dbus_g_proxy_begin_call(dkp_main_proxy, + type, + sleep_response, + NULL, + NULL, + G_TYPE_INVALID); return; } |