aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog6
-rw-r--r--src/lock-helper.c99
-rw-r--r--src/lock-helper.h24
-rw-r--r--src/session-service.c19
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;
}