From 159f4132b82d6a3b152fb8164dc5b4b6d76696da Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 23 Sep 2009 16:58:54 -0500 Subject: Stealing the lock screen function from the user-service and making it so that we lock on sleep. --- src/session-service.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src') diff --git a/src/session-service.c b/src/session-service.c index 9c3c4ef..fafcbb1 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -53,6 +53,33 @@ static DbusmenuMenuitem * logout_mi = NULL; static DbusmenuMenuitem * restart_mi = NULL; static DbusmenuMenuitem * shutdown_mi = NULL; +/* 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"); + + 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 @@ -64,6 +91,8 @@ sleep (DbusmenuMenuitem * mi, gpointer userdata) g_warning("Can not %s as no DeviceKit Power Proxy", type); } + lock_screen(); + dbus_g_proxy_call_no_reply(dkp_main_proxy, type, G_TYPE_INVALID, -- cgit v1.2.3 From 1adc4260f5ae9de44f2b0376bb3f55381479d76a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 24 Sep 2009 09:15:58 -0500 Subject: Putting in the infrastructure to have GDM settings proxy --- src/session-service.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src') diff --git a/src/session-service.c b/src/session-service.c index fafcbb1..3041517 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -44,6 +44,9 @@ 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 DBusGProxyCall * suspend_call = NULL; static DBusGProxyCall * hibernate_call = NULL; @@ -53,12 +56,26 @@ static DbusmenuMenuitem * logout_mi = NULL; static DbusmenuMenuitem * restart_mi = NULL; static DbusmenuMenuitem * shutdown_mi = NULL; +/* 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) +{ + gdm_settings_proxy = NULL; + + 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); @@ -333,6 +350,8 @@ main (int argc, char ** argv) return 1; } + g_idle_add(build_gdm_proxy, NULL); + root_menuitem = dbusmenu_menuitem_new(); g_debug("Root ID: %d", dbusmenu_menuitem_get_id(root_menuitem)); -- cgit v1.2.3 From edd1b16a9c4481381befb75215f9ba46e15885b7 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 24 Sep 2009 10:03:26 -0500 Subject: Getting the basic grabbing of the proxy and getting the autologin value. --- src/session-service.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/session-service.c b/src/session-service.c index 3041517..a5a95e6 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -46,6 +46,7 @@ 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/TimedLoginEnable"; static DBusGProxyCall * suspend_call = NULL; static DBusGProxyCall * hibernate_call = NULL; @@ -56,12 +57,72 @@ static DbusmenuMenuitem * logout_mi = NULL; 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; + } + + 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) +{ + gchar * value = NULL; + + if (dbus_g_proxy_end_call(proxy, call, NULL, G_TYPE_STRING, &value, G_TYPE_INVALID)) { + g_warning("Unable to get autologin setting."); + 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) { - gdm_settings_proxy = NULL; + 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); + + /* 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; } -- cgit v1.2.3 From 94de1260bb02a05967334b9720f9ccddafa109b5 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 24 Sep 2009 10:36:43 -0500 Subject: Setting up the signal handler to get changes to the value. --- src/session-service.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src') diff --git a/src/session-service.c b/src/session-service.c index a5a95e6..89d4655 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -114,6 +114,19 @@ build_gdm_proxy (gpointer null_data) "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", -- cgit v1.2.3 From e94767722dc9204bf00e845c4cb94400a9743cac Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 24 Sep 2009 10:40:33 -0500 Subject: Wrong string! Oops. --- src/session-service.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/session-service.c b/src/session-service.c index 89d4655..b1a6920 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -46,7 +46,7 @@ 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/TimedLoginEnable"; +static const gchar * gdm_auto_login_string = "daemon/AutomaticLoginEnable"; static DBusGProxyCall * suspend_call = NULL; static DBusGProxyCall * hibernate_call = NULL; @@ -68,6 +68,7 @@ gdm_settings_change (DBusGProxy * proxy, const gchar * value, const gchar * old, there is only one. */ return; } + g_debug("GDM Settings change: %s", new); if (g_strcmp0(new, "true") == 0) { gdm_auto_login = TRUE; -- cgit v1.2.3 From a151d8637279752a907f76ca729c1695d3420a41 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 24 Sep 2009 11:12:56 -0500 Subject: Ah, truth, you got me again! Never will I trust you. --- src/session-service.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/session-service.c b/src/session-service.c index b1a6920..0242b17 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -84,10 +84,12 @@ gdm_settings_change (DBusGProxy * proxy, const gchar * value, const gchar * old, 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, NULL, G_TYPE_STRING, &value, G_TYPE_INVALID)) { - g_warning("Unable to get autologin setting."); + 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; } -- cgit v1.2.3