[accounts-dialog] Small improvements



commit 2e075243a7d3f2c02f308e8808c4a68bb59ab40d
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Jan 16 01:39:37 2010 -0500

    Small improvements
    
    Make add/delete calls async, and show a better dialog when trying
    to delete a logged in user, or even yourself.

 TODO                         |    1 -
 data/user-accounts-dialog.ui |    1 +
 src/main.c                   |   67 +++++++++++++++++++++++++++++------------
 src/um-account-dialog.c      |    8 +++++
 src/um-user-manager.c        |   39 ++++++------------------
 src/um-user.c                |   38 +++++++++++++++++++++++
 src/um-user.h                |    1 +
 7 files changed, 105 insertions(+), 50 deletions(-)
---
diff --git a/TODO b/TODO
index 97fc530..b936ff4 100644
--- a/TODO
+++ b/TODO
@@ -2,7 +2,6 @@ Dialog
 ------
 - add supervisor user to supervised accounts
 - move 'disable account' to restrictions
-- consider grouping accounts more obviously, with expanders
 - add language to login options
 - add login option api to gdm, canonical guys have a patch for this
 - async ?
diff --git a/data/user-accounts-dialog.ui b/data/user-accounts-dialog.ui
index 0f7bc78..007ef87 100644
--- a/data/user-accounts-dialog.ui
+++ b/data/user-accounts-dialog.ui
@@ -28,6 +28,7 @@
                         <property name="shadow_type">GTK_SHADOW_IN</property>
                         <child>
                           <object class="GtkTreeView" id="list-treeview">
+                            <property name="name">userlist</property>
                             <property name="visible">True</property>
                             <property name="headers-visible">False</property>
                             <property name="can_focus">True</property>
diff --git a/src/main.c b/src/main.c
index 79219ba..7748919 100644
--- a/src/main.c
+++ b/src/main.c
@@ -347,30 +347,57 @@ delete_user (GtkButton *button, UserAccountDialog *d)
         GtkWidget *dialog;
 
         user = get_selected_user (d);
+        if (user == NULL) {
+                return;
+        }
+        else if (um_user_get_uid (user) == getuid ()) {
+                dialog = gtk_message_dialog_new (GTK_WINDOW (d->main_window),
+                                                 0,
+                                                 GTK_MESSAGE_INFO,
+                                                 GTK_BUTTONS_CLOSE,
+                                                 _("You cannot delete your own account."));
+                g_signal_connect (dialog, "response",
+                                  G_CALLBACK (gtk_widget_destroy), NULL);
+        }
+        else if (um_user_is_logged_in (user)) {
+                dialog = gtk_message_dialog_new (GTK_WINDOW (d->main_window),
+                                                 0,
+                                                 GTK_MESSAGE_INFO,
+                                                 GTK_BUTTONS_CLOSE,
+                                                 _("%s is still logged in"),
+                                                um_user_get_real_name (user));
 
-        dialog = gtk_message_dialog_new (GTK_WINDOW (d->main_window),
-                                         0,
-                                         GTK_MESSAGE_QUESTION,
-                                         GTK_BUTTONS_NONE,
-                                         _("Do you want to keep %s's files ?"),
-                                         um_user_get_real_name (user));
+                gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+                                                          _("Deleting a user while he is logged in can leave the system in an inconsistent state."));
+                g_signal_connect (dialog, "response",
+                                  G_CALLBACK (gtk_widget_destroy), NULL);
+        }
+        else {
+                dialog = gtk_message_dialog_new (GTK_WINDOW (d->main_window),
+                                                 0,
+                                                 GTK_MESSAGE_QUESTION,
+                                                 GTK_BUTTONS_NONE,
+                                                 _("Do you want to keep %s's files ?"),
+                                                um_user_get_real_name (user));
 
-        gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
-                                                  _("It is possible to keep the home directory, mail spool and temporary files around when deleting a user account."));
+                gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+                                                          _("It is possible to keep the home directory, mail spool and temporary files around when deleting a user account."));
 
-        gtk_dialog_add_buttons (GTK_DIALOG (dialog),
-                                _("_Delete Files"), GTK_RESPONSE_NO,
-                                _("_Keep Files"), GTK_RESPONSE_YES,
-                                _("_Cancel"), GTK_RESPONSE_CANCEL,
-                                NULL);
+                gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+                                        _("_Delete Files"), GTK_RESPONSE_NO,
+                                        _("_Keep Files"), GTK_RESPONSE_YES,
+                                        _("_Cancel"), GTK_RESPONSE_CANCEL,
+                                        NULL);
 
-        gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+                g_signal_connect (dialog, "response",
+                                  G_CALLBACK (delete_user_response), d);
+        }
 
-        g_signal_connect (dialog, "response",
-                          G_CALLBACK (delete_user_response), d);
         g_signal_connect (dialog, "close",
                           G_CALLBACK (gtk_widget_destroy), NULL);
 
+        gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+
         gtk_window_present (GTK_WINDOW (dialog));
 
 }
diff --git a/src/um-account-dialog.c b/src/um-account-dialog.c
index e4db837..f0a3baf 100644
--- a/src/um-account-dialog.c
+++ b/src/um-account-dialog.c
@@ -46,6 +46,14 @@ cancel_account_dialog (GtkButton       *button,
 }
 
 static void
+user_created (GError *error, gpointer data)
+{
+	if (error) {
+		g_warning ("Creating user failed: %s", error->message);
+	}
+}
+
+static void
 accept_account_dialog (GtkButton       *button,
                        UmAccountDialog *um)
 {
diff --git a/src/um-user-manager.c b/src/um-user-manager.c
index 290cd22..00c92ff 100644
--- a/src/um-user-manager.c
+++ b/src/um-user-manager.c
@@ -238,22 +238,11 @@ um_user_manager_create_user (UmUserManager *manager,
                              const char    *user_name,
                              const char    *real_name)
 {
-        GError *error = NULL;
-        gchar *object_path;
-
-        if (!dbus_g_proxy_call (manager->proxy,
-                                "CreateUser",
-                                &error,
-                                G_TYPE_STRING, user_name,
-                                G_TYPE_STRING, real_name,
-                                G_TYPE_INVALID,
-                                DBUS_TYPE_G_OBJECT_PATH, &object_path,
-                                G_TYPE_INVALID)) {
-                g_warning ("CreateUser call failed: %s", error->message);
-                g_error_free (error);
-                return;
-        }
-        g_free (object_path);
+        dbus_g_proxy_call_no_reply (manager->proxy,
+                                    "CreateUser",
+                                    G_TYPE_STRING, user_name,
+                                    G_TYPE_STRING, real_name,
+                                    G_TYPE_INVALID);
 }
 
 void
@@ -261,19 +250,11 @@ um_user_manager_delete_user (UmUserManager *manager,
                              UmUser        *user,
                              gboolean       remove_files)
 {
-        GError *error = NULL;
-
-        if (!dbus_g_proxy_call (manager->proxy,
-                                "DeleteUser",
-                                &error,
-                                G_TYPE_INT64, um_user_get_uid (user),
-                                G_TYPE_BOOLEAN, remove_files,
-                                G_TYPE_INVALID,
-                                G_TYPE_INVALID)) {
-                g_warning ("DeleteUser call failed: %s", error->message);
-                g_error_free (error);
-                return;
-        }
+        dbus_g_proxy_call_no_reply (manager->proxy,
+                                    "DeleteUser",
+                                    G_TYPE_INT64, um_user_get_uid (user),
+                                    G_TYPE_BOOLEAN, remove_files,
+                                    G_TYPE_INVALID);
 }
 
 GSList *
diff --git a/src/um-user.c b/src/um-user.c
index b6d0052..791922d 100644
--- a/src/um-user.c
+++ b/src/um-user.c
@@ -1036,3 +1036,41 @@ um_user_set_password (UmUser      *user,
         }
 }
 
+gboolean
+um_user_is_logged_in (UmUser *user)
+{
+        DBusGProxy *proxy;
+	GPtrArray *array;
+	GError *error;
+	gint n_sessions;
+
+        proxy = dbus_g_proxy_new_for_name (user->bus,
+					   "org.freedesktop.ConsoleKit",
+                                           "/org/freedesktop/ConsoleKit/Manager",
+                                           "org.freedesktop.ConsoleKit.Manager");
+
+	array = NULL;
+	error = NULL;
+        if (!dbus_g_proxy_call (proxy,
+                                "GetSessionsForUnixUser",
+                                &error,
+                                G_TYPE_UINT, um_user_get_uid (user),
+                                G_TYPE_INVALID,
+				dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &array,
+                                G_TYPE_INVALID)) {
+                g_warning ("GetSessionsForUnixUser failed: %s", error->message);
+		g_error_free (error);
+		return FALSE;
+	}
+
+	n_sessions = array->len;
+
+        g_ptr_array_foreach (array, (GFunc)g_free, NULL);
+	g_ptr_array_free (array, TRUE);
+
+	g_object_unref (proxy);
+
+	return n_sessions > 0;
+}
+
+
diff --git a/src/um-user.h b/src/um-user.h
index 6c8bbac..6465171 100644
--- a/src/um-user.h
+++ b/src/um-user.h
@@ -86,6 +86,7 @@ void           um_user_set_password        (UmUser      *user,
                                             int          password_mode,
                                             const gchar *plain,
                                             const gchar *password_hint);
+gboolean       um_user_is_logged_in        (UmUser   *user);
 
 GdkPixbuf     *um_user_render_icon         (UmUser   *user,
                                             gboolean  framed,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]