aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac15
-rw-r--r--src/Makefile.am19
-rw-r--r--src/session-service.c308
-rw-r--r--src/users-service.c326
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;
-}
-