diff options
-rw-r--r-- | configure.ac | 15 | ||||
-rw-r--r-- | src/Makefile.am | 19 | ||||
-rw-r--r-- | src/session-service.c | 308 | ||||
-rw-r--r-- | src/users-service.c | 326 |
4 files changed, 293 insertions, 375 deletions
diff --git a/configure.ac b/configure.ac index a358f24..08e2bce 100644 --- a/configure.ac +++ b/configure.ac @@ -37,20 +37,9 @@ AC_SUBST(APPLET_CFLAGS) AC_SUBST(APPLET_LIBS) DBUSMENUGLIB_REQUIRED_VERSION=0.1.1 -TELEPATHYGLIB_REQUIRED_VERSION=0.9.0 -PKG_CHECK_MODULES(STATUSSERVICE, dbusmenu-glib >= $DBUSMENUGLIB_REQUIRED_VERSION - telepathy-glib >= $TELEPATHYGLIB_REQUIRED_VERSION) - -AC_SUBST(STATUSERVICE_CFLAGS) -AC_SUBST(STATUSERVICE_LIBS) - -PKG_CHECK_MODULES(USERSSERVICE, dbusmenu-glib >= $DBUSMENUGLIB_REQUIRED_VERSION) - -AC_SUBST(USERSERVICE_CFLAGS) -AC_SUBST(USERSERVICE_LIBS) - -PKG_CHECK_MODULES(SESSIONSERVICE, dbusmenu-glib >= $DBUSMENUGLIB_REQUIRED_VERSION) +PKG_CHECK_MODULES(SESSIONSERVICE, dbusmenu-glib >= $DBUSMENUGLIB_REQUIRED_VERSION + indicator >= $INDICATOR_REQUIRED_VERSION) AC_SUBST(SESSIONERVICE_CFLAGS) AC_SUBST(SESSIONERVICE_LIBS) diff --git a/src/Makefile.am b/src/Makefile.am index daaaf61..e5d5a3c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,6 @@ SUBDIRS = gtk-dialog -libexec_PROGRAMS = indicator-users-service indicator-session-service +libexec_PROGRAMS = indicator-session-service ################### # Indicator Stuff @@ -34,19 +34,6 @@ users-service-marshal.c: $(srcdir)/users-service.list --prefix=_users_service_marshal $(srcdir)/users-service.list \ > users-service-marshal.c -############### -# Users Stuff -############### - -indicator_users_service_SOURCES = \ - lock-helper.c \ - lock-helper.h \ - users-service.c \ - users-service-dbus.c \ - users-service-marshal.c -indicator_users_service_CFLAGS = $(USERSSERVICE_CFLAGS) -Wall -Werror -indicator_users_service_LDADD = $(USERSSERVICE_LIBS) - ################# # Session Stuff ################# @@ -55,7 +42,9 @@ indicator_session_service_SOURCES = \ lock-helper.c \ lock-helper.h \ session-service.c \ - gtk-dialog/gconf-helper.c + gtk-dialog/gconf-helper.c \ + 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) diff --git a/src/session-service.c b/src/session-service.c index a91170f..bec7749 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -7,6 +7,7 @@ Copyright 2009 Canonical Ltd. Authors: Ted Gould <ted@canonical.com> Christoph Korn <c_korn@gmx.de> + Cody Russell <crussell@canonical.com> 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 @@ -23,6 +24,8 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <config.h> +#include <unistd.h> + #include <glib/gi18n.h> #include <dbus/dbus-glib.h> @@ -30,17 +33,39 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <libdbusmenu-glib/server.h> #include <libdbusmenu-glib/menuitem.h> +#include <libdbusmenu-glib/client.h> + +#include <libindicator/indicator-service.h> #include "dbus-shared-names.h" #include "gtk-dialog/gconf-helper.h" +#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 GUEST_SESSION_LAUNCHER "/usr/share/gdm/guest-session/guest-session-launch" + +typedef struct _ActivateData ActivateData; +struct _ActivateData +{ + UsersServiceDbus *service; + UserData *user; +}; + +static DBusGConnection *system_bus = NULL; +static DBusGProxy *gdm_proxy = NULL; +static UsersServiceDbus *dbus_interface = NULL; + +static DbusmenuMenuitem *lock_menuitem = NULL; + +static gint count; +static GList *users; + static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; static DBusGProxy * dkp_main_proxy = NULL; @@ -67,7 +92,7 @@ sleep_response (DBusGProxy * proxy, DBusGProxyCall * call, gpointer data) /* Let's put this machine to sleep, with some info on how it should sleep. */ static void -sleep (DbusmenuMenuitem * mi, gpointer userdata) +machine_sleep (DbusmenuMenuitem * mi, gpointer userdata) { gchar * type = (gchar *)userdata; @@ -239,10 +264,194 @@ show_dialog (DbusmenuMenuitem * mi, gchar * type) return; } -/* This function creates all of the menuitems that the service - provides in the UI. It also connects them to the callbacks. */ +/* 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_SENSITIVE, FALSE); + } else { + dbusmenu_menuitem_property_set_bool(lock_menuitem, DBUSMENU_MENUITEM_PROP_SENSITIVE, TRUE); + } + + return; +} + +/* Checks to see if we should show the guest suession item */ +static gboolean +check_guest_session (void) +{ + if (geteuid() < 500) { + /* System users shouldn't have guest account shown. Mosly + this would be the case of the guest user itself. */ + return FALSE; + } + if (!g_file_test(GUEST_SESSION_LAUNCHER, G_FILE_TEST_IS_EXECUTABLE)) { + /* It doesn't appear that the Guest session stuff is + installed. So let's not use it then! */ + return FALSE; + } + + return TRUE; +} + +/* Called when someone clicks on the guest session item. */ +static void +activate_guest_session (DbusmenuMenuitem * mi, gpointer user_data) +{ + GError * error = NULL; + if (!g_spawn_command_line_async(GUEST_SESSION_LAUNCHER, &error)) { + g_warning("Unable to start guest session: %s", error->message); + g_error_free(error); + } + + return; +} + +/* Checks to see if we can create sessions and get a proxy + to the display manager (GDM) */ +static gboolean +check_new_session (void) +{ + if (system_bus == NULL) { + system_bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); + } + + if (system_bus == NULL) { + return FALSE; + } + + if (gdm_proxy == NULL) { + gdm_proxy = dbus_g_proxy_new_for_name(system_bus, + "org.gnome.DisplayManager", + "/org/gnome/DisplayManager/LocalDisplayFactory", + "org.gnome.DisplayManager.LocalDisplayFactory"); + } + + if (gdm_proxy == NULL) { + return FALSE; + } + + return TRUE; +} + +/* Starts a new generic session */ +static void +activate_new_session (DbusmenuMenuitem * mi, gpointer user_data) +{ + GError * error = NULL; + if (!g_spawn_command_line_async("gdmflexiserver --startnew", &error)) { + g_warning("Unable to start new session: %s", error->message); + g_error_free(error); + } + + return; +} + +/* Activates a session for a particular user. */ static void -create_items (DbusmenuMenuitem * root) { +activate_user_session (DbusmenuMenuitem *mi, gpointer user_data) +{ + UserData *user = (UserData *)user_data; + UsersServiceDbus *service = user->service; + + 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; + + return g_strcmp0 (user1->user_name, user2->user_name); +} + +/* Builds up the menu for us */ +static void +rebuild_items (DbusmenuMenuitem *root, + UsersServiceDbus *service) +{ + DbusmenuMenuitem *mi = NULL; + GList *u; + UserData *user; + gboolean can_activate; + GList *children; + + can_activate = users_service_dbus_can_activate_session (service); + + children = dbusmenu_menuitem_take_children (root); + g_list_foreach (children, (GFunc)g_object_unref, NULL); + g_list_free (children); + + lock_menuitem = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(lock_menuitem, DBUSMENU_MENUITEM_PROP_LABEL, _("Lock Screen")); + g_signal_connect(G_OBJECT(lock_menuitem), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(lock_screen), NULL); + dbusmenu_menuitem_child_append(root, lock_menuitem); + if (!will_lock_screen()) { + dbusmenu_menuitem_property_set_bool(lock_menuitem, DBUSMENU_MENUITEM_PROP_SENSITIVE, FALSE); + } else { + dbusmenu_menuitem_property_set_bool(lock_menuitem, DBUSMENU_MENUITEM_PROP_SENSITIVE, TRUE); + } + + if (can_activate == TRUE) + { + if (check_guest_session ()) + { + mi = dbusmenu_menuitem_new (); + dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Guest Session")); + dbusmenu_menuitem_child_append (root, mi); + g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_guest_session), NULL); + } + + 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_LABEL, 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); + } + } + + 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); + } + } + + DbusmenuMenuitem * separator = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR); + dbusmenu_menuitem_child_append(root, separator); + logout_mi = dbusmenu_menuitem_new(); if (supress_confirmations()) { dbusmenu_menuitem_property_set(logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out")); @@ -256,13 +465,13 @@ create_items (DbusmenuMenuitem * root) { 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_child_append(root, suspend_mi); - g_signal_connect(G_OBJECT(suspend_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(sleep), "Suspend"); + g_signal_connect(G_OBJECT(suspend_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(machine_sleep), "Suspend"); hibernate_mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set_bool(hibernate_mi, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); dbusmenu_menuitem_property_set(hibernate_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Hibernate")); dbusmenu_menuitem_child_append(root, hibernate_mi); - g_signal_connect(G_OBJECT(hibernate_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(sleep), "Hibernate"); + g_signal_connect(G_OBJECT(hibernate_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(machine_sleep), "Hibernate"); restart_mi = dbusmenu_menuitem_new(); if (supress_confirmations()) { @@ -292,6 +501,59 @@ create_items (DbusmenuMenuitem * root) { return; } +/* 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) +{ + 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); +} + +/* When the service interface starts to shutdown, we + should follow it. */ +void +service_shutdown (IndicatorService * service, gpointer user_data) +{ + if (mainloop != NULL) { + g_debug("Service shutdown"); + g_main_loop_quit(mainloop); + } + return; +} + /* Main, is well, main. It brings everything up and throws us into the mainloop of no return. */ int @@ -305,27 +567,31 @@ main (int argc, char ** argv) bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); textdomain (GETTEXT_PACKAGE); - DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); - DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); - GError * error = NULL; - guint nameret = 0; - - if (!org_freedesktop_DBus_request_name(bus_proxy, INDICATOR_SESSION_DBUS_NAME, 0, &nameret, &error)) { - g_error("Unable to call to request name"); - return 1; - } - - if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { - g_error("Unable to get name"); - return 1; - } + IndicatorService * service = indicator_service_new_version(INDICATOR_SESSION_DBUS_NAME, + INDICATOR_SESSION_DBUS_VERSION); + g_signal_connect(G_OBJECT(service), + INDICATOR_SERVICE_SIGNAL_SHUTDOWN, + 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)); - create_items(root_menuitem); + dbus_interface = g_object_new (USERS_SERVICE_DBUS_TYPE, NULL); + + create_items (root_menuitem, dbus_interface); + + g_signal_connect (G_OBJECT (dbus_interface), + "user-added", + G_CALLBACK (user_added), + root_menuitem); + g_signal_connect (G_OBJECT (dbus_interface), + "user-removed", + G_CALLBACK (user_removed), + root_menuitem); + setup_dkp(); DbusmenuServer * server = dbusmenu_server_new(INDICATOR_SESSION_DBUS_OBJECT); diff --git a/src/users-service.c b/src/users-service.c deleted file mode 100644 index 0297f01..0000000 --- a/src/users-service.c +++ /dev/null @@ -1,326 +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 <ted@canonical.com> - * Cody Russell <crussell@canonical.com> - * - * 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 <http://www.gnu.org/licenses/>. - */ - -#include <config.h> - -#include <unistd.h> - -#include <glib/gi18n.h> - -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-bindings.h> - -#include <libdbusmenu-glib/server.h> -#include <libdbusmenu-glib/menuitem.h> - -#include "dbus-shared-names.h" -#include "users-service-dbus.h" -#include "lock-helper.h" - -#define GUEST_SESSION_LAUNCHER "/usr/share/gdm/guest-session/guest-session-launch" - -typedef struct _ActivateData ActivateData; -struct _ActivateData -{ - UsersServiceDbus *service; - UserData *user; -}; - -static DBusGConnection *session_bus = NULL; -static DBusGConnection *system_bus = NULL; -static DBusGProxy *bus_proxy = NULL; -static DBusGProxy *gdm_proxy = NULL; -static DbusmenuMenuitem *root_menuitem = NULL; -static GMainLoop *mainloop = NULL; -static UsersServiceDbus *dbus_interface = NULL; - -static DbusmenuMenuitem *lock_menuitem = NULL; - -static gint count; -static GList *users; - -/* 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_SENSITIVE, FALSE); - } else { - dbusmenu_menuitem_property_set_bool(lock_menuitem, DBUSMENU_MENUITEM_PROP_SENSITIVE, TRUE); - } - - return; -} - -static gboolean -check_guest_session (void) -{ - if (geteuid() < 500) { - /* System users shouldn't have guest account shown. Mosly - this would be the case of the guest user itself. */ - return FALSE; - } - if (!g_file_test(GUEST_SESSION_LAUNCHER, G_FILE_TEST_IS_EXECUTABLE)) { - /* It doesn't appear that the Guest session stuff is - installed. So let's not use it then! */ - return FALSE; - } - - return TRUE; -} - -static void -activate_guest_session (DbusmenuMenuitem * mi, gpointer user_data) -{ - GError * error = NULL; - if (!g_spawn_command_line_async(GUEST_SESSION_LAUNCHER, &error)) { - g_warning("Unable to start guest session: %s", error->message); - g_error_free(error); - } - - return; -} - -static gboolean -check_new_session (void) -{ - if (system_bus == NULL) { - system_bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); - } - - if (system_bus == NULL) { - return FALSE; - } - - if (gdm_proxy == NULL) { - gdm_proxy = dbus_g_proxy_new_for_name(system_bus, - "org.gnome.DisplayManager", - "/org/gnome/DisplayManager/LocalDisplayFactory", - "org.gnome.DisplayManager.LocalDisplayFactory"); - } - - if (gdm_proxy == NULL) { - return FALSE; - } - - return TRUE; -} - -static void -activate_new_session (DbusmenuMenuitem * mi, gpointer user_data) -{ - GError * error = NULL; - if (!g_spawn_command_line_async("gdmflexiserver --startnew", &error)) { - g_warning("Unable to start guest session: %s", error->message); - g_error_free(error); - } - - return; -} - -static void -activate_user_session (DbusmenuMenuitem *mi, gpointer user_data) -{ - UserData *user = (UserData *)user_data; - UsersServiceDbus *service = user->service; - - users_service_dbus_activate_user_session (service, user); -} - -static gint -compare_users_by_username (const gchar *a, - const gchar *b) -{ - UserData *user1 = (UserData *)a; - UserData *user2 = (UserData *)b; - - return g_strcmp0 (user1->user_name, user2->user_name); -} - -static void -rebuild_items (DbusmenuMenuitem *root, - UsersServiceDbus *service) -{ - DbusmenuMenuitem *mi = NULL; - GList *u; - UserData *user; - gboolean can_activate; - GList *children; - - can_activate = users_service_dbus_can_activate_session (service); - - children = dbusmenu_menuitem_take_children (root); - g_list_foreach (children, (GFunc)g_object_unref, NULL); - g_list_free (children); - - lock_menuitem = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set(lock_menuitem, DBUSMENU_MENUITEM_PROP_LABEL, _("Lock Screen")); - g_signal_connect(G_OBJECT(lock_menuitem), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(lock_screen), NULL); - dbusmenu_menuitem_child_append(root, lock_menuitem); - if (!will_lock_screen()) { - dbusmenu_menuitem_property_set_bool(lock_menuitem, DBUSMENU_MENUITEM_PROP_SENSITIVE, FALSE); - } else { - dbusmenu_menuitem_property_set_bool(lock_menuitem, DBUSMENU_MENUITEM_PROP_SENSITIVE, TRUE); - } - - if (can_activate == TRUE) - { - if (check_guest_session ()) - { - mi = dbusmenu_menuitem_new (); - dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Guest Session")); - dbusmenu_menuitem_child_append (root, mi); - g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_guest_session), NULL); - } - - 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_LABEL, 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); - } - } - - 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); - } - } -} - -static void -user_added (UsersServiceDbus *service, - UserData *user, - gpointer user_data) -{ - DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data; - - count++; - - rebuild_items (root, service); -} - -static void -user_removed (UsersServiceDbus *service, - UserData *user, - gpointer user_data) -{ - DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data; - - count--; - - rebuild_items (root, service); -} - -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); -} - -int -main (int argc, char ** argv) -{ - g_type_init(); - - /* Setting up i18n and gettext. Apparently, we need - all of these. */ - setlocale (LC_ALL, ""); - bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); - textdomain (GETTEXT_PACKAGE); - - session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); - bus_proxy = dbus_g_proxy_new_for_name (session_bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); - GError * error = NULL; - guint nameret = 0; - - if (!org_freedesktop_DBus_request_name(bus_proxy, INDICATOR_USERS_DBUS_NAME, 0, &nameret, &error)) { - g_error("Unable to call to request name"); - return 1; - } - - if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { - g_error("Unable to get name"); - return 1; - } - - g_idle_add(lock_screen_setup, NULL); - lock_screen_gdm_cb_set(gdm_settings_change); - - dbus_interface = g_object_new (USERS_SERVICE_DBUS_TYPE, NULL); - - root_menuitem = dbusmenu_menuitem_new (); - g_debug ("Root ID: %d", dbusmenu_menuitem_get_id (root_menuitem)); - - create_items (root_menuitem, dbus_interface); - - DbusmenuServer * server = dbusmenu_server_new(INDICATOR_USERS_DBUS_OBJECT); - dbusmenu_server_set_root(server, root_menuitem); - - g_signal_connect (G_OBJECT (dbus_interface), - "user-added", - G_CALLBACK (user_added), - root_menuitem); - g_signal_connect (G_OBJECT (dbus_interface), - "user-removed", - G_CALLBACK (user_removed), - root_menuitem); - - mainloop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(mainloop); - - return 0; -} - |