aboutsummaryrefslogtreecommitdiff
path: root/src/session-service.c
diff options
context:
space:
mode:
authorConor Curran <conor.curran@canonical.com>2011-07-18 20:08:34 +0100
committerConor Curran <conor.curran@canonical.com>2011-07-18 20:08:34 +0100
commite226343737929872852a01c4e9b621a26de23ab9 (patch)
tree45532fc337065612787ac5ee3b822742acc50a42 /src/session-service.c
parentb92df905984963b9923fc7d826b0bcf963dda962 (diff)
parent797cf05a2f643dfed7b70db6abf2095f1216aa89 (diff)
downloadayatana-indicator-session-e226343737929872852a01c4e9b621a26de23ab9.tar.gz
ayatana-indicator-session-e226343737929872852a01c4e9b621a26de23ab9.tar.bz2
ayatana-indicator-session-e226343737929872852a01c4e9b621a26de23ab9.zip
user menu abstracted
Diffstat (limited to 'src/session-service.c')
-rw-r--r--src/session-service.c277
1 files changed, 18 insertions, 259 deletions
diff --git a/src/session-service.c b/src/session-service.c
index c61fde5..2b00d87 100644
--- a/src/session-service.c
+++ b/src/session-service.c
@@ -49,11 +49,12 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include "dbus-shared-names.h"
#include "dbusmenu-shared.h"
+#include "users-service-dbus.h"
+#include "user-menu-mgr.h"
#include "gconf-helper.h"
#include "session-dbus.h"
-#include "users-service-dbus.h"
#include "lock-helper.h"
#include "upower-client.h"
@@ -63,12 +64,6 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#define EXTRA_LAUNCHER_DIR "/usr/share/indicators/session/applications"
-#define LOCKDOWN_DIR "/desktop/gnome/lockdown"
-#define LOCKDOWN_KEY_USER LOCKDOWN_DIR "/disable_user_switching"
-#define LOCKDOWN_KEY_SCREENSAVER LOCKDOWN_DIR "/disable_lock_screen"
-
-#define KEYBINDING_DIR "/apps/gnome_settings_daemon/keybindings"
-#define KEY_LOCK_SCREEN KEYBINDING_DIR "/screensaver"
typedef struct _ActivateData ActivateData;
struct _ActivateData
@@ -77,14 +72,10 @@ struct _ActivateData
UserData *user;
};
-static UsersServiceDbus *dbus_interface = NULL;
+//static UsersServiceDbus *dbus_interface = NULL;
static SessionDbus *session_dbus = NULL;
-
static DbusmenuMenuitem *lock_menuitem = NULL;
-static DbusmenuMenuitem *switch_menuitem = NULL;
-
static DbusmenuMenuitem * session_root_menuitem = NULL;
-static DbusmenuMenuitem * users_root_menuitem = NULL;
static GMainLoop * mainloop = NULL;
static DBusGProxy * up_main_proxy = NULL;
@@ -106,9 +97,7 @@ static gboolean allow_suspend = TRUE;
static GConfClient * gconf_client = NULL;
-static void rebuild_session_items (DbusmenuMenuitem *root, UsersServiceDbus *service);
-static void rebuild_user_items (DbusmenuMenuitem *root, UsersServiceDbus *service);
-static void activate_online_accounts (DbusmenuMenuitem *mi, guint timestamp, gpointer user_data);
+static void rebuild_session_items (DbusmenuMenuitem *root);
static void
lockdown_changed (GConfClient *client,
@@ -124,7 +113,7 @@ lockdown_changed (GConfClient *client,
}
if (g_strcmp0 (key, LOCKDOWN_KEY_USER) == 0 || g_strcmp0 (key, LOCKDOWN_KEY_SCREENSAVER) == 0) {
- rebuild_session_items(session_root_menuitem, dbus_interface);
+ rebuild_session_items(session_root_menuitem);
}
return;
@@ -176,9 +165,8 @@ lock_if_possible (void) {
ensure_gconf_client ();
if (!gconf_client_get_bool (gconf_client, LOCKDOWN_KEY_SCREENSAVER, NULL)) {
- lock_screen(NULL, 0, NULL);
+ lock_screen (NULL, 0, NULL);
}
-
return;
}
@@ -234,7 +222,7 @@ suspend_prop_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata)
gboolean local_can_suspend = g_value_get_boolean(&candoit);
if (local_can_suspend != can_suspend) {
can_suspend = local_can_suspend;
- rebuild_session_items(session_root_menuitem, dbus_interface);
+ rebuild_session_items(session_root_menuitem);
}
return;
@@ -259,7 +247,7 @@ hibernate_prop_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata)
gboolean local_can_hibernate = g_value_get_boolean(&candoit);
if (local_can_hibernate != can_hibernate) {
can_hibernate = local_can_hibernate;
- rebuild_session_items(session_root_menuitem, dbus_interface);
+ rebuild_session_items(session_root_menuitem);
}
return;
@@ -320,7 +308,7 @@ allowed_cb (DBusGProxy *proxy, gboolean OUT_allowed, GError *error, gpointer use
if (OUT_allowed != *can_do) {
*can_do = OUT_allowed;
- rebuild_session_items (session_root_menuitem, dbus_interface);
+ rebuild_session_items (session_root_menuitem);
}
}
@@ -397,216 +385,10 @@ show_dialog (DbusmenuMenuitem * mi, guint timestamp, gchar * type)
return;
}
-/* Checks to see if we can create sessions */
-static gboolean
-check_new_session (void)
-{
- return TRUE;
-}
-
-/* Starts a new generic session */
-static void
-activate_new_session (DbusmenuMenuitem * mi, guint timestamp, gpointer user_data)
-{
- lock_if_possible();
-
- users_service_dbus_show_greeter (USERS_SERVICE_DBUS(user_data));
-
- return;
-}
-/* Activates a session for a particular user. */
static void
-activate_user_session (DbusmenuMenuitem *mi, guint timestamp, gpointer user_data)
-{
- UserData *user = (UserData *)user_data;
- UsersServiceDbus *service = user->service;
-
- lock_if_possible();
-
- users_service_dbus_activate_user_session (service, user);
-}
-
-/* Comparison function to look into the UserData struct
- to compare by using the username value */
-static gint
-compare_users_by_username (const gchar *a,
- const gchar *b)
-{
- UserData *user1 = (UserData *)a;
- UserData *user2 = (UserData *)b;
-
- 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 */
-static void
-rebuild_user_items (DbusmenuMenuitem *root,
- UsersServiceDbus *service)
-{
- DbusmenuMenuitem *mi = NULL;
- DbusmenuMenuitem *guest_mi = NULL;
- GList *u;
- UserData *user;
- gboolean can_activate;
- GList *children;
-
- /* Make sure we have a valid GConf client, and build one
- if needed */
- ensure_gconf_client ();
-
- /* Check to see which menu items we're allowed to have */
- can_activate = users_service_dbus_can_activate_session (service) &&
- !gconf_client_get_bool (gconf_client, LOCKDOWN_KEY_USER, NULL);
-
- /* Remove the old menu items if that makes sense */
- children = dbusmenu_menuitem_take_children (root);
- g_list_foreach (children, (GFunc)g_object_unref, NULL);
- g_list_free (children);
-
- /* Set to NULL just incase we don't end up building one */
- users_service_dbus_set_guest_item(service, NULL);
-
- /* Build all of the user switching items */
- if (can_activate == TRUE)
- {
- if (check_new_session ()){
- switch_menuitem = dbusmenu_menuitem_new ();
- 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),
- service);
- }
-
- GList * users = NULL;
- users = users_service_dbus_get_user_list (service);
- guint user_count = g_list_length(users);
- // g_debug ("USER COUNT = %i", user_count);
- // We only want to show this menu when we have more than one registered
- // user
- session_dbus_set_user_menu_visibility (session_dbus, user_count > 1);
-
- 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;
-
- g_debug ("%i %s", (gint)user->uid, user->user_name);
-
- 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);
- 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);
- if (user->icon_file != NULL && user->icon_file[0] != '\0') {
- dbusmenu_menuitem_property_set(mi, USER_ITEM_PROP_ICON, user->icon_file);
- } else {
- dbusmenu_menuitem_property_set(mi, USER_ITEM_PROP_ICON, USER_ITEM_ICON_DEFAULT);
- }
-
- gboolean logged_in = g_strcmp0 (user->user_name, g_get_user_name()) == 0;
- dbusmenu_menuitem_property_set_bool (mi,
- USER_ITEM_PROP_IS_CURRENT_USER,
- logged_in);
- if (logged_in == TRUE){
- g_debug ("about to set the users real name to %s for user %s",
- user->real_name, user->user_name);
- session_dbus_set_users_real_name (session_dbus, user->real_name);
- }
-
- dbusmenu_menuitem_child_append (root, mi);
- g_signal_connect (G_OBJECT (mi),
- DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
- G_CALLBACK (activate_user_session),
- user);
- user->menuitem = mi;
- }
- }
- g_list_free(users);
- }
- // Add the online accounts and separator
- DbusmenuMenuitem * separator1 = dbusmenu_menuitem_new();
- dbusmenu_menuitem_property_set (separator1,
- DBUSMENU_MENUITEM_PROP_TYPE,
- DBUSMENU_CLIENT_TYPES_SEPARATOR);
- dbusmenu_menuitem_child_append (root, separator1);
- DbusmenuMenuitem * online_accounts_item = dbusmenu_menuitem_new();
- dbusmenu_menuitem_property_set (online_accounts_item,
- DBUSMENU_MENUITEM_PROP_TYPE,
- DBUSMENU_CLIENT_TYPES_DEFAULT);
- dbusmenu_menuitem_property_set (online_accounts_item,
- DBUSMENU_MENUITEM_PROP_LABEL,
- _("Online Accounts..."));
-
- g_signal_connect (G_OBJECT (online_accounts_item),
- DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
- G_CALLBACK (activate_online_accounts),
- NULL);
-
- dbusmenu_menuitem_child_append (root, online_accounts_item);
-}
-
-// TODO
-// Wait until dialog is complete to find out name to pass
-// to the control centre.
-static void
-activate_online_accounts (DbusmenuMenuitem *mi,
- guint timestamp,
- gpointer user_data)
-{
- GError * error = NULL;
- if (!g_spawn_command_line_async("gnome-control-center online-accounts", &error))
- {
- g_warning("Unable to show control centre: %s", error->message);
- g_error_free(error);
- }
-}
-
-static void
-rebuild_session_items (DbusmenuMenuitem *root,
- UsersServiceDbus *service)
+rebuild_session_items (DbusmenuMenuitem *root)
+
{
gboolean can_lockscreen;
@@ -731,17 +513,6 @@ rebuild_session_items (DbusmenuMenuitem *root,
return;
}
-/* Signal called when a user is added. It updates the count and
- rebuilds the menu */
-static void
-user_change (UsersServiceDbus *service,
- const gchar *user_id,
- gpointer user_data)
-{
- DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data;
- rebuild_user_items (root, service);
- return;
-}
/* When the service interface starts to shutdown, we
should follow it. */
@@ -825,32 +596,20 @@ main (int argc, char ** argv)
g_idle_add(lock_screen_setup, NULL);
session_root_menuitem = dbusmenu_menuitem_new();
- g_debug("Session Root ID: %d", dbusmenu_menuitem_get_id(session_root_menuitem));
-
- dbus_interface = g_object_new (USERS_SERVICE_DBUS_TYPE, NULL);
-
- rebuild_session_items (session_root_menuitem, dbus_interface);
+ rebuild_session_items (session_root_menuitem);
DbusmenuServer * server = dbusmenu_server_new(INDICATOR_SESSION_DBUS_OBJECT);
dbusmenu_server_set_root(server, session_root_menuitem);
- users_root_menuitem = dbusmenu_menuitem_new();
- rebuild_user_items (users_root_menuitem, dbus_interface);
- g_signal_connect (G_OBJECT (dbus_interface),
- "user-added",
- G_CALLBACK (user_change),
- users_root_menuitem);
- g_signal_connect (G_OBJECT (dbus_interface),
- "user-removed",
- G_CALLBACK (user_change),
- users_root_menuitem);
-
+ // Users
+ UserMenuMgr* user_mgr = user_menu_mgr_new (session_dbus);
+
setup_restart_watch();
-
setup_up();
- DbusmenuServer * users_server = dbusmenu_server_new (INDICATOR_USERS_DBUS_OBJECT);
- dbusmenu_server_set_root (users_server, users_root_menuitem);
+ DbusmenuServer* users_server = dbusmenu_server_new (INDICATOR_USERS_DBUS_OBJECT);
+
+ dbusmenu_server_set_root (users_server, user_mgr_get_root_item (user_mgr));
mainloop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(mainloop);