aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTed Gould <ted@canonical.com>2009-10-07 10:35:31 -0400
committerTed Gould <ted@canonical.com>2009-10-07 10:35:31 -0400
commitf191e53698a12c1e06ed29c53b8c1a898bba52a1 (patch)
tree8e71239188351a2e33a7811ae898b8705568e3c0 /src
parentbbcd3463c32730a2c3ff0d85947e54d0a6672745 (diff)
parentb90777f78569b41e8ef6cdd065fc44a2ab4bd19b (diff)
downloadayatana-indicator-session-f191e53698a12c1e06ed29c53b8c1a898bba52a1.tar.gz
ayatana-indicator-session-f191e53698a12c1e06ed29c53b8c1a898bba52a1.tar.bz2
ayatana-indicator-session-f191e53698a12c1e06ed29c53b8c1a898bba52a1.zip
Merging in better locking
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am13
-rw-r--r--src/gtk-dialog/logout-dialog.c1
-rw-r--r--src/lock-helper.c226
-rw-r--r--src/lock-helper.h13
-rw-r--r--src/session-service.c126
-rw-r--r--src/users-service.c133
6 files changed, 263 insertions, 249 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 17d14e1..fefcd37 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -112,7 +112,12 @@ status-provider-mc5-marshal.c: $(srcdir)/status-provider-mc5.list
# Users Stuff
###############
-indicator_users_service_SOURCES = users-service.c users-service-dbus.c users-service-marshal.c
+indicator_users_service_SOURCES = \
+ lock-helper.c \
+ lock-helper.h \
+ users-service.c \
+ users-service-dbus.c \
+ users-service-marshal.c
indicator_users_service_CFLAGS = $(USERSSERVICE_CFLAGS) -Wall -Werror
indicator_users_service_LDADD = $(USERSSERVICE_LIBS)
@@ -120,7 +125,11 @@ indicator_users_service_LDADD = $(USERSSERVICE_LIBS)
# Session Stuff
#################
-indicator_session_service_SOURCES = session-service.c gtk-dialog/gconf-helper.c
+indicator_session_service_SOURCES = \
+ lock-helper.c \
+ lock-helper.h \
+ session-service.c \
+ gtk-dialog/gconf-helper.c
indicator_session_service_CFLAGS = $(SESSIONSERVICE_CFLAGS) $(GCONF_CFLAGS) -DLIBEXECDIR=\"$(libexecdir)\" -Wall -Werror
indicator_session_service_LDADD = $(SESSIONSERVICE_LIBS) $(GCONF_LIBS)
diff --git a/src/gtk-dialog/logout-dialog.c b/src/gtk-dialog/logout-dialog.c
index c53590e..65df9fe 100644
--- a/src/gtk-dialog/logout-dialog.c
+++ b/src/gtk-dialog/logout-dialog.c
@@ -163,6 +163,7 @@ set_property (GObject * object, guint param_id, const GValue * value, GParamSpec
gtk_image_set_from_icon_name(GTK_IMAGE(dialog->image), icon_strings[dialog->action], GTK_ICON_SIZE_DIALOG);
gtk_window_set_title (GTK_WINDOW(dialog), _(title_strings[dialog->action]));
+ gtk_window_set_icon_name (GTK_WINDOW(dialog), icon_strings[dialog->action]);
gtk_widget_hide(dialog->message);
gtk_button_set_label(GTK_BUTTON(dialog->ok_button), _(button_strings[dialog->action]));
diff --git a/src/lock-helper.c b/src/lock-helper.c
new file mode 100644
index 0000000..b2ae7f0
--- /dev/null
+++ b/src/lock-helper.c
@@ -0,0 +1,226 @@
+
+#include <dbus/dbus-glib.h>
+#include "lock-helper.h"
+
+static DBusGProxy * gss_proxy = NULL;
+static GMainLoop * gss_mainloop = NULL;
+
+static DBusGProxy * gdm_settings_proxy = NULL;
+static gboolean gdm_auto_login = FALSE;
+static const gchar * gdm_auto_login_string = "daemon/AutomaticLoginEnable";
+
+static gboolean is_guest = FALSE;
+
+static gdm_autologin_cb_t gdm_autologin_cb = NULL;
+
+/* Setting up a call back */
+void
+lock_screen_gdm_cb_set (gdm_autologin_cb_t cb)
+{
+ if (gdm_autologin_cb) {
+ g_warning("Already had a callback, setting up a new one...");
+ }
+
+ gdm_autologin_cb = cb;
+ return;
+}
+
+/* This is our logic on whether the screen should be locked
+ or not. It effects everything else. */
+gboolean
+will_lock_screen (void)
+{
+ if (gdm_auto_login) {
+ return FALSE;
+ }
+ if (is_guest) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/* Respond to the signal of autologin changing to see if the
+ setting for timed login changes. */
+static void
+gdm_settings_change (DBusGProxy * proxy, const gchar * value, const gchar * old, const gchar * new, gpointer data)
+{
+ if (g_strcmp0(value, gdm_auto_login_string)) {
+ /* This is not a setting that we care about,
+ there is only one. */
+ return;
+ }
+ g_debug("GDM Settings change: %s", new);
+
+ if (g_strcmp0(new, "true") == 0) {
+ gdm_auto_login = TRUE;
+ } else {
+ gdm_auto_login = FALSE;
+ }
+
+ if (gdm_autologin_cb != NULL) {
+ gdm_autologin_cb();
+ }
+
+ return;
+}
+
+/* Get back the data from querying to see if there is auto
+ login enabled in GDM */
+static void
+gdm_get_autologin (DBusGProxy * proxy, DBusGProxyCall * call, gpointer data)
+{
+ GError * error = NULL;
+ gchar * value = NULL;
+
+ if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_STRING, &value, G_TYPE_INVALID)) {
+ g_warning("Unable to get autologin setting: %s", error != NULL ? error->message : "null");
+ g_error_free(error);
+ return;
+ }
+
+ g_return_if_fail(value != NULL);
+ gdm_settings_change(proxy, gdm_auto_login_string, NULL, value, NULL);
+
+ return;
+}
+
+/* Sets up the proxy and queries for the setting to know
+ whether we're doing an autologin. */
+static void
+build_gdm_proxy (void)
+{
+ g_return_if_fail(gdm_settings_proxy == NULL);
+
+ /* Grab the system bus */
+ DBusGConnection * bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL);
+ g_return_if_fail(bus != NULL);
+
+ /* Get the settings proxy */
+ gdm_settings_proxy = dbus_g_proxy_new_for_name_owner(bus,
+ "org.gnome.DisplayManager",
+ "/org/gnome/DisplayManager/Settings",
+ "org.gnome.DisplayManager.Settings", NULL);
+ g_return_if_fail(gdm_settings_proxy != NULL);
+
+ /* Signal for value changed */
+ dbus_g_proxy_add_signal(gdm_settings_proxy,
+ "ValueChanged",
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_INVALID);
+ dbus_g_proxy_connect_signal(gdm_settings_proxy,
+ "ValueChanged",
+ G_CALLBACK(gdm_settings_change),
+ NULL,
+ NULL);
+
+ /* Start to get the initial value */
+ dbus_g_proxy_begin_call(gdm_settings_proxy,
+ "GetValue",
+ gdm_get_autologin,
+ NULL,
+ NULL,
+ G_TYPE_STRING,
+ gdm_auto_login_string,
+ G_TYPE_INVALID);
+
+ return;
+}
+
+/* When the screensave go active, if we've got a mainloop
+ running we should quit it. */
+static void
+gss_active_changed (DBusGProxy * proxy, gboolean active, gpointer data)
+{
+ if (active && gss_mainloop != NULL) {
+ g_main_loop_quit(gss_mainloop);
+ }
+
+ return;
+}
+
+/* Build the gss proxy and set up it's signals */
+void
+build_gss_proxy (void)
+{
+ DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
+ g_return_if_fail(session_bus != NULL);
+
+ gss_proxy = dbus_g_proxy_new_for_name_owner(session_bus,
+ "org.gnome.ScreenSaver",
+ "/",
+ "org.gnome.ScreenSaver",
+ NULL);
+ g_return_if_fail(gss_proxy != NULL);
+
+ dbus_g_proxy_add_signal(gss_proxy, "ActiveChanged", G_TYPE_BOOLEAN, G_TYPE_INVALID);
+ dbus_g_proxy_connect_signal(gss_proxy, "ActiveChanged", G_CALLBACK(gss_active_changed), NULL, NULL);
+
+ return;
+}
+
+/* This is a timeout, we only want to wait for the screen to
+ lock for a little bit, but not forever. */
+static gboolean
+activate_timeout (gpointer data)
+{
+ guint * address = (guint *)data;
+ *address = 0;
+
+ if (gss_mainloop != NULL) {
+ g_main_loop_quit(gss_mainloop);
+ }
+
+ return FALSE;
+}
+
+/* A fun little function to actually lock the screen. If,
+ that's what you want, let's do it! */
+void
+lock_screen (DbusmenuMenuitem * mi, gpointer data)
+{
+ g_debug("Lock Screen");
+ if (!will_lock_screen()) {
+ g_debug("\tGDM set to autologin, blocking lock");
+ return;
+ }
+
+ g_return_if_fail(gss_proxy != NULL);
+
+ dbus_g_proxy_call_no_reply(gss_proxy,
+ "Lock",
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+
+ if (gss_mainloop == NULL) {
+ gss_mainloop = g_main_loop_new(NULL, FALSE);
+ }
+
+ guint timer = g_timeout_add_seconds(1, activate_timeout, &timer);
+
+ g_main_loop_run(gss_mainloop);
+
+ if (timer != 0) {
+ g_source_remove(timer);
+ }
+
+ return;
+}
+
+/* Do what it takes to make the lock screen function work
+ and be happy. */
+gboolean
+lock_screen_setup (gpointer data)
+{
+ if (!g_strcmp0(g_get_user_name(), "guest")) {
+ is_guest = TRUE;
+ }
+
+ build_gdm_proxy();
+ build_gss_proxy();
+
+ return FALSE;
+}
+
diff --git a/src/lock-helper.h b/src/lock-helper.h
new file mode 100644
index 0000000..9a0571c
--- /dev/null
+++ b/src/lock-helper.h
@@ -0,0 +1,13 @@
+#ifndef LOCK_HELPER_H__
+#define LOCK_HELPER_H__
+
+#include <libdbusmenu-glib/menuitem.h>
+
+typedef void (*gdm_autologin_cb_t) (void);
+
+gboolean will_lock_screen (void);
+void lock_screen (DbusmenuMenuitem * mi, gpointer data);
+gboolean lock_screen_setup (gpointer data);
+void lock_screen_gdm_cb_set (gdm_autologin_cb_t cb);
+
+#endif /* LOCK_HELPER_H__ */
diff --git a/src/session-service.c b/src/session-service.c
index 0242b17..3c0535f 100644
--- a/src/session-service.c
+++ b/src/session-service.c
@@ -35,6 +35,8 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include "gtk-dialog/gconf-helper.h"
+#include "lock-helper.h"
+
#define DKP_ADDRESS "org.freedesktop.DeviceKit.Power"
#define DKP_OBJECT "/org/freedesktop/DeviceKit/Power"
#define DKP_INTERFACE "org.freedesktop.DeviceKit.Power"
@@ -44,10 +46,6 @@ static GMainLoop * mainloop = NULL;
static DBusGProxy * dkp_main_proxy = NULL;
static DBusGProxy * dkp_prop_proxy = NULL;
-static DBusGProxy * gdm_settings_proxy = NULL;
-static gboolean gdm_auto_login = FALSE;
-static const gchar * gdm_auto_login_string = "daemon/AutomaticLoginEnable";
-
static DBusGProxyCall * suspend_call = NULL;
static DBusGProxyCall * hibernate_call = NULL;
@@ -58,122 +56,6 @@ static DbusmenuMenuitem * restart_mi = NULL;
static DbusmenuMenuitem * shutdown_mi = NULL;
-/* Respond to the signal of autologin changing to see if the
- setting for timed login changes. */
-static void
-gdm_settings_change (DBusGProxy * proxy, const gchar * value, const gchar * old, const gchar * new, gpointer data)
-{
- if (g_strcmp0(value, gdm_auto_login_string)) {
- /* This is not a setting that we care about,
- there is only one. */
- return;
- }
- g_debug("GDM Settings change: %s", new);
-
- if (g_strcmp0(new, "true") == 0) {
- gdm_auto_login = TRUE;
- } else {
- gdm_auto_login = FALSE;
- }
-
- return;
-}
-
-/* Get back the data from querying to see if there is auto
- login enabled in GDM */
-static void
-gdm_get_autologin (DBusGProxy * proxy, DBusGProxyCall * call, gpointer data)
-{
- GError * error = NULL;
- gchar * value = NULL;
-
- if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_STRING, &value, G_TYPE_INVALID)) {
- g_warning("Unable to get autologin setting: %s", error != NULL ? error->message : "null");
- g_error_free(error);
- return;
- }
-
- g_return_if_fail(value != NULL);
- gdm_settings_change(proxy, gdm_auto_login_string, NULL, value, NULL);
-
- return;
-}
-
-/* Sets up the proxy and queries for the setting to know
- whether we're doing an autologin. */
-static gboolean
-build_gdm_proxy (gpointer null_data)
-{
- g_return_val_if_fail(gdm_settings_proxy == NULL, FALSE);
-
- /* Grab the system bus */
- DBusGConnection * bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL);
- g_return_val_if_fail(bus != NULL, FALSE);
-
- /* Get the settings proxy */
- gdm_settings_proxy = dbus_g_proxy_new_for_name_owner(bus,
- "org.gnome.DisplayManager",
- "/org/gnome/DisplayManager/Settings",
- "org.gnome.DisplayManager.Settings", NULL);
- g_return_val_if_fail(gdm_settings_proxy != NULL, FALSE);
-
- /* Signal for value changed */
- dbus_g_proxy_add_signal(gdm_settings_proxy,
- "ValueChanged",
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_INVALID);
- dbus_g_proxy_connect_signal(gdm_settings_proxy,
- "ValueChanged",
- G_CALLBACK(gdm_settings_change),
- NULL,
- NULL);
-
- /* Start to get the initial value */
- dbus_g_proxy_begin_call(gdm_settings_proxy,
- "GetValue",
- gdm_get_autologin,
- NULL,
- NULL,
- G_TYPE_STRING,
- gdm_auto_login_string,
- G_TYPE_INVALID);
-
- return FALSE;
-}
-
-/* A fun little function to actually lock the screen. If,
- that's what you want, let's do it! */
-static void
-lock_screen (void)
-{
- g_debug("Lock Screen");
- if (gdm_auto_login) {
- g_debug("\tGDM set to autologin, blocking lock");
- return;
- }
-
- DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
- g_return_if_fail(session_bus != NULL);
-
- DBusGProxy * proxy = dbus_g_proxy_new_for_name_owner(session_bus,
- "org.gnome.ScreenSaver",
- "/",
- "org.gnome.ScreenSaver",
- NULL);
- g_return_if_fail(proxy != NULL);
-
- dbus_g_proxy_call_no_reply(proxy,
- "Lock",
- G_TYPE_INVALID,
- G_TYPE_INVALID);
-
- g_object_unref(proxy);
-
- return;
-}
-
/* Let's put this machine to sleep, with some info on how
it should sleep. */
static void
@@ -185,7 +67,7 @@ sleep (DbusmenuMenuitem * mi, gpointer userdata)
g_warning("Can not %s as no DeviceKit Power Proxy", type);
}
- lock_screen();
+ lock_screen(NULL, NULL);
dbus_g_proxy_call_no_reply(dkp_main_proxy,
type,
@@ -427,7 +309,7 @@ main (int argc, char ** argv)
return 1;
}
- g_idle_add(build_gdm_proxy, NULL);
+ g_idle_add(lock_screen_setup, NULL);
root_menuitem = dbusmenu_menuitem_new();
g_debug("Root ID: %d", dbusmenu_menuitem_get_id(root_menuitem));
diff --git a/src/users-service.c b/src/users-service.c
index 5a189c8..b4310da 100644
--- a/src/users-service.c
+++ b/src/users-service.c
@@ -35,6 +35,7 @@
#include "dbus-shared-names.h"
#include "users-service-dbus.h"
+#include "lock-helper.h"
#define GUEST_SESSION_LAUNCHER "/usr/share/gdm/guest-session/guest-session-launch"
@@ -54,11 +55,6 @@ static GMainLoop *mainloop = NULL;
static UsersServiceDbus *dbus_interface = NULL;
static DbusmenuMenuitem *lock_menuitem = NULL;
-static gboolean is_guest = FALSE;
-
-static DBusGProxy * gdm_settings_proxy = NULL;
-static gboolean gdm_auto_login = FALSE;
-static const gchar * gdm_auto_login_string = "daemon/AutomaticLoginEnable";
static gint count;
static GList *users;
@@ -66,96 +62,17 @@ static GList *users;
/* Respond to the signal of autologin changing to see if the
setting for timed login changes. */
static void
-gdm_settings_change (DBusGProxy * proxy, const gchar * value, const gchar * old, const gchar * new, gpointer data)
+gdm_settings_change (void)
{
- if (g_strcmp0(value, gdm_auto_login_string)) {
- /* This is not a setting that we care about,
- there is only one. */
- return;
- }
- g_debug("GDM Settings change: %s", new);
-
- if (g_strcmp0(new, "true") == 0) {
- gdm_auto_login = TRUE;
+ if (!will_lock_screen()) {
+ dbusmenu_menuitem_property_set(lock_menuitem, DBUSMENU_MENUITEM_PROP_SENSITIVE, "false");
} else {
- gdm_auto_login = FALSE;
- }
-
- if (lock_menuitem != NULL) {
- if (gdm_auto_login || is_guest) {
- dbusmenu_menuitem_property_set(lock_menuitem, DBUSMENU_MENUITEM_PROP_SENSITIVE, "false");
- } else {
- dbusmenu_menuitem_property_set(lock_menuitem, DBUSMENU_MENUITEM_PROP_SENSITIVE, "true");
- }
+ dbusmenu_menuitem_property_set(lock_menuitem, DBUSMENU_MENUITEM_PROP_SENSITIVE, "true");
}
return;
}
-/* Get back the data from querying to see if there is auto
- login enabled in GDM */
-static void
-gdm_get_autologin (DBusGProxy * proxy, DBusGProxyCall * call, gpointer data)
-{
- GError * error = NULL;
- gchar * value = NULL;
-
- if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_STRING, &value, G_TYPE_INVALID)) {
- g_warning("Unable to get autologin setting: %s", error != NULL ? error->message : "null");
- g_error_free(error);
- return;
- }
-
- g_return_if_fail(value != NULL);
- gdm_settings_change(proxy, gdm_auto_login_string, NULL, value, NULL);
-
- return;
-}
-
-/* Sets up the proxy and queries for the setting to know
- whether we're doing an autologin. */
-static gboolean
-build_gdm_proxy (gpointer null_data)
-{
- g_return_val_if_fail(gdm_settings_proxy == NULL, FALSE);
-
- /* Grab the system bus */
- DBusGConnection * bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL);
- g_return_val_if_fail(bus != NULL, FALSE);
-
- /* Get the settings proxy */
- gdm_settings_proxy = dbus_g_proxy_new_for_name_owner(bus,
- "org.gnome.DisplayManager",
- "/org/gnome/DisplayManager/Settings",
- "org.gnome.DisplayManager.Settings", NULL);
- g_return_val_if_fail(gdm_settings_proxy != NULL, FALSE);
-
- /* Signal for value changed */
- dbus_g_proxy_add_signal(gdm_settings_proxy,
- "ValueChanged",
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_INVALID);
- dbus_g_proxy_connect_signal(gdm_settings_proxy,
- "ValueChanged",
- G_CALLBACK(gdm_settings_change),
- NULL,
- NULL);
-
- /* Start to get the initial value */
- dbus_g_proxy_begin_call(gdm_settings_proxy,
- "GetValue",
- gdm_get_autologin,
- NULL,
- NULL,
- G_TYPE_STRING,
- gdm_auto_login_string,
- G_TYPE_INVALID);
-
- return FALSE;
-}
-
static gboolean
check_guest_session (void)
{
@@ -222,37 +139,6 @@ activate_new_session (DbusmenuMenuitem * mi, gpointer user_data)
return;
}
-/* A fun little function to actually lock the screen. If,
- that's what you want, let's do it! */
-static void
-lock_screen (DbusmenuMenuitem * mi, gpointer data)
-{
- g_debug("Lock Screen");
- if (gdm_auto_login) {
- g_debug("\tGDM set to autologin, blocking lock");
- return;
- }
-
- DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
- g_return_if_fail(session_bus != NULL);
-
- DBusGProxy * proxy = dbus_g_proxy_new_for_name_owner(session_bus,
- "org.gnome.ScreenSaver",
- "/",
- "org.gnome.ScreenSaver",
- NULL);
- g_return_if_fail(proxy != NULL);
-
- dbus_g_proxy_call_no_reply(proxy,
- "Lock",
- G_TYPE_INVALID,
- G_TYPE_INVALID);
-
- g_object_unref(proxy);
-
- return;
-}
-
static void
activate_user_session (DbusmenuMenuitem *mi, gpointer user_data)
{
@@ -292,7 +178,7 @@ rebuild_items (DbusmenuMenuitem *root,
dbusmenu_menuitem_property_set(lock_menuitem, DBUSMENU_MENUITEM_PROP_LABEL, _("Lock Screen"));
g_signal_connect(G_OBJECT(lock_menuitem), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(lock_screen), NULL);
dbusmenu_menuitem_child_append(root, lock_menuitem);
- if (gdm_auto_login || is_guest) {
+ if (!will_lock_screen()) {
dbusmenu_menuitem_property_set(lock_menuitem, DBUSMENU_MENUITEM_PROP_SENSITIVE, "false");
} else {
dbusmenu_menuitem_property_set(lock_menuitem, DBUSMENU_MENUITEM_PROP_SENSITIVE, "true");
@@ -410,11 +296,8 @@ main (int argc, char ** argv)
return 1;
}
- if (!g_strcmp0(g_get_user_name(), "guest")) {
- is_guest = TRUE;
- }
-
- g_idle_add(build_gdm_proxy, NULL);
+ g_idle_add(lock_screen_setup, NULL);
+ lock_screen_gdm_cb_set(gdm_settings_change);
dbus_interface = g_object_new (USERS_SERVICE_DBUS_TYPE, NULL);