From de04f7ce9ae92df14ae59f7b411fb508068669a2 Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Mon, 8 Feb 2010 10:13:02 -0600 Subject: Lockdown --- src/session-service.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 5 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 8306d02..33d7bec 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -50,6 +50,9 @@ with this program. If not, see . #define GUEST_SESSION_LAUNCHER "/usr/share/gdm/guest-session/guest-session-launch" +#define LOCKDOWN_DIR "/desktop/gnome/lockdown" +#define LOCKDOWN_KEY LOCKDOWNDIR "/disable_user_switching" + typedef struct _ActivateData ActivateData; struct _ActivateData { @@ -62,6 +65,7 @@ static DBusGProxy *gdm_proxy = NULL; static UsersServiceDbus *dbus_interface = NULL; static DbusmenuMenuitem *lock_menuitem = NULL; +static DbusmenuMenuitem *switch_menuitem = NULL; static gint count; static GList *users; @@ -80,6 +84,50 @@ static DbusmenuMenuitem * logout_mi = NULL; static DbusmenuMenuitem * restart_mi = NULL; static DbusmenuMenuitem * shutdown_mi = NULL; +static GConfClient * gconf_client = NULL; +static guint notify_lockdown_id = 0; + +static void +lockdown_changed (GConfClient *client, + guint cnxd_id, + GConfEntry *entry, + gpointer user_data) +{ + GConfValue *value = gconf_entry_get_value (entry); + const gchar *key = gconf_entry_get_key (entry); + + if (!value || !key) + return; + + if (g_strcmp0 (key, LOCKDOWN_KEY) == 0) + { + if (gconf_value_get_bool (value)) + { + dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + } + else + { + dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + } + } +} + +static void +ensure_gconf_client (void) +{ + if (!gconf_client) + { + gconf_client = gconf_client_get_default (); + + notify_lockdown_id = gconf_client_notify_add (gconf_client, + LOCKDOWN_KEY, + (GConfClientNotifyFunc)lockdown_changed, + NULL, + NULL, + NULL); + } +} + /* A return from the command to sleep the system. Make sure that we unthrottle the screensaver. */ static void @@ -441,13 +489,18 @@ rebuild_items (DbusmenuMenuitem *root, if (check_new_session ()) { - mi = dbusmenu_menuitem_new (); - dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch User...")); - dbusmenu_menuitem_child_append (root, mi); - g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_new_session), NULL); + ensure_gconf_client (); + + if (gconf_client_get_bool (gconf_client, LOCKDOWN_KEY, NULL)) + { + switch_menuitem = dbusmenu_menuitem_new (); + dbusmenu_menuitem_property_set (switch_menuitem, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch User...")); + dbusmenu_menuitem_child_append (root, switch_menuitem); + g_signal_connect (G_OBJECT (switch_menuitem), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_new_session), NULL); + } } } - + DbusmenuMenuitem * separator = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR); dbusmenu_menuitem_child_append(root, separator); -- cgit v1.2.3 From a16c8f412a4fe6f57a59386787081118730426c4 Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Mon, 8 Feb 2010 10:19:49 -0600 Subject: Fix a typo --- src/session-service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 33d7bec..0038931 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -51,7 +51,7 @@ with this program. If not, see . #define GUEST_SESSION_LAUNCHER "/usr/share/gdm/guest-session/guest-session-launch" #define LOCKDOWN_DIR "/desktop/gnome/lockdown" -#define LOCKDOWN_KEY LOCKDOWNDIR "/disable_user_switching" +#define LOCKDOWN_KEY LOCKDOWN_DIR "/disable_user_switching" typedef struct _ActivateData ActivateData; struct _ActivateData -- cgit v1.2.3 From eedadcc3cf3a3f76fbe7b308a9ae7f0fa1f888d7 Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Mon, 8 Feb 2010 11:01:13 -0600 Subject: Check switch_menuitem for NULL first --- src/session-service.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 0038931..62987f2 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -101,13 +101,16 @@ lockdown_changed (GConfClient *client, if (g_strcmp0 (key, LOCKDOWN_KEY) == 0) { - if (gconf_value_get_bool (value)) + if (switch_menuitem) { - dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); - } - else - { - dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + if (gconf_value_get_bool (value)) + { + dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + } + else + { + dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + } } } } -- cgit v1.2.3 From 3b8cf7767822cd7d7b0441cf6342cc731c91dafc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 8 Feb 2010 11:01:55 -0600 Subject: Removing the callback into the lock helper for GDM autologin settings change. --- src/session-service.c | 15 --------------- 1 file changed, 15 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 8306d02..c3c8431 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -264,20 +264,6 @@ show_dialog (DbusmenuMenuitem * mi, guint timestamp, gchar * type) return; } -/* Respond to the signal of autologin changing to see if the - setting for timed login changes. */ -static void -gdm_settings_change (void) -{ - if (!will_lock_screen()) { - dbusmenu_menuitem_property_set_bool(lock_menuitem, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE); - } else { - dbusmenu_menuitem_property_set_bool(lock_menuitem, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE); - } - - return; -} - /* Checks to see if we should show the guest suession item */ static gboolean check_guest_session (void) @@ -574,7 +560,6 @@ main (int argc, char ** argv) G_CALLBACK(service_shutdown), NULL); g_idle_add(lock_screen_setup, NULL); - lock_screen_gdm_cb_set(gdm_settings_change); root_menuitem = dbusmenu_menuitem_new(); g_debug("Root ID: %d", dbusmenu_menuitem_get_id(root_menuitem)); -- cgit v1.2.3 From 6335f484c1ebe1ee6f0c940614bf4dbdfaeb2e8d Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Mon, 8 Feb 2010 11:08:09 -0600 Subject: Fixes --- src/session-service.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 62987f2..621ab72 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -109,7 +109,7 @@ lockdown_changed (GConfClient *client, } else { - dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); } } } @@ -494,12 +494,18 @@ rebuild_items (DbusmenuMenuitem *root, { ensure_gconf_client (); + switch_menuitem = dbusmenu_menuitem_new (); + dbusmenu_menuitem_property_set (switch_menuitem, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch User...")); + dbusmenu_menuitem_child_append (root, switch_menuitem); + g_signal_connect (G_OBJECT (switch_menuitem), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_new_session), NULL); + if (gconf_client_get_bool (gconf_client, LOCKDOWN_KEY, NULL)) { - switch_menuitem = dbusmenu_menuitem_new (); - dbusmenu_menuitem_property_set (switch_menuitem, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch User...")); - dbusmenu_menuitem_child_append (root, switch_menuitem); - g_signal_connect (G_OBJECT (switch_menuitem), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_new_session), NULL); + dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + } + else + { + dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); } } } -- cgit v1.2.3 From 19ebc417eafb4cea2e9e1d5656c46148d8f100ed Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Mon, 8 Feb 2010 11:24:13 -0600 Subject: Remove unnecessary cast --- src/session-service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 621ab72..791611e 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -124,7 +124,7 @@ ensure_gconf_client (void) notify_lockdown_id = gconf_client_notify_add (gconf_client, LOCKDOWN_KEY, - (GConfClientNotifyFunc)lockdown_changed, + lockdown_changed, NULL, NULL, NULL); -- cgit v1.2.3 From 4ec15094555e5bc71a46f16ea9bf101e41e59631 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 8 Feb 2010 17:04:25 -0600 Subject: First pass, get the string. --- src/session-service.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index e89a9a0..3cbb29c 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -481,7 +481,9 @@ rebuild_items (DbusmenuMenuitem *root, ensure_gconf_client (); switch_menuitem = dbusmenu_menuitem_new (); - dbusmenu_menuitem_property_set (switch_menuitem, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch User...")); + gchar * switchlabel = g_strdup_printf(_("Switch from %s..."), g_get_user_name()); + dbusmenu_menuitem_property_set (switch_menuitem, DBUSMENU_MENUITEM_PROP_LABEL, switchlabel); + g_free(switchlabel); dbusmenu_menuitem_child_append (root, switch_menuitem); g_signal_connect (G_OBJECT (switch_menuitem), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_new_session), NULL); -- cgit v1.2.3 From ccaa76fac008a5de7b8eacf3f70dfe96dd15ce16 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 11 Feb 2010 16:12:01 -0600 Subject: Switching the menu item that we're creating. --- src/session-service.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 3cbb29c..b414328 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -38,6 +38,7 @@ with this program. If not, see . #include #include "dbus-shared-names.h" +#include "dbusmenu-shared.h" #include "gtk-dialog/gconf-helper.h" @@ -481,9 +482,8 @@ rebuild_items (DbusmenuMenuitem *root, ensure_gconf_client (); switch_menuitem = dbusmenu_menuitem_new (); - gchar * switchlabel = g_strdup_printf(_("Switch from %s..."), g_get_user_name()); - dbusmenu_menuitem_property_set (switch_menuitem, DBUSMENU_MENUITEM_PROP_LABEL, switchlabel); - g_free(switchlabel); + dbusmenu_menuitem_property_set (switch_menuitem, DBUSMENU_MENUITEM_PROP_TYPE, MENU_SWITCH_TYPE); + dbusmenu_menuitem_property_set (switch_menuitem, MENU_SWITCH_USER, g_get_user_name()); dbusmenu_menuitem_child_append (root, switch_menuitem); g_signal_connect (G_OBJECT (switch_menuitem), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_new_session), NULL); -- cgit v1.2.3 From 07f36b8de87ccdaebee842105bd86892f6465d3d Mon Sep 17 00:00:00 2001 From: David Barth Date: Tue, 16 Feb 2010 19:40:23 +0100 Subject: add forgotten separator and re-order the user switch entry according to the spec --- src/session-service.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index e89a9a0..a2da207 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -437,6 +437,10 @@ rebuild_items (DbusmenuMenuitem *root, if (can_activate == TRUE) { + DbusmenuMenuitem * separator1 = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(separator1, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR); + dbusmenu_menuitem_child_append(root, separator1); + if (check_guest_session ()) { mi = dbusmenu_menuitem_new (); @@ -445,6 +449,25 @@ rebuild_items (DbusmenuMenuitem *root, g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_guest_session), NULL); } + if (check_new_session ()) + { + ensure_gconf_client (); + + switch_menuitem = dbusmenu_menuitem_new (); + dbusmenu_menuitem_property_set (switch_menuitem, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch User...")); + dbusmenu_menuitem_child_append (root, switch_menuitem); + g_signal_connect (G_OBJECT (switch_menuitem), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_new_session), NULL); + + if (gconf_client_get_bool (gconf_client, LOCKDOWN_KEY, NULL)) + { + dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + } + else + { + dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); + } + } + if (count > MINIMUM_USERS && count < MAXIMUM_USERS) { if (users != NULL) @@ -476,24 +499,6 @@ rebuild_items (DbusmenuMenuitem *root, } } - if (check_new_session ()) - { - ensure_gconf_client (); - - switch_menuitem = dbusmenu_menuitem_new (); - dbusmenu_menuitem_property_set (switch_menuitem, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch User...")); - dbusmenu_menuitem_child_append (root, switch_menuitem); - g_signal_connect (G_OBJECT (switch_menuitem), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_new_session), NULL); - - if (gconf_client_get_bool (gconf_client, LOCKDOWN_KEY, NULL)) - { - dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); - } - else - { - dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); - } - } } DbusmenuMenuitem * separator = dbusmenu_menuitem_new(); -- cgit v1.2.3 From b800d54c8ab32368153003cb61d1c00f9b76ccad Mon Sep 17 00:00:00 2001 From: Martin Pitt Date: Wed, 17 Feb 2010 11:03:06 +0100 Subject: Port from DeviceKit-power to upower --- src/session-service.c | 60 +++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index e89a9a0..0d9552a 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -44,9 +44,9 @@ with this program. If not, see . #include "users-service-dbus.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" +#define UP_ADDRESS "org.freedesktop.UPower" +#define UP_OBJECT "/org/freedesktop/UPower" +#define UP_INTERFACE "org.freedesktop.UPower" #define GUEST_SESSION_LAUNCHER "/usr/share/gdm/guest-session/guest-session-launch" @@ -72,8 +72,8 @@ static GList *users; static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; -static DBusGProxy * dkp_main_proxy = NULL; -static DBusGProxy * dkp_prop_proxy = NULL; +static DBusGProxy * up_main_proxy = NULL; +static DBusGProxy * up_prop_proxy = NULL; static DBusGProxyCall * suspend_call = NULL; static DBusGProxyCall * hibernate_call = NULL; @@ -147,14 +147,14 @@ machine_sleep (DbusmenuMenuitem * mi, guint timestamp, gpointer userdata) { gchar * type = (gchar *)userdata; - if (dkp_main_proxy == NULL) { - g_warning("Can not %s as no DeviceKit Power Proxy", type); + if (up_main_proxy == NULL) { + g_warning("Can not %s as no upower proxy", type); } screensaver_throttle(type); lock_screen(NULL, 0, NULL); - dbus_g_proxy_begin_call(dkp_main_proxy, + dbus_g_proxy_begin_call(up_main_proxy, type, sleep_response, NULL, @@ -213,17 +213,17 @@ hibernate_prop_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata) /* A signal that we need to recheck to ensure we can still hibernate and/or suspend */ static void -dpk_changed_cb (DBusGProxy * proxy, gpointer user_data) +up_changed_cb (DBusGProxy * proxy, gpointer user_data) { /* Start Async call to see if we can hibernate */ if (suspend_call == NULL) { - suspend_call = dbus_g_proxy_begin_call(dkp_prop_proxy, + suspend_call = dbus_g_proxy_begin_call(up_prop_proxy, "Get", suspend_prop_cb, NULL, NULL, G_TYPE_STRING, - DKP_INTERFACE, + UP_INTERFACE, G_TYPE_STRING, "can-suspend", G_TYPE_INVALID, @@ -233,13 +233,13 @@ dpk_changed_cb (DBusGProxy * proxy, gpointer user_data) /* Start Async call to see if we can suspend */ if (hibernate_call == NULL) { - hibernate_call = dbus_g_proxy_begin_call(dkp_prop_proxy, + hibernate_call = dbus_g_proxy_begin_call(up_prop_proxy, "Get", hibernate_prop_cb, NULL, NULL, G_TYPE_STRING, - DKP_INTERFACE, + UP_INTERFACE, G_TYPE_STRING, "can-hibernate", G_TYPE_INVALID, @@ -254,39 +254,39 @@ dpk_changed_cb (DBusGProxy * proxy, gpointer user_data) DKp checking. We're even setting up the calls for the props we need */ static void -setup_dkp (void) { +setup_up (void) { DBusGConnection * bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); g_return_if_fail(bus != NULL); - if (dkp_main_proxy == NULL) { - dkp_main_proxy = dbus_g_proxy_new_for_name(bus, - DKP_ADDRESS, - DKP_OBJECT, - DKP_INTERFACE); + if (up_main_proxy == NULL) { + up_main_proxy = dbus_g_proxy_new_for_name(bus, + UP_ADDRESS, + UP_OBJECT, + UP_INTERFACE); } - g_return_if_fail(dkp_main_proxy != NULL); + g_return_if_fail(up_main_proxy != NULL); - if (dkp_prop_proxy == NULL) { - dkp_prop_proxy = dbus_g_proxy_new_for_name(bus, - DKP_ADDRESS, - DKP_OBJECT, + if (up_prop_proxy == NULL) { + up_prop_proxy = dbus_g_proxy_new_for_name(bus, + UP_ADDRESS, + UP_OBJECT, DBUS_INTERFACE_PROPERTIES); } - g_return_if_fail(dkp_prop_proxy != NULL); + g_return_if_fail(up_prop_proxy != NULL); /* Connect to changed signal */ - dbus_g_proxy_add_signal(dkp_main_proxy, + dbus_g_proxy_add_signal(up_main_proxy, "Changed", G_TYPE_INVALID); - dbus_g_proxy_connect_signal(dkp_main_proxy, + dbus_g_proxy_connect_signal(up_main_proxy, "Changed", - G_CALLBACK(dpk_changed_cb), + G_CALLBACK(up_changed_cb), NULL, NULL); /* Force an original "changed" event */ - dpk_changed_cb(dkp_main_proxy, NULL); + up_changed_cb(up_main_proxy, NULL); return; } @@ -639,7 +639,7 @@ main (int argc, char ** argv) G_CALLBACK (user_removed), root_menuitem); - setup_dkp(); + setup_up(); DbusmenuServer * server = dbusmenu_server_new(INDICATOR_SESSION_DBUS_OBJECT); dbusmenu_server_set_root(server, root_menuitem); -- cgit v1.2.3 From 6868e64c17ba4aea5f8aa22b84a6518119b6754e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 17 Feb 2010 23:39:11 -0600 Subject: Switching the guest over to a user item. --- src/session-service.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 3303317..fed4446 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -444,7 +444,9 @@ rebuild_items (DbusmenuMenuitem *root, if (check_guest_session ()) { mi = dbusmenu_menuitem_new (); - dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Guest Session")); + dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_TYPE, USER_ITEM_TYPE); + dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, _("Guest Session")); + dbusmenu_menuitem_property_set_bool (mi, USER_ITEM_PROP_LOGGED_IN, FALSE); dbusmenu_menuitem_child_append (root, mi); g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_guest_session), NULL); } -- cgit v1.2.3 From 4a297fec6d7fbc75035aa7d3d1eedb90bea98d15 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 17 Feb 2010 23:42:54 -0600 Subject: Switching users over to user items --- src/session-service.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index fed4446..1a01174 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -495,7 +495,9 @@ rebuild_items (DbusmenuMenuitem *root, user->service = service; mi = dbusmenu_menuitem_new (); - dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_LABEL, user->real_name); + dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_TYPE, USER_ITEM_TYPE); + dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, user->real_name); + dbusmenu_menuitem_property_set_bool (mi, USER_ITEM_PROP_LOGGED_IN, user->sessions != NULL); dbusmenu_menuitem_child_append (root, mi); g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_user_session), user); } -- cgit v1.2.3 From 7636e191ecf68f41ef28ae5e8811467e993aa108 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 23 Feb 2010 16:55:45 -0600 Subject: Changed names to patch current upower --- src/session-service.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 9fb9ee7..289bff8 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -226,7 +226,7 @@ up_changed_cb (DBusGProxy * proxy, gpointer user_data) G_TYPE_STRING, UP_INTERFACE, G_TYPE_STRING, - "can-suspend", + "CanSuspend", G_TYPE_INVALID, G_TYPE_VALUE, G_TYPE_INVALID); @@ -242,7 +242,7 @@ up_changed_cb (DBusGProxy * proxy, gpointer user_data) G_TYPE_STRING, UP_INTERFACE, G_TYPE_STRING, - "can-hibernate", + "CanHibernate", G_TYPE_INVALID, G_TYPE_VALUE, G_TYPE_INVALID); -- cgit v1.2.3 From 86a394ae84f4c09c0bfc7b7136bcc7e88ca04bc5 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 11:33:51 -0600 Subject: Check the UID to see if it's me --- src/session-service.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 289bff8..a2760d1 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -496,6 +496,11 @@ rebuild_items (DbusmenuMenuitem *root, user->service = service; + if (user->uid == getuid()) { + /* Hide me from the list */ + continue; + } + mi = dbusmenu_menuitem_new (); dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_TYPE, USER_ITEM_TYPE); dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, user->real_name); -- cgit v1.2.3 From 206f1003cad828ca2465088ea3fbf73b1a6a4c97 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 11:46:27 -0600 Subject: Making it so that users is not a global and just grabbed everytime and used. --- src/session-service.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index a2760d1..eeb88a9 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -69,7 +69,6 @@ static DbusmenuMenuitem *lock_menuitem = NULL; static DbusmenuMenuitem *switch_menuitem = NULL; static gint count; -static GList *users; static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; @@ -472,22 +471,11 @@ rebuild_items (DbusmenuMenuitem *root, } } + GList * users = NULL; + users = users_service_dbus_get_user_list (service); + if (count > MINIMUM_USERS && count < MAXIMUM_USERS) { - if (users != NULL) - { - GList *l = NULL; - - for (l = users; l != NULL; l = l->next) - { - users = g_list_delete_link (users, l); - } - - users = NULL; - } - - users = users_service_dbus_get_user_list (service); - users = g_list_sort (users, (GCompareFunc)compare_users_by_username); for (u = users; u != NULL; u = g_list_next (u)) @@ -509,6 +497,8 @@ rebuild_items (DbusmenuMenuitem *root, g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_user_session), user); } } + + g_list_free(users); } DbusmenuMenuitem * separator = dbusmenu_menuitem_new(); -- cgit v1.2.3 From 40ef68c195d63a7d19e1ad237fc7ebed00c9c0c2 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 11:48:18 -0600 Subject: Making it so that count is not a global and just calculated from the list. --- src/session-service.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index eeb88a9..30c14cf 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -68,8 +68,6 @@ static UsersServiceDbus *dbus_interface = NULL; static DbusmenuMenuitem *lock_menuitem = NULL; static DbusmenuMenuitem *switch_menuitem = NULL; -static gint count; - static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; static DBusGProxy * up_main_proxy = NULL; @@ -473,8 +471,9 @@ rebuild_items (DbusmenuMenuitem *root, GList * users = NULL; users = users_service_dbus_get_user_list (service); + guint user_count = g_list_length(users); - if (count > MINIMUM_USERS && count < MAXIMUM_USERS) + if (user_count > MINIMUM_USERS && user_count < MAXIMUM_USERS) { users = g_list_sort (users, (GCompareFunc)compare_users_by_username); @@ -563,8 +562,6 @@ user_added (UsersServiceDbus *service, { DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data; - count++; - rebuild_items (root, service); } @@ -577,8 +574,6 @@ user_removed (UsersServiceDbus *service, { DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data; - count--; - rebuild_items (root, service); } @@ -590,8 +585,6 @@ create_items (DbusmenuMenuitem *root, { g_return_if_fail (IS_USERS_SERVICE_DBUS (service)); - count = users_service_dbus_get_user_count (service); - rebuild_items (root, service); } -- cgit v1.2.3 From e5dd34b95bb29d4d1dc294c84bdbfe4c90f57b02 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 11:51:27 -0600 Subject: Restructuring callbacks to not need the count variable. --- src/session-service.c | 41 +++++++++-------------------------------- 1 file changed, 9 insertions(+), 32 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 30c14cf..42901a1 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -556,36 +556,13 @@ rebuild_items (DbusmenuMenuitem *root, /* Signal called when a user is added. It updates the count and rebuilds the menu */ static void -user_added (UsersServiceDbus *service, - UserData *user, - gpointer user_data) +user_change (UsersServiceDbus *service, + UserData *user, + gpointer user_data) { - DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data; - - rebuild_items (root, service); -} - -/* Signal called when a user is deleted. It updates the count and - rebuilds the menu */ -static void -user_removed (UsersServiceDbus *service, - UserData *user, - gpointer user_data) -{ - DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data; - - rebuild_items (root, service); -} - -/* Wrapper around rebuild_items that is used on the first call - so that we can initialize the count variable. */ -static void -create_items (DbusmenuMenuitem *root, - UsersServiceDbus *service) -{ - g_return_if_fail (IS_USERS_SERVICE_DBUS (service)); - - rebuild_items (root, service); + DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data; + rebuild_items (root, service); + return; } /* When the service interface starts to shutdown, we @@ -626,15 +603,15 @@ main (int argc, char ** argv) dbus_interface = g_object_new (USERS_SERVICE_DBUS_TYPE, NULL); - create_items (root_menuitem, dbus_interface); + rebuild_items (root_menuitem, dbus_interface); g_signal_connect (G_OBJECT (dbus_interface), "user-added", - G_CALLBACK (user_added), + G_CALLBACK (user_change), root_menuitem); g_signal_connect (G_OBJECT (dbus_interface), "user-removed", - G_CALLBACK (user_removed), + G_CALLBACK (user_change), root_menuitem); setup_up(); -- cgit v1.2.3 From e9d4b412bce99aee1cc4b3188c04635f95f60559 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 12:05:06 -0600 Subject: Switching things around a little bit. Making sure we always go through the list to search for the guest account to see if it's logged in. But, still not making menu entries. --- src/session-service.c | 74 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 30 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 42901a1..9e06bb0 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -412,6 +412,7 @@ rebuild_items (DbusmenuMenuitem *root, UsersServiceDbus *service) { DbusmenuMenuitem *mi = NULL; + DbusmenuMenuitem * guest_mi = NULL; GList *u; UserData *user; gboolean can_activate; @@ -441,12 +442,12 @@ rebuild_items (DbusmenuMenuitem *root, if (check_guest_session ()) { - mi = dbusmenu_menuitem_new (); - dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_TYPE, USER_ITEM_TYPE); - dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, _("Guest Session")); - dbusmenu_menuitem_property_set_bool (mi, USER_ITEM_PROP_LOGGED_IN, FALSE); - dbusmenu_menuitem_child_append (root, mi); - g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_guest_session), NULL); + guest_mi = dbusmenu_menuitem_new (); + dbusmenu_menuitem_property_set (guest_mi, DBUSMENU_MENUITEM_PROP_TYPE, USER_ITEM_TYPE); + dbusmenu_menuitem_property_set (guest_mi, USER_ITEM_PROP_NAME, _("Guest Session")); + dbusmenu_menuitem_property_set_bool (guest_mi, USER_ITEM_PROP_LOGGED_IN, FALSE); + dbusmenu_menuitem_child_append (root, guest_mi); + g_signal_connect (G_OBJECT (guest_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_guest_session), NULL); } if (check_new_session ()) @@ -473,32 +474,45 @@ rebuild_items (DbusmenuMenuitem *root, users = users_service_dbus_get_user_list (service); guint user_count = g_list_length(users); - if (user_count > MINIMUM_USERS && user_count < MAXIMUM_USERS) - { - users = g_list_sort (users, (GCompareFunc)compare_users_by_username); - - for (u = users; u != NULL; u = g_list_next (u)) - { - user = u->data; - - user->service = service; - - if (user->uid == getuid()) { - /* Hide me from the list */ - continue; - } - - mi = dbusmenu_menuitem_new (); - dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_TYPE, USER_ITEM_TYPE); - dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, user->real_name); - dbusmenu_menuitem_property_set_bool (mi, USER_ITEM_PROP_LOGGED_IN, user->sessions != NULL); - dbusmenu_menuitem_child_append (root, mi); - g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_user_session), user); - } - } + if (user_count > MINIMUM_USERS && user_count < MAXIMUM_USERS) { + users = g_list_sort (users, (GCompareFunc)compare_users_by_username); + } + + for (u = users; u != NULL; u = g_list_next (u)) { + user = u->data; + user->service = service; + + if (user->uid == getuid()) { + /* Hide me from the list */ + continue; + } + + if (g_strcmp0(user->user_name, "guest") == 0) { + /* Check to see if the guest has sessions and so therefore should + get a check mark. */ + if (user->sessions != NULL) { + dbusmenu_menuitem_property_set_bool (guest_mi, USER_ITEM_PROP_LOGGED_IN, TRUE); + } + /* If we're showing user accounts, keep going through the list */ + if (user_count > MINIMUM_USERS && user_count < MAXIMUM_USERS) { + continue; + } + /* If not, we can stop here */ + break; + } + + if (user_count > MINIMUM_USERS && user_count < MAXIMUM_USERS) { + mi = dbusmenu_menuitem_new (); + dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_TYPE, USER_ITEM_TYPE); + dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, user->real_name); + dbusmenu_menuitem_property_set_bool (mi, USER_ITEM_PROP_LOGGED_IN, user->sessions != NULL); + dbusmenu_menuitem_child_append (root, mi); + g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_user_session), user); + } + } g_list_free(users); - } + } DbusmenuMenuitem * separator = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR); -- cgit v1.2.3 From ad9dd9ec9a32d9380c12bce08d939d0f58d56555 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 16:08:23 -0600 Subject: Sort by real name --- src/session-service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 289bff8..5746f7d 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -406,7 +406,7 @@ compare_users_by_username (const gchar *a, UserData *user1 = (UserData *)a; UserData *user2 = (UserData *)b; - return g_strcmp0 (user1->user_name, user2->user_name); + return g_strcmp0 (user1->real_name, user2->real_name); } /* Builds up the menu for us */ -- cgit v1.2.3 From d723e8d4ed1e96c889d139a0f8c4cca117137c4a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 16:13:22 -0600 Subject: Creating a field for the user that has the real name in it, and a place for that to conflict. --- src/session-service.c | 10 +++++++++- src/users-service-dbus.c | 1 + src/users-service-dbus.h | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 5746f7d..21c5b8b 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -406,7 +406,15 @@ compare_users_by_username (const gchar *a, UserData *user1 = (UserData *)a; UserData *user2 = (UserData *)b; - return g_strcmp0 (user1->real_name, user2->real_name); + gint retval = g_strcmp0 (user1->real_name, user2->real_name); + + /* If they're the same, they're both in conflict. */ + if (retval == 0) { + user1->real_name_conflict = TRUE; + user2->real_name_conflict = TRUE; + } + + return retval; } /* Builds up the menu for us */ diff --git a/src/users-service-dbus.c b/src/users-service-dbus.c index 0e5c922..7d2112a 100644 --- a/src/users-service-dbus.c +++ b/src/users-service-dbus.c @@ -662,6 +662,7 @@ sync_users (UsersServiceDbus *self) user->shell = g_strdup (g_value_get_string (g_value_array_get_nth (values, 3))); user->login_count = g_value_get_int (g_value_array_get_nth (values, 4)); user->icon_url = g_strdup (g_value_get_string (g_value_array_get_nth (values, 5))); + user->real_name_conflict = FALSE; g_hash_table_insert (priv->users, g_strdup (user->user_name), diff --git a/src/users-service-dbus.h b/src/users-service-dbus.h index 41052f8..bba88a7 100644 --- a/src/users-service-dbus.h +++ b/src/users-service-dbus.h @@ -47,6 +47,8 @@ struct _UserData GList *sessions; + gboolean real_name_conflict; + UsersServiceDbus *service; }; -- cgit v1.2.3 From 03c045f5890162a53ed613fcf8f627f0dc3badc8 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 2 Mar 2010 16:17:12 -0600 Subject: If we ARE a conflicted name then we need to fallback into displaying the user name. --- src/session-service.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 21c5b8b..85874b6 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -506,7 +506,13 @@ rebuild_items (DbusmenuMenuitem *root, mi = dbusmenu_menuitem_new (); dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_TYPE, USER_ITEM_TYPE); + if (user->real_name_conflict) { + gchar * conflictedname = g_strdup_printf("%s (%s)", user->real_name, user->user_name); + dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, conflictedname); + g_free(conflictedname); + } else { dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, user->real_name); + } dbusmenu_menuitem_property_set_bool (mi, USER_ITEM_PROP_LOGGED_IN, user->sessions != NULL); dbusmenu_menuitem_child_append (root, mi); g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_user_session), user); -- cgit v1.2.3 From fe25b2a8139d0c92a30440ba20862199a04f0f9c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 12:05:28 -0600 Subject: Changing shutdowns to switch offs --- src/gtk-dialog/gconf-helper.c | 4 ++-- src/gtk-dialog/gtk-logout-helper.c | 2 +- src/gtk-dialog/logout-dialog.c | 8 ++++---- src/session-service.c | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) (limited to 'src/session-service.c') diff --git a/src/gtk-dialog/gconf-helper.c b/src/gtk-dialog/gconf-helper.c index 213592e..9262b19 100644 --- a/src/gtk-dialog/gconf-helper.c +++ b/src/gtk-dialog/gconf-helper.c @@ -51,11 +51,11 @@ static void update_menu_entries_callback (GConfClient *client, guint cnxn_id, GC if (gconf_value_get_bool (value)) { dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out")); dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart")); - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown")); + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch Off")); } else { dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out...")); dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart...")); - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown...")); + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch Off...")); } } } diff --git a/src/gtk-dialog/gtk-logout-helper.c b/src/gtk-dialog/gtk-logout-helper.c index d8aea6b..8a64c35 100644 --- a/src/gtk-dialog/gtk-logout-helper.c +++ b/src/gtk-dialog/gtk-logout-helper.c @@ -110,7 +110,7 @@ option_restart (const gchar * arg, const gchar * value, gpointer data, GError * static GOptionEntry options[] = { {"logout", 'l', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_logout, "Log out of the current session", NULL}, - {"shutdown", 's', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_shutdown, "Shutdown the entire system", NULL}, + {"shutdown", 's', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_shutdown, "Switch off the entire system", NULL}, {"restart", 'r', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_restart, "Restart the system", NULL}, {NULL} diff --git a/src/gtk-dialog/logout-dialog.c b/src/gtk-dialog/logout-dialog.c index 65df9fe..dc1b3fe 100644 --- a/src/gtk-dialog/logout-dialog.c +++ b/src/gtk-dialog/logout-dialog.c @@ -62,13 +62,13 @@ get_plural_string (LogoutDialog * dialog); static const gchar * title_strings[LOGOUT_DIALOG_ACTION_CNT] = { /* LOGOUT_DIALOG_LOGOUT, */ NC_("title", "Log Out"), /* LOGOUT_DIALOG_RESTART, */ NC_("title", "Restart"), - /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("title", "Shut Down") + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("title", "Switch Off") }; static const gchar * button_strings[LOGOUT_DIALOG_ACTION_CNT] = { /* LOGOUT_DIALOG_LOGOUT, */ NC_("button", "Log Out"), /* LOGOUT_DIALOG_RESTART, */ NC_("button", "Restart"), - /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button", "Shut Down") + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button", "Switch Off") }; static const gchar * restart_auth = N_("Restart..."); @@ -126,8 +126,8 @@ get_plural_string (LogoutDialog * dialog) dialog->timeout); break; case LOGOUT_DIALOG_SHUTDOWN: - plural_string = ngettext("The computer will be shut down in %d second.", - "The computer will be shut down in %d seconds.", + plural_string = ngettext("The computer will switch off in %d second.", + "The computer will switch off in %d seconds.", dialog->timeout); break; default: diff --git a/src/session-service.c b/src/session-service.c index 9fb9ee7..a2b1234 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -542,9 +542,9 @@ rebuild_items (DbusmenuMenuitem *root, shutdown_mi = dbusmenu_menuitem_new(); if (supress_confirmations()) { - dbusmenu_menuitem_property_set(shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shut Down")); + dbusmenu_menuitem_property_set(shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch Off")); } else { - dbusmenu_menuitem_property_set(shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shut Down...")); + dbusmenu_menuitem_property_set(shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch Off...")); } dbusmenu_menuitem_child_append(root, shutdown_mi); g_signal_connect(G_OBJECT(shutdown_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "shutdown"); -- cgit v1.2.3 From 41b935109421b4087536d88fef2da54d4dece306 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 12:07:30 -0600 Subject: Suspends to sleep --- src/session-service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index a2b1234..b7aa2b6 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -521,7 +521,7 @@ rebuild_items (DbusmenuMenuitem *root, suspend_mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set_bool(suspend_mi, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); - dbusmenu_menuitem_property_set(suspend_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Suspend")); + dbusmenu_menuitem_property_set(suspend_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Sleep")); dbusmenu_menuitem_child_append(root, suspend_mi); g_signal_connect(G_OBJECT(suspend_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(machine_sleep), "Suspend"); -- cgit v1.2.3 From 68d13604c069937cdb1e6cab3ecd54cfb45fc593 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 15:49:41 -0600 Subject: Flattening the build tree. --- configure.ac | 1 - po/POTFILES.in | 7 +- src/Makefile.am | 31 +++++- src/dialog.c | 153 ++++++++++++++++++++++++++ src/dialog.h | 42 ++++++++ src/gconf-helper.c | 73 +++++++++++++ src/gconf-helper.h | 50 +++++++++ src/gtk-dialog/Makefile.am | 13 --- src/gtk-dialog/dialog.c | 153 -------------------------- src/gtk-dialog/dialog.h | 42 -------- src/gtk-dialog/gconf-helper.c | 73 ------------- src/gtk-dialog/gconf-helper.h | 50 --------- src/gtk-dialog/gtk-logout-helper.c | 216 ------------------------------------- src/gtk-logout-helper.c | 216 +++++++++++++++++++++++++++++++++++++ src/session-service.c | 2 +- 15 files changed, 566 insertions(+), 556 deletions(-) create mode 100644 src/dialog.c create mode 100644 src/dialog.h create mode 100644 src/gconf-helper.c create mode 100644 src/gconf-helper.h delete mode 100644 src/gtk-dialog/Makefile.am delete mode 100644 src/gtk-dialog/dialog.c delete mode 100644 src/gtk-dialog/dialog.h delete mode 100644 src/gtk-dialog/gconf-helper.c delete mode 100644 src/gtk-dialog/gconf-helper.h delete mode 100644 src/gtk-dialog/gtk-logout-helper.c create mode 100644 src/gtk-logout-helper.c (limited to 'src/session-service.c') diff --git a/configure.ac b/configure.ac index b3bfd8b..0faca94 100644 --- a/configure.ac +++ b/configure.ac @@ -127,7 +127,6 @@ AM_GLIB_GNU_GETTEXT AC_OUTPUT([ Makefile src/Makefile -src/gtk-dialog/Makefile data/Makefile data/icons/Makefile data/icons/16x16/Makefile diff --git a/po/POTFILES.in b/po/POTFILES.in index 913dc25..6492f1e 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,8 +1,7 @@ [encoding: UTF-8] data/indicator-session.schemas.in -src/gtk-dialog/ck-pk-helper.c -src/gtk-dialog/gconf-helper.c -src/gtk-dialog/gtk-logout-helper.c -src/gtk-dialog/dialog.c +src/gconf-helper.c +src/gtk-logout-helper.c +src/dialog.c src/indicator-session.c src/session-service.c diff --git a/src/Makefile.am b/src/Makefile.am index a07c782..cd525bd 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,7 @@ -SUBDIRS = gtk-dialog -libexec_PROGRAMS = indicator-session-service +libexec_PROGRAMS = \ + indicator-session-service \ + gtk-logout-helper ################### # Indicator Stuff @@ -50,13 +51,37 @@ indicator_session_service_SOURCES = \ lock-helper.h \ session-service.c \ dbusmenu-shared.h \ - gtk-dialog/gconf-helper.c \ + gconf-helper.c \ users-service-dbus.h \ users-service-dbus.c \ users-service-marshal.c indicator_session_service_CFLAGS = $(SESSIONSERVICE_CFLAGS) $(GCONF_CFLAGS) -DLIBEXECDIR=\"$(libexecdir)\" -Wall -Werror indicator_session_service_LDADD = $(SESSIONSERVICE_LIBS) $(GCONF_LIBS) +################# +# GTK Logout Stuff +################# + +gtk_logout_helper_SOURCES = \ + gtk-logout-helper.c \ + gconf-helper.c \ + gconf-helper.h \ + dialog.c \ + dialog.h + +gtk_logout_helper_CFLAGS = \ + $(SESSIONSERVICE_CFLAGS) \ + $(GTKLOGOUTHELPER_CFLAGS) \ + $(GCONF_CFLAGS) \ + -Wall -Werror \ + -DINDICATOR_ICONS_DIR="\"$(INDICATORICONSDIR)\"" + +gtk_logout_helper_LDADD = \ + $(SESSIONSERVICE_LIBS) \ + $(GTKLOGOUTHELPER_LIBS) \ + $(GCONF_LIBS) + + ############### # Other Stuff ############### diff --git a/src/dialog.c b/src/dialog.c new file mode 100644 index 0000000..7e2347e --- /dev/null +++ b/src/dialog.c @@ -0,0 +1,153 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "dialog.h" + +/* Strings */ + +static const gchar * title_strings[LOGOUT_DIALOG_TYPE_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ NC_("title", "Log Out"), + /* LOGOUT_DIALOG_RESTART, */ NC_("title", "Restart"), + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("title", "Switch Off") +}; + +static const gchar * body_strings[LOGOUT_DIALOG_TYPE_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ N_("Are you sure you want to close all programs and log out?"), + /* LOGOUT_DIALOG_RESTART, */ N_("Are you sure you want to close all programs and restart the computer?"), + /* LOGOUT_DIALOG_SHUTDOWN, */ N_("Are you sure you want to close all programs and shut down the computer?") +}; + +static const gchar * button_strings[LOGOUT_DIALOG_TYPE_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ NC_("button", "Log Out"), + /* LOGOUT_DIALOG_RESTART, */ NC_("button", "Restart"), + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button", "Switch Off") +}; + +/* +static const gchar * restart_updates = N_("Restart Instead"); +static const gchar * restart_auth = N_("Restart..."); +static const gchar * body_logout_update = N_("Some software updates won't apply until the computer next restarts."); +*/ + +static const gchar * icon_strings[LOGOUT_DIALOG_TYPE_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ "system-log-out", + /* LOGOUT_DIALOG_RESTART, */ "system-restart", + /* LOGOUT_DIALOG_SHUTDOWN, */ "system-shutdown" +}; + + + +typedef struct _LogoutDialogPrivate LogoutDialogPrivate; +struct _LogoutDialogPrivate { + guint type; +}; + +#define LOGOUT_DIALOG_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), LOGOUT_DIALOG_TYPE, LogoutDialogPrivate)) + +static void logout_dialog_class_init (LogoutDialogClass *klass); +static void logout_dialog_init (LogoutDialog *self); +static void logout_dialog_dispose (GObject *object); +static void logout_dialog_finalize (GObject *object); + +G_DEFINE_TYPE (LogoutDialog, logout_dialog, GTK_TYPE_MESSAGE_DIALOG); + +static void +logout_dialog_class_init (LogoutDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (LogoutDialogPrivate)); + + object_class->dispose = logout_dialog_dispose; + object_class->finalize = logout_dialog_finalize; + + return; +} + +static void +logout_dialog_init (LogoutDialog *self) +{ + + return; +} + +static void +logout_dialog_dispose (GObject *object) +{ + + + G_OBJECT_CLASS (logout_dialog_parent_class)->dispose (object); + return; +} + +static void +logout_dialog_finalize (GObject *object) +{ + + + G_OBJECT_CLASS (logout_dialog_parent_class)->finalize (object); + return; +} + +/* Checks for updates that would signal that a restart is + required for them to apply */ +static gboolean +check_restart_required (void) +{ + + return FALSE; +} + +/* Checks with console kit to see if we can do what we want */ +static gboolean +ck_check_allowed (LogoutDialogType type) +{ + + + + return TRUE; +} + +LogoutDialog * +logout_dialog_new (LogoutDialogType type) +{ + GtkWidget * image = gtk_image_new_from_icon_name(icon_strings[type], GTK_ICON_SIZE_DIALOG); + gtk_widget_show(image); + + LogoutDialog * dialog = LOGOUT_DIALOG(g_object_new(LOGOUT_DIALOG_TYPE, + /* Window */ + "icon-name", icon_strings[type], + "modal", TRUE, + "resizable", FALSE, + "title", _(title_strings[type]), + "window-position", GTK_WIN_POS_CENTER_ALWAYS, + /* Message Dialog */ + "buttons", GTK_BUTTONS_NONE, + "image", image, + "message-type", GTK_MESSAGE_OTHER, + "text", _(body_strings[type]), + NULL)); + + gboolean allowed = FALSE; + if (type == LOGOUT_DIALOG_TYPE_LOG_OUT) { + allowed = ck_check_allowed(LOGOUT_DIALOG_TYPE_RESTART); + } else { + allowed = ck_check_allowed(type); + } + + gboolean restart_required = FALSE; + if (type == LOGOUT_DIALOG_TYPE_LOG_OUT) { + restart_required = check_restart_required(); + } + + gtk_dialog_add_buttons(GTK_DIALOG(dialog), + _("Cancel"), GTK_RESPONSE_CANCEL, + _(button_strings[type]), GTK_RESPONSE_OK, + NULL); + + return dialog; +} diff --git a/src/dialog.h b/src/dialog.h new file mode 100644 index 0000000..3240a8e --- /dev/null +++ b/src/dialog.h @@ -0,0 +1,42 @@ +#ifndef __LOGOUT_DIALOG_H__ +#define __LOGOUT_DIALOG_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define LOGOUT_DIALOG_TYPE (logout_dialog_get_type ()) +#define LOGOUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LOGOUT_DIALOG_TYPE, LogoutDialog)) +#define LOGOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LOGOUT_DIALOG_TYPE, LogoutDialogClass)) +#define IS_LOGOUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LOGOUT_DIALOG_TYPE)) +#define IS_LOGOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LOGOUT_DIALOG_TYPE)) +#define LOGOUT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LOGOUT_DIALOG_TYPE, LogoutDialogClass)) + +typedef enum _LogoutDialogType LogoutDialogType; +enum _LogoutDialogType { + LOGOUT_DIALOG_TYPE_LOG_OUT, + LOGOUT_DIALOG_TYPE_RESTART, + LOGOUT_DIALOG_TYPE_SHUTDOWN, + LOGOUT_DIALOG_TYPE_CNT +}; + +typedef struct _LogoutDialog LogoutDialog; +typedef struct _LogoutDialogClass LogoutDialogClass; + +struct _LogoutDialogClass { + GtkMessageDialogClass parent_class; +}; + +struct _LogoutDialog { + GtkMessageDialog parent; +}; + +GType logout_dialog_get_type (void); +LogoutDialog * logout_dialog_new (LogoutDialogType type); + +G_END_DECLS + +#endif diff --git a/src/gconf-helper.c b/src/gconf-helper.c new file mode 100644 index 0000000..213592e --- /dev/null +++ b/src/gconf-helper.c @@ -0,0 +1,73 @@ +/* +A small wrapper utility for connecting to gconf. + +Copyright 2009 Canonical Ltd. + +Authors: + Christoph Korn + +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 . +*/ + + +#include + +#include + +#include +#include + +#include +#include + +#include "gconf-helper.h" + +static GConfClient * gconf_client = NULL; + +gboolean +supress_confirmations (void) { + if(!gconf_client) { + gconf_client = gconf_client_get_default (); + } + return gconf_client_get_bool (gconf_client, SUPPRESS_KEY, NULL) ; +} + +static void update_menu_entries_callback (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer data) { + RestartShutdownLogoutMenuItems * restart_shutdown_logout_mi = (RestartShutdownLogoutMenuItems*) data; + GConfValue * value = gconf_entry_get_value (entry); + const gchar * key = gconf_entry_get_key (entry); + + if(g_strcmp0 (key, SUPPRESS_KEY) == 0) { + if (gconf_value_get_bool (value)) { + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out")); + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart")); + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown")); + } else { + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out...")); + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart...")); + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown...")); + } + } +} + +void +update_menu_entries(RestartShutdownLogoutMenuItems * restart_shutdown_logout_mi) { + if(!gconf_client) { + gconf_client = gconf_client_get_default (); + } + gconf_client_add_dir (gconf_client, GLOBAL_DIR, + GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); + gconf_client_notify_add (gconf_client, SUPPRESS_KEY, + update_menu_entries_callback, restart_shutdown_logout_mi, NULL, NULL); +} + diff --git a/src/gconf-helper.h b/src/gconf-helper.h new file mode 100644 index 0000000..951bb0f --- /dev/null +++ b/src/gconf-helper.h @@ -0,0 +1,50 @@ +/* +A small wrapper utility for connecting to gconf. + +Copyright 2009 Canonical Ltd. + +Authors: + Christoph Korn + +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 . +*/ + + +#ifndef __GCONF_HELPER_H__ +#define __GCONF_HELPER_H__ 1 + +#include + +#include + +#include +#include + +#include +#include + +#define SUPPRESS_KEY "/apps/indicator-session/suppress_logout_restart_shutdown" +#define GLOBAL_DIR "/apps/indicator-session" + +typedef struct _RestartShutdownLogoutMenuItems +{ + DbusmenuMenuitem * logout_mi; + DbusmenuMenuitem * restart_mi; + DbusmenuMenuitem * shutdown_mi; +} +RestartShutdownLogoutMenuItems; + +void update_menu_entries(RestartShutdownLogoutMenuItems*); +gboolean supress_confirmations (void); + +#endif /* __GCONF_HELPER__ */ diff --git a/src/gtk-dialog/Makefile.am b/src/gtk-dialog/Makefile.am deleted file mode 100644 index 508beb2..0000000 --- a/src/gtk-dialog/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ - -libexec_PROGRAMS = gtk-logout-helper - -gtk_logout_helper_SOURCES = \ - gtk-logout-helper.c \ - gconf-helper.c \ - gconf-helper.h \ - dialog.c \ - dialog.h - -gtk_logout_helper_CFLAGS = $(SESSIONSERVICE_CFLAGS) $(GTKLOGOUTHELPER_CFLAGS) $(GCONF_CFLAGS) -Wall -Werror -DINDICATOR_ICONS_DIR="\"$(INDICATORICONSDIR)\"" -gtk_logout_helper_LDADD = $(SESSIONSERVICE_LIBS) $(GTKLOGOUTHELPER_LIBS) $(GCONF_LIBS) - diff --git a/src/gtk-dialog/dialog.c b/src/gtk-dialog/dialog.c deleted file mode 100644 index 7e2347e..0000000 --- a/src/gtk-dialog/dialog.c +++ /dev/null @@ -1,153 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#include "dialog.h" - -/* Strings */ - -static const gchar * title_strings[LOGOUT_DIALOG_TYPE_CNT] = { - /* LOGOUT_DIALOG_LOGOUT, */ NC_("title", "Log Out"), - /* LOGOUT_DIALOG_RESTART, */ NC_("title", "Restart"), - /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("title", "Switch Off") -}; - -static const gchar * body_strings[LOGOUT_DIALOG_TYPE_CNT] = { - /* LOGOUT_DIALOG_LOGOUT, */ N_("Are you sure you want to close all programs and log out?"), - /* LOGOUT_DIALOG_RESTART, */ N_("Are you sure you want to close all programs and restart the computer?"), - /* LOGOUT_DIALOG_SHUTDOWN, */ N_("Are you sure you want to close all programs and shut down the computer?") -}; - -static const gchar * button_strings[LOGOUT_DIALOG_TYPE_CNT] = { - /* LOGOUT_DIALOG_LOGOUT, */ NC_("button", "Log Out"), - /* LOGOUT_DIALOG_RESTART, */ NC_("button", "Restart"), - /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button", "Switch Off") -}; - -/* -static const gchar * restart_updates = N_("Restart Instead"); -static const gchar * restart_auth = N_("Restart..."); -static const gchar * body_logout_update = N_("Some software updates won't apply until the computer next restarts."); -*/ - -static const gchar * icon_strings[LOGOUT_DIALOG_TYPE_CNT] = { - /* LOGOUT_DIALOG_LOGOUT, */ "system-log-out", - /* LOGOUT_DIALOG_RESTART, */ "system-restart", - /* LOGOUT_DIALOG_SHUTDOWN, */ "system-shutdown" -}; - - - -typedef struct _LogoutDialogPrivate LogoutDialogPrivate; -struct _LogoutDialogPrivate { - guint type; -}; - -#define LOGOUT_DIALOG_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE ((o), LOGOUT_DIALOG_TYPE, LogoutDialogPrivate)) - -static void logout_dialog_class_init (LogoutDialogClass *klass); -static void logout_dialog_init (LogoutDialog *self); -static void logout_dialog_dispose (GObject *object); -static void logout_dialog_finalize (GObject *object); - -G_DEFINE_TYPE (LogoutDialog, logout_dialog, GTK_TYPE_MESSAGE_DIALOG); - -static void -logout_dialog_class_init (LogoutDialogClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - g_type_class_add_private (klass, sizeof (LogoutDialogPrivate)); - - object_class->dispose = logout_dialog_dispose; - object_class->finalize = logout_dialog_finalize; - - return; -} - -static void -logout_dialog_init (LogoutDialog *self) -{ - - return; -} - -static void -logout_dialog_dispose (GObject *object) -{ - - - G_OBJECT_CLASS (logout_dialog_parent_class)->dispose (object); - return; -} - -static void -logout_dialog_finalize (GObject *object) -{ - - - G_OBJECT_CLASS (logout_dialog_parent_class)->finalize (object); - return; -} - -/* Checks for updates that would signal that a restart is - required for them to apply */ -static gboolean -check_restart_required (void) -{ - - return FALSE; -} - -/* Checks with console kit to see if we can do what we want */ -static gboolean -ck_check_allowed (LogoutDialogType type) -{ - - - - return TRUE; -} - -LogoutDialog * -logout_dialog_new (LogoutDialogType type) -{ - GtkWidget * image = gtk_image_new_from_icon_name(icon_strings[type], GTK_ICON_SIZE_DIALOG); - gtk_widget_show(image); - - LogoutDialog * dialog = LOGOUT_DIALOG(g_object_new(LOGOUT_DIALOG_TYPE, - /* Window */ - "icon-name", icon_strings[type], - "modal", TRUE, - "resizable", FALSE, - "title", _(title_strings[type]), - "window-position", GTK_WIN_POS_CENTER_ALWAYS, - /* Message Dialog */ - "buttons", GTK_BUTTONS_NONE, - "image", image, - "message-type", GTK_MESSAGE_OTHER, - "text", _(body_strings[type]), - NULL)); - - gboolean allowed = FALSE; - if (type == LOGOUT_DIALOG_TYPE_LOG_OUT) { - allowed = ck_check_allowed(LOGOUT_DIALOG_TYPE_RESTART); - } else { - allowed = ck_check_allowed(type); - } - - gboolean restart_required = FALSE; - if (type == LOGOUT_DIALOG_TYPE_LOG_OUT) { - restart_required = check_restart_required(); - } - - gtk_dialog_add_buttons(GTK_DIALOG(dialog), - _("Cancel"), GTK_RESPONSE_CANCEL, - _(button_strings[type]), GTK_RESPONSE_OK, - NULL); - - return dialog; -} diff --git a/src/gtk-dialog/dialog.h b/src/gtk-dialog/dialog.h deleted file mode 100644 index 3240a8e..0000000 --- a/src/gtk-dialog/dialog.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef __LOGOUT_DIALOG_H__ -#define __LOGOUT_DIALOG_H__ - -#include -#include - -#include - -G_BEGIN_DECLS - -#define LOGOUT_DIALOG_TYPE (logout_dialog_get_type ()) -#define LOGOUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LOGOUT_DIALOG_TYPE, LogoutDialog)) -#define LOGOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LOGOUT_DIALOG_TYPE, LogoutDialogClass)) -#define IS_LOGOUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LOGOUT_DIALOG_TYPE)) -#define IS_LOGOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LOGOUT_DIALOG_TYPE)) -#define LOGOUT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LOGOUT_DIALOG_TYPE, LogoutDialogClass)) - -typedef enum _LogoutDialogType LogoutDialogType; -enum _LogoutDialogType { - LOGOUT_DIALOG_TYPE_LOG_OUT, - LOGOUT_DIALOG_TYPE_RESTART, - LOGOUT_DIALOG_TYPE_SHUTDOWN, - LOGOUT_DIALOG_TYPE_CNT -}; - -typedef struct _LogoutDialog LogoutDialog; -typedef struct _LogoutDialogClass LogoutDialogClass; - -struct _LogoutDialogClass { - GtkMessageDialogClass parent_class; -}; - -struct _LogoutDialog { - GtkMessageDialog parent; -}; - -GType logout_dialog_get_type (void); -LogoutDialog * logout_dialog_new (LogoutDialogType type); - -G_END_DECLS - -#endif diff --git a/src/gtk-dialog/gconf-helper.c b/src/gtk-dialog/gconf-helper.c deleted file mode 100644 index 213592e..0000000 --- a/src/gtk-dialog/gconf-helper.c +++ /dev/null @@ -1,73 +0,0 @@ -/* -A small wrapper utility for connecting to gconf. - -Copyright 2009 Canonical Ltd. - -Authors: - Christoph Korn - -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 . -*/ - - -#include - -#include - -#include -#include - -#include -#include - -#include "gconf-helper.h" - -static GConfClient * gconf_client = NULL; - -gboolean -supress_confirmations (void) { - if(!gconf_client) { - gconf_client = gconf_client_get_default (); - } - return gconf_client_get_bool (gconf_client, SUPPRESS_KEY, NULL) ; -} - -static void update_menu_entries_callback (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer data) { - RestartShutdownLogoutMenuItems * restart_shutdown_logout_mi = (RestartShutdownLogoutMenuItems*) data; - GConfValue * value = gconf_entry_get_value (entry); - const gchar * key = gconf_entry_get_key (entry); - - if(g_strcmp0 (key, SUPPRESS_KEY) == 0) { - if (gconf_value_get_bool (value)) { - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out")); - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart")); - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown")); - } else { - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out...")); - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart...")); - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown...")); - } - } -} - -void -update_menu_entries(RestartShutdownLogoutMenuItems * restart_shutdown_logout_mi) { - if(!gconf_client) { - gconf_client = gconf_client_get_default (); - } - gconf_client_add_dir (gconf_client, GLOBAL_DIR, - GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - gconf_client_notify_add (gconf_client, SUPPRESS_KEY, - update_menu_entries_callback, restart_shutdown_logout_mi, NULL, NULL); -} - diff --git a/src/gtk-dialog/gconf-helper.h b/src/gtk-dialog/gconf-helper.h deleted file mode 100644 index 951bb0f..0000000 --- a/src/gtk-dialog/gconf-helper.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -A small wrapper utility for connecting to gconf. - -Copyright 2009 Canonical Ltd. - -Authors: - Christoph Korn - -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 . -*/ - - -#ifndef __GCONF_HELPER_H__ -#define __GCONF_HELPER_H__ 1 - -#include - -#include - -#include -#include - -#include -#include - -#define SUPPRESS_KEY "/apps/indicator-session/suppress_logout_restart_shutdown" -#define GLOBAL_DIR "/apps/indicator-session" - -typedef struct _RestartShutdownLogoutMenuItems -{ - DbusmenuMenuitem * logout_mi; - DbusmenuMenuitem * restart_mi; - DbusmenuMenuitem * shutdown_mi; -} -RestartShutdownLogoutMenuItems; - -void update_menu_entries(RestartShutdownLogoutMenuItems*); -gboolean supress_confirmations (void); - -#endif /* __GCONF_HELPER__ */ diff --git a/src/gtk-dialog/gtk-logout-helper.c b/src/gtk-dialog/gtk-logout-helper.c deleted file mode 100644 index bf37ca7..0000000 --- a/src/gtk-dialog/gtk-logout-helper.c +++ /dev/null @@ -1,216 +0,0 @@ -/* -A small wrapper utility to load indicators and put them as menu items -into the gnome-panel using it's applet interface. - -Copyright 2009 Canonical Ltd. - -Authors: - Ted Gould - Christoph Korn - -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 . -*/ - -#include -#include -#include -#include -#include "dialog.h" -#include "gconf-helper.h" - -static void -consolekit_fallback (LogoutDialogType action) -{ - DBusGConnection * sbus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); - g_return_if_fail(sbus != NULL); /* worst case */ - DBusGProxy * proxy = dbus_g_proxy_new_for_name(sbus, "org.freedesktop.ConsoleKit", - "/org/freedesktop/ConsoleKit/Manager", - "org.freedesktop.ConsoleKit.Manager"); - - if (proxy == NULL) { - g_warning("Unable to get consolekit proxy"); - return; - } - - GError * error = NULL; - - switch (action) { - case LOGOUT_DIALOG_TYPE_LOG_OUT: - g_warning("Unable to fallback to ConsoleKit for logout as it's a session issue. We need some sort of session handler."); - break; - case LOGOUT_DIALOG_TYPE_SHUTDOWN: - dbus_g_proxy_call(proxy, - "Stop", - &error, - G_TYPE_INVALID); - break; - case LOGOUT_DIALOG_TYPE_RESTART: - dbus_g_proxy_call(proxy, - "Restart", - &error, - G_TYPE_INVALID); - break; - default: - g_warning("Unknown action"); - break; - } - - g_object_unref(proxy); - - if (error != NULL) { - g_error("Unable to signal ConsoleKit: %s", error->message); - g_error_free(error); - } - - return; -} - -static void -session_action (LogoutDialogType action) -{ - DBusGConnection * sbus; - DBusGProxy * sm_proxy; - GError * error = NULL; - gboolean res = FALSE; - - sbus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); - if (sbus == NULL) { - g_warning("Unable to get DBus session bus."); - return; - } - sm_proxy = dbus_g_proxy_new_for_name_owner (sbus, - "org.gnome.SessionManager", - "/org/gnome/SessionManager", - "org.gnome.SessionManager", - &error); - if (sm_proxy == NULL) { - g_warning("Unable to get DBus proxy to SessionManager interface: %s", error->message); - g_error_free(error); - - consolekit_fallback(action); - return; - } - - g_clear_error (&error); - - if (action == LOGOUT_DIALOG_TYPE_LOG_OUT) { - res = dbus_g_proxy_call_with_timeout (sm_proxy, "Logout", INT_MAX, &error, - G_TYPE_UINT, 1, G_TYPE_INVALID, G_TYPE_INVALID); - } else if (action == LOGOUT_DIALOG_TYPE_SHUTDOWN) { - res = dbus_g_proxy_call_with_timeout (sm_proxy, "RequestShutdown", INT_MAX, &error, - G_TYPE_INVALID, G_TYPE_INVALID); - } else if (action == LOGOUT_DIALOG_TYPE_RESTART) { - res = dbus_g_proxy_call_with_timeout (sm_proxy, "RequestReboot", INT_MAX, &error, - G_TYPE_INVALID, G_TYPE_INVALID); - } else { - g_warning ("Unknown session action"); - } - - if (!res) { - if (error != NULL) { - g_warning ("SessionManager action failed: %s", error->message); - } else { - g_warning ("SessionManager action failed: unknown error"); - } - } - - g_object_unref(sm_proxy); - - if (error != NULL) { - g_error_free(error); - } - - return; -} - -static LogoutDialogType type = LOGOUT_DIALOG_TYPE_LOG_OUT; - -static gboolean -option_logout (const gchar * arg, const gchar * value, gpointer data, GError * error) -{ - type = LOGOUT_DIALOG_TYPE_LOG_OUT; - return TRUE; -} - -static gboolean -option_shutdown (const gchar * arg, const gchar * value, gpointer data, GError * error) -{ - type = LOGOUT_DIALOG_TYPE_SHUTDOWN; - return TRUE; -} - -static gboolean -option_restart (const gchar * arg, const gchar * value, gpointer data, GError * error) -{ - type = LOGOUT_DIALOG_TYPE_RESTART; - return TRUE; -} - -static GOptionEntry options[] = { - {"logout", 'l', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_logout, "Log out of the current session", NULL}, - {"shutdown", 's', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_shutdown, "Shutdown the entire system", NULL}, - {"restart", 'r', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_restart, "Restart the system", NULL}, - - {NULL} -}; - -int -main (int argc, char * argv[]) -{ - gtk_init(&argc, &argv); - - /* Setting up i18n and gettext. Apparently, we need - all of these. */ - setlocale (LC_ALL, ""); - bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); - textdomain (GETTEXT_PACKAGE); - - GError * error = NULL; - GOptionContext * context = g_option_context_new(" - logout of the current session"); - g_option_context_add_main_entries(context, options, "gtk-logout-helper"); - g_option_context_add_group(context, gtk_get_option_group(TRUE)); - g_option_context_set_help_enabled(context, TRUE); - - if (!g_option_context_parse(context, &argc, &argv, &error)) { - g_debug("Option parsing failed: %s", error->message); - g_error_free(error); - return 1; - } - - /* Init some theme/icon stuff */ - gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(), - INDICATOR_ICONS_DIR); - - GtkWidget * dialog = NULL; - if (!supress_confirmations()) { - dialog = GTK_WIDGET(logout_dialog_new(type)); - } - - if (dialog != NULL) { - GtkResponseType response = gtk_dialog_run(GTK_DIALOG(dialog)); - gtk_widget_hide(dialog); - - if (response == GTK_RESPONSE_HELP) { - type = LOGOUT_DIALOG_TYPE_RESTART; - response = GTK_RESPONSE_OK; - } - - if (response != GTK_RESPONSE_OK) { - return 0; - } - } - - session_action(type); - - return 0; -} diff --git a/src/gtk-logout-helper.c b/src/gtk-logout-helper.c new file mode 100644 index 0000000..bf37ca7 --- /dev/null +++ b/src/gtk-logout-helper.c @@ -0,0 +1,216 @@ +/* +A small wrapper utility to load indicators and put them as menu items +into the gnome-panel using it's applet interface. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + Christoph Korn + +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 . +*/ + +#include +#include +#include +#include +#include "dialog.h" +#include "gconf-helper.h" + +static void +consolekit_fallback (LogoutDialogType action) +{ + DBusGConnection * sbus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); + g_return_if_fail(sbus != NULL); /* worst case */ + DBusGProxy * proxy = dbus_g_proxy_new_for_name(sbus, "org.freedesktop.ConsoleKit", + "/org/freedesktop/ConsoleKit/Manager", + "org.freedesktop.ConsoleKit.Manager"); + + if (proxy == NULL) { + g_warning("Unable to get consolekit proxy"); + return; + } + + GError * error = NULL; + + switch (action) { + case LOGOUT_DIALOG_TYPE_LOG_OUT: + g_warning("Unable to fallback to ConsoleKit for logout as it's a session issue. We need some sort of session handler."); + break; + case LOGOUT_DIALOG_TYPE_SHUTDOWN: + dbus_g_proxy_call(proxy, + "Stop", + &error, + G_TYPE_INVALID); + break; + case LOGOUT_DIALOG_TYPE_RESTART: + dbus_g_proxy_call(proxy, + "Restart", + &error, + G_TYPE_INVALID); + break; + default: + g_warning("Unknown action"); + break; + } + + g_object_unref(proxy); + + if (error != NULL) { + g_error("Unable to signal ConsoleKit: %s", error->message); + g_error_free(error); + } + + return; +} + +static void +session_action (LogoutDialogType action) +{ + DBusGConnection * sbus; + DBusGProxy * sm_proxy; + GError * error = NULL; + gboolean res = FALSE; + + sbus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + if (sbus == NULL) { + g_warning("Unable to get DBus session bus."); + return; + } + sm_proxy = dbus_g_proxy_new_for_name_owner (sbus, + "org.gnome.SessionManager", + "/org/gnome/SessionManager", + "org.gnome.SessionManager", + &error); + if (sm_proxy == NULL) { + g_warning("Unable to get DBus proxy to SessionManager interface: %s", error->message); + g_error_free(error); + + consolekit_fallback(action); + return; + } + + g_clear_error (&error); + + if (action == LOGOUT_DIALOG_TYPE_LOG_OUT) { + res = dbus_g_proxy_call_with_timeout (sm_proxy, "Logout", INT_MAX, &error, + G_TYPE_UINT, 1, G_TYPE_INVALID, G_TYPE_INVALID); + } else if (action == LOGOUT_DIALOG_TYPE_SHUTDOWN) { + res = dbus_g_proxy_call_with_timeout (sm_proxy, "RequestShutdown", INT_MAX, &error, + G_TYPE_INVALID, G_TYPE_INVALID); + } else if (action == LOGOUT_DIALOG_TYPE_RESTART) { + res = dbus_g_proxy_call_with_timeout (sm_proxy, "RequestReboot", INT_MAX, &error, + G_TYPE_INVALID, G_TYPE_INVALID); + } else { + g_warning ("Unknown session action"); + } + + if (!res) { + if (error != NULL) { + g_warning ("SessionManager action failed: %s", error->message); + } else { + g_warning ("SessionManager action failed: unknown error"); + } + } + + g_object_unref(sm_proxy); + + if (error != NULL) { + g_error_free(error); + } + + return; +} + +static LogoutDialogType type = LOGOUT_DIALOG_TYPE_LOG_OUT; + +static gboolean +option_logout (const gchar * arg, const gchar * value, gpointer data, GError * error) +{ + type = LOGOUT_DIALOG_TYPE_LOG_OUT; + return TRUE; +} + +static gboolean +option_shutdown (const gchar * arg, const gchar * value, gpointer data, GError * error) +{ + type = LOGOUT_DIALOG_TYPE_SHUTDOWN; + return TRUE; +} + +static gboolean +option_restart (const gchar * arg, const gchar * value, gpointer data, GError * error) +{ + type = LOGOUT_DIALOG_TYPE_RESTART; + return TRUE; +} + +static GOptionEntry options[] = { + {"logout", 'l', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_logout, "Log out of the current session", NULL}, + {"shutdown", 's', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_shutdown, "Shutdown the entire system", NULL}, + {"restart", 'r', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_restart, "Restart the system", NULL}, + + {NULL} +}; + +int +main (int argc, char * argv[]) +{ + gtk_init(&argc, &argv); + + /* Setting up i18n and gettext. Apparently, we need + all of these. */ + setlocale (LC_ALL, ""); + bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); + textdomain (GETTEXT_PACKAGE); + + GError * error = NULL; + GOptionContext * context = g_option_context_new(" - logout of the current session"); + g_option_context_add_main_entries(context, options, "gtk-logout-helper"); + g_option_context_add_group(context, gtk_get_option_group(TRUE)); + g_option_context_set_help_enabled(context, TRUE); + + if (!g_option_context_parse(context, &argc, &argv, &error)) { + g_debug("Option parsing failed: %s", error->message); + g_error_free(error); + return 1; + } + + /* Init some theme/icon stuff */ + gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(), + INDICATOR_ICONS_DIR); + + GtkWidget * dialog = NULL; + if (!supress_confirmations()) { + dialog = GTK_WIDGET(logout_dialog_new(type)); + } + + if (dialog != NULL) { + GtkResponseType response = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_hide(dialog); + + if (response == GTK_RESPONSE_HELP) { + type = LOGOUT_DIALOG_TYPE_RESTART; + response = GTK_RESPONSE_OK; + } + + if (response != GTK_RESPONSE_OK) { + return 0; + } + } + + session_action(type); + + return 0; +} diff --git a/src/session-service.c b/src/session-service.c index 289bff8..af3c3e5 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -40,7 +40,7 @@ with this program. If not, see . #include "dbus-shared-names.h" #include "dbusmenu-shared.h" -#include "gtk-dialog/gconf-helper.h" +#include "gconf-helper.h" #include "users-service-dbus.h" #include "lock-helper.h" -- cgit v1.2.3 From be3f65e45fb928f6afe189fe41ab7a25243d1d90 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 21:50:37 -0600 Subject: Adds a file watcher to see if we should change the menuitem to warn that a restart is recommended. --- src/session-service.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index eb1966e..62ee0a7 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -27,6 +27,7 @@ with this program. If not, see . #include #include +#include #include #include @@ -605,6 +606,42 @@ service_shutdown (IndicatorService * service, gpointer user_data) return; } +static void +restart_dir_changed (void) +{ + gboolean restart_required = g_file_test("/var/run/reboot-required", G_FILE_TEST_EXISTS); + + if (restart_required) { + if (supress_confirmations()) { + dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart Required")); + } else { + dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart Required...")); + } + dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_ICON_NAME, "emblem-important"); + } else { + if (supress_confirmations()) { + dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart")); + } else { + dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart...")); + } + dbusmenu_menuitem_property_remove(restart_mi, DBUSMENU_MENUITEM_PROP_ICON_NAME); + } + + return; +} + +static void +setup_restart_watch (void) +{ + GFile * filedir = g_file_new_for_path("/var/run"); + GFileMonitor * filemon = g_file_monitor_directory(filedir, G_FILE_MONITOR_NONE, NULL, NULL); + if (filemon != NULL) { + g_signal_connect(G_OBJECT(filemon), "changed", G_CALLBACK(restart_dir_changed), NULL); + } + restart_dir_changed(); + return; +} + /* Main, is well, main. It brings everything up and throws us into the mainloop of no return. */ int @@ -642,6 +679,8 @@ main (int argc, char ** argv) G_CALLBACK (user_change), root_menuitem); + setup_restart_watch(); + setup_up(); DbusmenuServer * server = dbusmenu_server_new(INDICATOR_SESSION_DBUS_OBJECT); -- cgit v1.2.3 From d018794d6717df1f4dfcb1f26258d6cd2820d8bd Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 21:51:57 -0600 Subject: Some function comments. --- src/session-service.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 62ee0a7..7183472 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -606,6 +606,8 @@ service_shutdown (IndicatorService * service, gpointer user_data) return; } +/* When the directory changes we need to figure out how our menu + item should look. */ static void restart_dir_changed (void) { @@ -630,6 +632,9 @@ restart_dir_changed (void) return; } +/* Buids a file watcher for the directory so that when it + changes we can check to see if our reboot-required is + there. */ static void setup_restart_watch (void) { -- cgit v1.2.3 From dc5302fcdcfb8eb5c54092107c49e3cc3a9deeea Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Wed, 10 Mar 2010 17:33:32 -0600 Subject: Use gint64, not UserData*, for the callback to user-added signal. --- src/session-service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index a6c3fc3..febf007 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -586,7 +586,7 @@ rebuild_items (DbusmenuMenuitem *root, rebuilds the menu */ static void user_change (UsersServiceDbus *service, - UserData *user, + gint64 user, gpointer user_data) { DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data; -- cgit v1.2.3 From 9bfcbd2b420b19a43d1704c6562d4709ebb570f6 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 12 Mar 2010 12:39:47 -0600 Subject: Changing the service to use the new menu item --- src/gconf-helper.c | 5 +++-- src/session-service.c | 17 +++++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) (limited to 'src/session-service.c') diff --git a/src/gconf-helper.c b/src/gconf-helper.c index 9262b19..5efc439 100644 --- a/src/gconf-helper.c +++ b/src/gconf-helper.c @@ -30,6 +30,7 @@ with this program. If not, see . #include #include +#include "dbus-shared-names.h" #include "gconf-helper.h" static GConfClient * gconf_client = NULL; @@ -50,11 +51,11 @@ static void update_menu_entries_callback (GConfClient *client, guint cnxn_id, GC if(g_strcmp0 (key, SUPPRESS_KEY) == 0) { if (gconf_value_get_bool (value)) { dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out")); - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart")); + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, RESTART_ITEM_LABEL, _("Restart")); dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch Off")); } else { dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out...")); - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart...")); + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, RESTART_ITEM_LABEL, _("Restart...")); dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch Off...")); } } diff --git a/src/session-service.c b/src/session-service.c index febf007..51a930a 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -555,10 +555,11 @@ rebuild_items (DbusmenuMenuitem *root, g_signal_connect(G_OBJECT(hibernate_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(machine_sleep), "Hibernate"); restart_mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_TYPE, RESTART_ITEM_TYPE); if (supress_confirmations()) { - dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart")); + dbusmenu_menuitem_property_set(restart_mi, RESTART_ITEM_LABEL, _("Restart")); } else { - dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart...")); + dbusmenu_menuitem_property_set(restart_mi, RESTART_ITEM_LABEL, _("Restart...")); } dbusmenu_menuitem_child_append(root, restart_mi); g_signal_connect(G_OBJECT(restart_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "restart"); @@ -615,18 +616,18 @@ restart_dir_changed (void) if (restart_required) { if (supress_confirmations()) { - dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart Required")); + dbusmenu_menuitem_property_set(restart_mi, RESTART_ITEM_LABEL, _("Restart Required")); } else { - dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart Required...")); + dbusmenu_menuitem_property_set(restart_mi, RESTART_ITEM_LABEL, _("Restart Required...")); } - dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_ICON_NAME, "emblem-important"); + dbusmenu_menuitem_property_set(restart_mi, RESTART_ITEM_ICON, "emblem-important"); } else { if (supress_confirmations()) { - dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart")); + dbusmenu_menuitem_property_set(restart_mi, RESTART_ITEM_LABEL, _("Restart")); } else { - dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart...")); + dbusmenu_menuitem_property_set(restart_mi, RESTART_ITEM_LABEL, _("Restart...")); } - dbusmenu_menuitem_property_remove(restart_mi, DBUSMENU_MENUITEM_PROP_ICON_NAME); + dbusmenu_menuitem_property_remove(restart_mi, RESTART_ITEM_ICON); } return; -- cgit v1.2.3 From e504d1d019cf0af9b210d8150a5822f5e4878f4f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 12 Mar 2010 14:37:58 -0600 Subject: Creating our little dbus-object. --- src/session-dbus.c | 6 ++++++ src/session-dbus.h | 1 + src/session-service.c | 4 ++++ 3 files changed, 11 insertions(+) (limited to 'src/session-service.c') diff --git a/src/session-dbus.c b/src/session-dbus.c index fd506ad..60002d0 100644 --- a/src/session-dbus.c +++ b/src/session-dbus.c @@ -97,6 +97,12 @@ _session_dbus_server_get_icon (SessionDbus * service, gchar ** icon, GError ** e return TRUE; } +SessionDbus * +session_dbus_new (void) +{ + return SESSION_DBUS(g_object_new(SESSION_DBUS_TYPE, NULL)); +} + void session_dbus_set_name (SessionDbus * session, const gchar * name) { diff --git a/src/session-dbus.h b/src/session-dbus.h index 67c151c..2169b49 100644 --- a/src/session-dbus.h +++ b/src/session-dbus.h @@ -26,6 +26,7 @@ struct _SessionDbus { }; GType session_dbus_get_type (void); +SessionDbus * session_dbus_new (void); void session_dbus_set_name (SessionDbus * session, const gchar * name); G_END_DECLS diff --git a/src/session-service.c b/src/session-service.c index febf007..693c73a 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -43,6 +43,7 @@ with this program. If not, see . #include "gconf-helper.h" +#include "session-dbus.h" #include "users-service-dbus.h" #include "lock-helper.h" @@ -65,6 +66,7 @@ struct _ActivateData static DBusGConnection *system_bus = NULL; static DBusGProxy *gdm_proxy = NULL; static UsersServiceDbus *dbus_interface = NULL; +static SessionDbus *session_dbus = NULL; static DbusmenuMenuitem *lock_menuitem = NULL; static DbusmenuMenuitem *switch_menuitem = NULL; @@ -691,6 +693,8 @@ main (int argc, char ** argv) DbusmenuServer * server = dbusmenu_server_new(INDICATOR_SESSION_DBUS_OBJECT); dbusmenu_server_set_root(server, root_menuitem); + session_dbus = session_dbus_new(); + mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); -- cgit v1.2.3 From 5d784227da6b87b8588724ac1d894c6116fc2b01 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 12 Mar 2010 15:52:13 -0600 Subject: Setting the icon when the restart is touched. --- src/session-service.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 693c73a..6c4dd1b 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -622,6 +622,7 @@ restart_dir_changed (void) dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart Required...")); } dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_ICON_NAME, "emblem-important"); + session_dbus_set_name(session_dbus, ICON_RESTART); } else { if (supress_confirmations()) { dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart")); @@ -629,6 +630,7 @@ restart_dir_changed (void) dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart...")); } dbusmenu_menuitem_property_remove(restart_mi, DBUSMENU_MENUITEM_PROP_ICON_NAME); + session_dbus_set_name(session_dbus, ICON_DEFAULT); } return; -- cgit v1.2.3 From 78211dc46ae22a439653df6db0f3b6e9c67160f0 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 12 Mar 2010 16:07:33 -0600 Subject: Protecting from a NULL object --- src/session-service.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 6c4dd1b..b88ee30 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -622,15 +622,19 @@ restart_dir_changed (void) dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart Required...")); } dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_ICON_NAME, "emblem-important"); - session_dbus_set_name(session_dbus, ICON_RESTART); - } else { + if (session_dbus != NULL) { + session_dbus_set_name(session_dbus, ICON_RESTART); + } + } else { if (supress_confirmations()) { dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart")); } else { dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart...")); } dbusmenu_menuitem_property_remove(restart_mi, DBUSMENU_MENUITEM_PROP_ICON_NAME); - session_dbus_set_name(session_dbus, ICON_DEFAULT); + if (session_dbus != NULL) { + session_dbus_set_name(session_dbus, ICON_DEFAULT); + } } return; -- cgit v1.2.3 From 91d75debaa1a5aa7c210da029ab123c96633225b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 12 Mar 2010 16:08:28 -0600 Subject: Making our service come up a little earlier --- src/session-service.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index b88ee30..75c8650 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -674,6 +674,8 @@ main (int argc, char ** argv) INDICATOR_SERVICE_SIGNAL_SHUTDOWN, G_CALLBACK(service_shutdown), NULL); + session_dbus = session_dbus_new(); + g_idle_add(lock_screen_setup, NULL); root_menuitem = dbusmenu_menuitem_new(); @@ -699,8 +701,6 @@ main (int argc, char ** argv) DbusmenuServer * server = dbusmenu_server_new(INDICATOR_SESSION_DBUS_OBJECT); dbusmenu_server_set_root(server, root_menuitem); - session_dbus = session_dbus_new(); - mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); -- cgit v1.2.3 From 501c8a7e9add926f34b6dbbcce9d9e6f81706445 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 12 Mar 2010 21:54:12 -0600 Subject: Looking for a desktop file, and if it exists, putting it as a final menu item. --- src/session-service.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src/session-service.c') diff --git a/src/session-service.c b/src/session-service.c index 51a930a..c98ecff 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -28,6 +28,7 @@ with this program. If not, see . #include #include +#include #include #include @@ -50,6 +51,8 @@ with this program. If not, see . #define UP_OBJECT "/org/freedesktop/UPower" #define UP_INTERFACE "org.freedesktop.UPower" +#define DESKTOP_FILE "/usr/share/applications/indicator-session-extra.desktop" + #define GUEST_SESSION_LAUNCHER "/usr/share/gdm/guest-session/guest-session-launch" #define LOCKDOWN_DIR "/desktop/gnome/lockdown" @@ -415,6 +418,16 @@ compare_users_by_username (const gchar *a, return retval; } +/* Take a desktop file and execute it */ +static void +desktop_activate_cb (DbusmenuMenuitem * mi, guint timestamp, gpointer data) +{ + GAppInfo * appinfo = G_APP_INFO(data); + g_return_if_fail(appinfo != NULL); + g_app_info_launch(appinfo, NULL, NULL, NULL); + return; +} + /* Builds up the menu for us */ static void rebuild_items (DbusmenuMenuitem *root, @@ -580,6 +593,21 @@ rebuild_items (DbusmenuMenuitem *root, update_menu_entries(restart_shutdown_logout_mi); + if (g_file_test(DESKTOP_FILE, G_FILE_TEST_EXISTS)) { + GAppInfo * appinfo = G_APP_INFO(g_desktop_app_info_new_from_filename(DESKTOP_FILE)); + + if (appinfo != NULL) { + DbusmenuMenuitem * separator = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR); + dbusmenu_menuitem_child_append(root, separator); + + DbusmenuMenuitem * desktop_mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(desktop_mi, DBUSMENU_MENUITEM_PROP_LABEL, g_app_info_get_name(appinfo)); + g_signal_connect(G_OBJECT(desktop_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(desktop_activate_cb), appinfo); + dbusmenu_menuitem_child_append(root, desktop_mi); + } + } + return; } -- cgit v1.2.3