diff options
-rw-r--r-- | debian/changelog | 6 | ||||
-rw-r--r-- | src/Makefile.am | 13 | ||||
-rw-r--r-- | src/gtk-dialog/logout-dialog.c | 1 | ||||
-rw-r--r-- | src/lock-helper.c | 226 | ||||
-rw-r--r-- | src/lock-helper.h | 13 | ||||
-rw-r--r-- | src/session-service.c | 126 | ||||
-rw-r--r-- | src/users-service.c | 133 |
7 files changed, 269 insertions, 249 deletions
diff --git a/debian/changelog b/debian/changelog index de3fa75..68c90f8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +indicator-session (0.1.6-0ubuntu3~ppa2~betterlock1) UNRELEASED; urgency=low + + * Merging in better locking + + -- Ted Gould <ted@ubuntu.com> Wed, 07 Oct 2009 10:35:15 -0400 + indicator-session (0.1.6-0ubuntu3~ppa1) karmic; urgency=low * Asynchronized the menu handling so that it's in the right 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); |