diff options
-rw-r--r-- | .bzrignore | 1 | ||||
-rw-r--r-- | debian/changelog | 13 | ||||
-rw-r--r-- | src/Makefile.am | 8 | ||||
-rw-r--r-- | src/consolekit-manager.xml | 353 | ||||
-rw-r--r-- | src/gtk-dialog/gconf-helper.c | 4 | ||||
-rw-r--r-- | src/gtk-dialog/gtk-logout-helper.c | 23 | ||||
-rw-r--r-- | src/gtk-dialog/logout-dialog.c | 8 | ||||
-rw-r--r-- | src/indicator-session.c | 1 | ||||
-rw-r--r-- | src/session-service.c | 161 | ||||
-rw-r--r-- | src/users-service-dbus.c | 11 | ||||
-rw-r--r-- | src/users-service-dbus.h | 2 |
11 files changed, 480 insertions, 105 deletions
@@ -54,3 +54,4 @@ indicator-session-[0-9].[0-9].[0-9].tar.gz indicator-session-[0-9].[0-9].tar.gz indicator-session-[0-9].[0-9].[0-9].tar.gz.asc indicator-session-[0-9].[0-9].tar.gz.asc +src/consolekit-manager-client.h diff --git a/debian/changelog b/debian/changelog index 68d8e57..bedd299 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,16 @@ +indicator-session (0.2.4-0ubuntu3~ppa1) UNRELEASED; urgency=low + + * Upstream Merge + * Fix naming to "Switch off" and "Sleep" + * Blocking the current user from the user list + * Change sorting to be based on real names and handle conflicts + * Removing some ConsoleKit errors + * Memory leak on PangoLayout allocation + * Don't set GTK decorations + * ConsoleKit fallback if gnome-session not available + + -- Ted Gould <ted@ubuntu.com> Wed, 03 Mar 2010 21:03:18 -0600 + indicator-session (0.2.4-0ubuntu2) lucid; urgency=low * Backport upstream change to fix decoration rendering issues diff --git a/src/Makefile.am b/src/Makefile.am index fdbf466..a07c782 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -17,6 +17,12 @@ libsession_la_CFLAGS = $(APPLET_CFLAGS) -Wall -Werror libsession_la_LIBADD = $(APPLET_LIBS) libsession_la_LDFLAGS = -module -avoid-version +consolekit-manager-client.h: $(srcdir)/consolekit-manager.xml + dbus-binding-tool \ + --prefix=_consolekit_manager_client \ + --mode=glib-client \ + --output=consolekit-manager-client.h \ + $(srcdir)/consolekit-manager.xml users-service-client.h: $(srcdir)/users-service.xml dbus-binding-tool \ @@ -56,11 +62,13 @@ indicator_session_service_LDADD = $(SESSIONSERVICE_LIBS) $(GCONF_LIBS) ############### BUILT_SOURCES = \ + consolekit-manager-client.h \ users-service-client.h \ users-service-marshal.h \ users-service-marshal.c EXTRA_DIST = \ + consolekit-manager.xml \ users-service.xml \ users-service.list diff --git a/src/consolekit-manager.xml b/src/consolekit-manager.xml new file mode 100644 index 0000000..f903b55 --- /dev/null +++ b/src/consolekit-manager.xml @@ -0,0 +1,353 @@ +<?xml version="1.0" encoding="UTF-8"?> +<node name="/org/freedesktop/ConsoleKit/Manager" + xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd" +> + + <interface name="org.freedesktop.ConsoleKit.Manager"> + <method name="Restart"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <doc:doc> + <doc:description> + <doc:para>This method initiates a request to restart (ie. reboot) the computer system.</doc:para> + </doc:description> + </doc:doc> + </method> + + <method name="CanRestart"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <arg name="can_restart" type="b" direction="out"/> + </method> + + <method name="Stop"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <doc:doc> + <doc:description> + <doc:para>This method initiates a request to stop (ie. shutdown) the computer system.</doc:para> + </doc:description> + </doc:doc> + </method> + + <method name="CanStop"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <arg name="can_stop" type="b" direction="out"/> + </method> + + <method name="OpenSession"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <arg name="cookie" direction="out" type="s"> + <doc:doc> + <doc:summary>The secret cookie that is used to identify the new session</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>This method requests that a new <doc:ref type="interface" to="Session">Session</doc:ref> + be created for the calling process. The properties of this new Session are set automatically + from information collected about the calling process. + </doc:para> + <doc:para>This new session exists until the calling process disconnects from the system bus or + calls <doc:ref type="method" to="Manager.CloseSession">CloseSession()</doc:ref>. + </doc:para> + <doc:para>It is the responsibility of the calling process to set the environment variable + XDG_SESSION_COOKIE to the value of the returned cookie. This cookie should only + be made available to child processes of the caller so that they may be identified + as members of this session. + </doc:para> + <doc:para>See this simple example: + <doc:example language="c" title="simple example"><doc:code> + DBusError error; + DBusMessage *message; + DBusMessage *reply; + + message = dbus_message_new_method_call ("org.freedesktop.ConsoleKit", + "/org/freedesktop/ConsoleKit/Manager", + "org.freedesktop.ConsoleKit.Manager", + "OpenSession"); + if (message == NULL) { + goto out; + } + + dbus_error_init (&error); + reply = dbus_connection_send_with_reply_and_block (connector->connection, + message, + -1, + &error); + if (reply == NULL) { + goto out; + } + + dbus_error_init (&error); + if (! dbus_message_get_args (reply, + &error, + DBUS_TYPE_STRING, &cookie, + DBUS_TYPE_INVALID)) { + goto out; + } + + </doc:code></doc:example></doc:para> + </doc:description> + <doc:seealso><doc:ref type="method" to="Manager.OpenSessionWithParameters">OpenSessionWithParameters()</doc:ref></doc:seealso> + </doc:doc> + </method> + <method name="OpenSessionWithParameters"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <arg name="parameters" direction="in" type="a(sv)"> + <doc:doc> + <doc:summary>An array of sets of property names and values</doc:summary> + </doc:doc> + </arg> + <arg name="cookie" direction="out" type="s"> + <doc:doc> + <doc:summary>The secret cookie that is used to identify the new session</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>This method requests that a new <doc:ref type="interface" to="Session">Session</doc:ref> + be created for the calling process. The properties of this new Session are from the + parameters provided. + </doc:para> + <doc:para>This new session exists until the calling process disconnects from the system bus or + calls <doc:ref type="method" to="Manager.CloseSession">CloseSession()</doc:ref>. + </doc:para> + <doc:para>It is the responsibility of the calling process to set the environment variable + XDG_SESSION_COOKIE to the value of the returned cookie. This cookie should only + be made available to child processes of the caller so that they may be identified + as members of this session. + </doc:para> + <doc:para>See the <doc:ref type="interface" to="Session">Session</doc:ref> properties for a list of valid parameters.</doc:para> + </doc:description> + <doc:seealso><doc:ref type="interface" to="Session">org.freedesktop.ConsoleKit.Session</doc:ref></doc:seealso> + <doc:permission>This method is restricted to privileged users by D-Bus policy.</doc:permission> + </doc:doc> + </method> + <method name="CloseSession"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <arg name="cookie" direction="in" type="s"> + <doc:doc> + <doc:summary>The secret cookie that is used to identify the session</doc:summary> + </doc:doc> + </arg> + <arg name="result" direction="out" type="b"> + <doc:doc> + <doc:summary>Whether the session was successfully closed</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>This method is used to close the session identified by the supplied cookie. + </doc:para> + <doc:para>The session can only be closed by the same process that opened the session. + </doc:para> + </doc:description> + </doc:doc> + </method> + + <method name="GetSeats"> + <arg name="seats" direction="out" type="ao"> + <doc:doc> + <doc:summary>an array of Seat IDs</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>This gets a list of all the <doc:ref type="interface" to="Seat">Seats</doc:ref> + that are currently present on the system.</doc:para> + <doc:para>Each Seat ID is an D-Bus object path for the object that implements the + <doc:ref type="interface" to="Seat">Seat</doc:ref> interface.</doc:para> + </doc:description> + <doc:seealso><doc:ref type="interface" to="Seat">org.freedesktop.ConsoleKit.Seat</doc:ref></doc:seealso> + </doc:doc> + </method> + + <method name="GetSessions"> + <arg name="sessions" direction="out" type="ao"> + <doc:doc> + <doc:summary>an array of Session IDs</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>This gets a list of all the <doc:ref type="interface" to="Session">Sessions</doc:ref> + that are currently present on the system.</doc:para> + <doc:para>Each Session ID is an D-Bus object path for the object that implements the + <doc:ref type="interface" to="Session">Session</doc:ref> interface.</doc:para> + </doc:description> + <doc:seealso><doc:ref type="interface" to="Session">org.freedesktop.ConsoleKit.Session</doc:ref></doc:seealso> + </doc:doc> + </method> + + <method name="GetSessionForCookie"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <arg name="cookie" direction="in" type="s"> + <doc:doc> + <doc:summary>The secret cookie that is used to identify the session</doc:summary> + </doc:doc> + </arg> + <arg name="ssid" direction="out" type="o"> + <doc:doc> + <doc:summary>The object identifier for the current session</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Returns the session ID that is associated with the specified cookie. + </doc:para> + </doc:description> + </doc:doc> + </method> + <method name="GetSessionForUnixProcess"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <arg name="pid" direction="in" type="u"> + <doc:doc> + <doc:summary>The POSIX process ID</doc:summary> + </doc:doc> + </arg> + <arg name="ssid" direction="out" type="o"> + <doc:doc> + <doc:summary>The object identifier for the current session</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Attempts to determine the session ID for the specified + POSIX process ID (pid). + </doc:para> + </doc:description> + </doc:doc> + </method> + <method name="GetCurrentSession"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <arg name="ssid" direction="out" type="o"> + <doc:doc> + <doc:summary>The object identifier for the current session</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Attempts to determine the session ID that the caller belongs to. + </doc:para> + <doc:para>See this example of using dbus-send: + <doc:example language="shell" title="shell example"><doc:code> + dbus-send --system --dest=org.freedesktop.ConsoleKit \ + --type=method_call --print-reply --reply-timeout=2000 \ + /org/freedesktop/ConsoleKit/Manager \ + org.freedesktop.ConsoleKit.Manager.GetCurrentSession + </doc:code></doc:example></doc:para> + </doc:description> + </doc:doc> + </method> + <method name="GetSessionsForUnixUser"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <arg name="uid" direction="in" type="u"> + <doc:doc> + <doc:summary>POSIX User identification</doc:summary> + </doc:doc> + </arg> + <arg name="sessions" direction="out" type="ao"> + <doc:doc> + <doc:summary>an array of Session IDs</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>This gets a list of all the <doc:ref type="interface" to="Session">Sessions</doc:ref> + that are currently open for the specified user.</doc:para> + <doc:para>Each Session ID is an D-Bus object path for the object that implements the + <doc:ref type="interface" to="Session">Session</doc:ref> interface.</doc:para> + </doc:description> + </doc:doc> + </method> + <method name="GetSessionsForUser"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <arg name="uid" direction="in" type="u"> + <doc:doc> + <doc:summary>User identification</doc:summary> + </doc:doc> + </arg> + <arg name="sessions" direction="out" type="ao"> + <doc:doc> + <doc:summary>an array of Session IDs</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>This gets a list of all the <doc:ref type="interface" to="Session">Sessions</doc:ref> + that are currently open for the specified user.</doc:para> + <doc:para>Each Session ID is an D-Bus object path for the object that implements the + <doc:ref type="interface" to="Session">Session</doc:ref> interface.</doc:para> + </doc:description> + <doc:deprecated version="0.1.3" instead="GetSessionsForUnixUser"/> + </doc:doc> + </method> + + <method name="GetSystemIdleHint"> + <arg name="idle_hint" type="b" direction="out"> + <doc:doc> + <doc:summary>The value of the system-idle-hint</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Returns TRUE if the <doc:ref type="property" to="Session:idle-hint">idle-hint</doc:ref> + property of every open session is TRUE or if there are no open sessions. + </doc:para> + </doc:description> + </doc:doc> + </method> + <method name="GetSystemIdleSinceHint"> + <arg name="iso8601_datetime" type="s" direction="out"> + <doc:doc> + <doc:summary>An ISO 8601 format date-type string</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Returns an ISO 8601 date-time string that corresponds to + the time of the last change of the system-idle-hint. + </doc:para> + </doc:description> + </doc:doc> + </method> + + <signal name="SeatAdded"> + <arg name="sid" type="o"> + <doc:doc> + <doc:summary>The Seat ID for the added seat</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Emitted when a Seat has been added to the system. + </doc:para> + </doc:description> + </doc:doc> + </signal> + <signal name="SeatRemoved"> + <arg name="sid" type="o"> + <doc:doc> + <doc:summary>The Seat ID for the removed seat</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Emitted when a Seat has been removed from the system. + </doc:para> + </doc:description> + </doc:doc> + </signal> + <signal name="SystemIdleHintChanged"> + <arg name="hint" type="b"> + <doc:doc> + <doc:summary>The value of the system-idle-hint</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Emitted when the value of the system-idle-hint has changed. + </doc:para> + </doc:description> + </doc:doc> + </signal> + </interface> +</node> 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 4c6614c..7453ce4 100644 --- a/src/gtk-dialog/gtk-logout-helper.c +++ b/src/gtk-dialog/gtk-logout-helper.c @@ -43,19 +43,23 @@ consolekit_fallback (LogoutDialogAction action) return; } + GError * error = NULL; + switch (action) { case LOGOUT_DIALOG_LOGOUT: 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_SHUTDOWN: - dbus_g_proxy_call_no_reply(proxy, - "Stop", - G_TYPE_INVALID); + dbus_g_proxy_call(proxy, + "Stop", + &error, + G_TYPE_INVALID); break; case LOGOUT_DIALOG_RESTART: - dbus_g_proxy_call_no_reply(proxy, - "Restart", - G_TYPE_INVALID); + dbus_g_proxy_call(proxy, + "Restart", + &error, + G_TYPE_INVALID); break; default: g_warning("Unknown action"); @@ -64,6 +68,11 @@ consolekit_fallback (LogoutDialogAction action) g_object_unref(proxy); + if (error != NULL) { + g_error("Unable to signal ConsoleKit: %s", error->message); + g_error_free(error); + } + return; } @@ -150,7 +159,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 98806ca..07fc6df 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/indicator-session.c b/src/indicator-session.c index a97eb95..a815e40 100644 --- a/src/indicator-session.c +++ b/src/indicator-session.c @@ -214,6 +214,7 @@ switch_property_change (DbusmenuMenuitem * item, const gchar * property, const G gint width; pango_layout_get_pixel_size(layout, &width, NULL); + g_object_unref(layout); g_debug("Username width %dpx", width); gint point = pango_font_description_get_size(style->font_desc); diff --git a/src/session-service.c b/src/session-service.c index 289bff8..eb1966e 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -68,9 +68,6 @@ static UsersServiceDbus *dbus_interface = NULL; 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; static DBusGProxy * up_main_proxy = NULL; @@ -406,7 +403,15 @@ compare_users_by_username (const gchar *a, UserData *user1 = (UserData *)a; UserData *user2 = (UserData *)b; - return g_strcmp0 (user1->user_name, user2->user_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 */ @@ -415,6 +420,7 @@ rebuild_items (DbusmenuMenuitem *root, UsersServiceDbus *service) { DbusmenuMenuitem *mi = NULL; + DbusmenuMenuitem * guest_mi = NULL; GList *u; UserData *user; gboolean can_activate; @@ -444,12 +450,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 ()) @@ -472,39 +478,55 @@ rebuild_items (DbusmenuMenuitem *root, } } - 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)) - { - user = u->data; - - user->service = service; - - 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); - } - } - } + GList * users = NULL; + 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; + } + + 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); + 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); @@ -521,7 +543,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"); @@ -542,9 +564,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"); @@ -562,42 +584,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; - - count++; - - 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; - - count--; - - 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)); - - count = users_service_dbus_get_user_count (service); - - rebuild_items (root, service); + DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data; + rebuild_items (root, service); + return; } /* When the service interface starts to shutdown, we @@ -638,15 +631,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(); diff --git a/src/users-service-dbus.c b/src/users-service-dbus.c index 0e5c922..4aefdff 100644 --- a/src/users-service-dbus.c +++ b/src/users-service-dbus.c @@ -34,6 +34,7 @@ #include "users-service-dbus.h" #include "users-service-client.h" #include "users-service-marshal.h" +#include "consolekit-manager-client.h" static void users_service_dbus_class_init (UsersServiceDbusClass *klass); static void users_service_dbus_init (UsersServiceDbus *self); @@ -509,14 +510,7 @@ add_sessions_for_user (UsersServiceDbus *self, int i; error = NULL; - if (!dbus_g_proxy_call (priv->ck_proxy, - "GetSessionsForUnixUser", - &error, - G_TYPE_UINT, user->uid, - G_TYPE_INVALID, - dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), - &sessions, - G_TYPE_INVALID)) + if (!org_freedesktop_ConsoleKit_Manager_get_sessions_for_unix_user(priv->ck_proxy, user->uid, &sessions, &error)) { g_debug ("Failed to call GetSessionsForUnixUser: %s", error->message); g_error_free (error); @@ -662,6 +656,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; }; |