[gnome-control-center] user-accounts: Simplify generated password handling
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] user-accounts: Simplify generated password handling
- Date: Wed, 23 May 2012 12:32:08 +0000 (UTC)
commit a7beb087db07f2d7d13e52794be7f15f90e3e156
Author: Matthias Clasen <mclasen redhat com>
Date: Tue May 8 21:50:10 2012 -0400
user-accounts: Simplify generated password handling
Move the 'generate password' icon into the entry to make
the focus chain more straightforward. Also switch from
generating a choice of 6 passwords in a menu, just put
put the next choice directly into the entry.
To keep the password generation keyboard accessible,
add a 'Generate password' context menu item.
https://bugzilla.gnome.org/show_bug.cgi?id=633601
https://bugzilla.gnome.org/show_bug.cgi?id=658522
panels/user-accounts/data/password-dialog.ui | 21 +---
panels/user-accounts/um-password-dialog.c | 164 +++++++++-----------------
2 files changed, 56 insertions(+), 129 deletions(-)
---
diff --git a/panels/user-accounts/data/password-dialog.ui b/panels/user-accounts/data/password-dialog.ui
index b2f8e36..fc98708 100644
--- a/panels/user-accounts/data/password-dialog.ui
+++ b/panels/user-accounts/data/password-dialog.ui
@@ -206,30 +206,13 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="visibility">False</property>
+ <property name="secondary-icon-name">system-run-symbolic</property>
+ <property name="secondary-icon-tooltip-text" translatable="yes">Generate a password</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
- <child>
- <object class="GtkButton" id="generate-again-button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="tooltip_text" translatable="yes">Choose a generated password</property>
- <child>
- <object class="GtkImage" id="generate-again-image">
- <property name="visible">True</property>
- <property name="stock">gtk-execute</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
</object>
<packing>
<property name="position">0</property>
diff --git a/panels/user-accounts/um-password-dialog.c b/panels/user-accounts/um-password-dialog.c
index d6aec6d..9a162fe 100644
--- a/panels/user-accounts/um-password-dialog.c
+++ b/panels/user-accounts/um-password-dialog.c
@@ -50,8 +50,6 @@ struct _UmPasswordDialog {
GtkWidget *strength_indicator_label;
GtkWidget *normal_hint_entry;
GtkWidget *normal_hint_label;
- GtkWidget *generate_button;
- GtkWidget *generate_menu;
GtkWidget *show_password_button;
GtkWidget *ok_button;
@@ -62,88 +60,35 @@ struct _UmPasswordDialog {
gboolean old_password_ok;
PasswdHandler *passwd_handler;
-};
-
-static void
-generate_clicked (GtkButton *button,
- UmPasswordDialog *um)
-{
- gtk_menu_popup (GTK_MENU (um->generate_menu),
- NULL, NULL,
- (GtkMenuPositionFunc) popup_menu_below_button, um->generate_button,
- 0, gtk_get_current_event_time ());
-
- gtk_widget_set_has_tooltip (um->generate_button, FALSE);
-}
-
-static void
-generate_draw (GtkWidget *widget,
- cairo_t *cr,
- UmPasswordDialog *um)
-{
- if (!gtk_widget_is_sensitive (widget))
- return;
-
- down_arrow (gtk_widget_get_style_context (widget),
- cr,
- gtk_widget_get_allocated_width (widget) - 12,
- gtk_widget_get_allocated_height (widget) - 12,
- 12, 12);
-}
-static void
-activate_password_item (GtkMenuItem *item,
- UmPasswordDialog *um)
-{
- const char *password;
-
- password = gtk_menu_item_get_label (item);
-
- gtk_entry_set_text (GTK_ENTRY (um->password_entry), password);
- gtk_entry_set_text (GTK_ENTRY (um->verify_entry), "");
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (um->show_password_button), TRUE);
- gtk_widget_grab_focus (um->verify_entry);
-}
-
-static void generate_passwords (UmPasswordDialog *um);
-
-static void
-activate_generate_item (GtkMenuItem *item,
- UmPasswordDialog *um)
-{
- generate_passwords (um);
- generate_clicked (GTK_BUTTON (um->generate_button), um);
-}
-
-static void
-on_generate_menu_unmap (GtkWidget *menu,
- UmPasswordDialog *um)
-{
- gtk_widget_set_has_tooltip (um->generate_button, TRUE);
-}
+ gchar **generated;
+ gint next_generated;
+};
static void
-generate_passwords (UmPasswordDialog *um)
+generate_one_password (GtkWidget *widget,
+ UmPasswordDialog *um)
{
gint min_len, max_len;
- gchar *output, *err, *cmdline;
+ gchar *output, *err, *cmdline, *p;
gint status;
GError *error;
- gint i;
- GtkWidget *item;
-
- min_len = 6;
- max_len = 12;
- if (um->generate_menu) {
- gtk_widget_destroy (um->generate_menu);
+ if (um->generated && um->generated[um->next_generated]) {
+ gtk_entry_set_text (GTK_ENTRY (um->password_entry), um->generated[um->next_generated]);
+ gtk_entry_set_text (GTK_ENTRY (um->verify_entry), "");
+ um->next_generated++;
+ return;
}
- um->generate_menu = gtk_menu_new ();
- g_signal_connect (um->generate_menu, "unmap",
- G_CALLBACK (on_generate_menu_unmap), um);
+ g_strfreev (um->generated);
+ um->generated = NULL;
+ um->next_generated = 0;
- cmdline = g_strdup_printf ("apg -n 6 -M SNC -m %d -x %d", min_len, max_len);
+ min_len = 6;
+ max_len = 12;
+
+ cmdline = g_strdup_printf ("apg -n 10 -M SNC -m %d -x %d", min_len, max_len);
error = NULL;
output = NULL;
err = NULL;
@@ -151,19 +96,16 @@ generate_passwords (UmPasswordDialog *um)
g_warning ("Failed to run apg: %s", error->message);
g_error_free (error);
} else if (WEXITSTATUS (status) == 0) {
- char **lines;
- lines = g_strsplit (output, "\n", 0);
- for (i = 0; lines[i]; i++) {
- if (lines[i][0] == 0)
- continue;
-
- item = gtk_menu_item_new_with_label (lines[i]);
- g_signal_connect (item, "activate",
- G_CALLBACK (activate_password_item), um);
- gtk_widget_show (item);
- gtk_menu_shell_append (GTK_MENU_SHELL (um->generate_menu), item);
- }
- g_strfreev (lines);
+ p = output;
+ if (*p == '\n')
+ p++;
+ if (p[strlen(p) - 1] == '\n')
+ p[strlen(p) - 1] = '\0';
+ um->generated = g_strsplit (p, "\n", -1);
+
+ gtk_entry_set_text (GTK_ENTRY (um->password_entry), um->generated[0]);
+ gtk_entry_set_text (GTK_ENTRY (um->verify_entry), "");
+ um->next_generated = 1;
} else {
g_warning ("agp returned an error: %s", err);
}
@@ -171,16 +113,29 @@ generate_passwords (UmPasswordDialog *um)
g_free (cmdline);
g_free (output);
g_free (err);
+}
- item = gtk_separator_menu_item_new ();
- gtk_widget_show (item);
- gtk_menu_shell_append (GTK_MENU_SHELL (um->generate_menu), item);
+static void
+activate_icon (GtkEntry *entry,
+ GtkEntryIconPosition pos,
+ GdkEventButton *event,
+ UmPasswordDialog *um)
+{
+ generate_one_password (GTK_WIDGET (entry), um);
+}
- item = gtk_menu_item_new_with_label (_("More choices..."));
+static void
+populate_menu (GtkEntry *entry,
+ GtkMenu *menu,
+ UmPasswordDialog *um)
+{
+ GtkWidget *item;
+
+ item = gtk_menu_item_new_with_mnemonic (_("_Generate a password"));
g_signal_connect (item, "activate",
- G_CALLBACK (activate_generate_item), um);
+ G_CALLBACK (generate_one_password), um);
gtk_widget_show (item);
- gtk_menu_shell_append (GTK_MENU_SHELL (um->generate_menu), item);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
}
/* This code is based on the Master Password dialog in Firefox
@@ -411,8 +366,7 @@ action_changed (GtkComboBox *combo,
active = gtk_combo_box_get_active (combo);
if (active == 0) {
gtk_widget_set_sensitive (um->password_entry, TRUE);
- gtk_widget_set_sensitive (um->generate_button, TRUE);
- gtk_widget_set_has_tooltip (um->generate_button, TRUE);
+ gtk_entry_set_icon_sensitive (GTK_ENTRY (um->password_entry), GTK_ENTRY_ICON_SECONDARY, TRUE);
gtk_widget_set_sensitive (um->verify_entry, TRUE);
gtk_widget_set_sensitive (um->old_password_entry, TRUE);
gtk_widget_set_sensitive (um->normal_hint_entry, TRUE);
@@ -424,8 +378,7 @@ action_changed (GtkComboBox *combo,
}
else {
gtk_widget_set_sensitive (um->password_entry, FALSE);
- gtk_widget_set_sensitive (um->generate_button, FALSE);
- gtk_widget_set_has_tooltip (um->generate_button, FALSE);
+ gtk_entry_set_icon_sensitive (GTK_ENTRY (um->password_entry), GTK_ENTRY_ICON_SECONDARY, FALSE);
gtk_widget_set_sensitive (um->verify_entry, FALSE);
gtk_widget_set_sensitive (um->old_password_entry, FALSE);
gtk_widget_set_sensitive (um->normal_hint_entry, FALSE);
@@ -670,6 +623,11 @@ um_password_dialog_new (void)
G_CALLBACK (password_entry_changed), um);
gtk_entry_set_visibility (GTK_ENTRY (widget), FALSE);
+ g_signal_connect (widget, "icon-press",
+ G_CALLBACK (activate_icon), um);
+ g_signal_connect (widget, "populate-popup",
+ G_CALLBACK (populate_menu), um);
+
um->password_entry = widget;
widget = (GtkWidget *) gtk_builder_get_object (builder, "old-password-entry");
@@ -700,18 +658,6 @@ um_password_dialog_new (void)
widget = (GtkWidget *) gtk_builder_get_object (builder, "strength-indicator-label");
gtk_label_set_width_chars (GTK_LABEL (widget), len);
-
- widget = (GtkWidget *) gtk_builder_get_object (builder, "generate-again-button");
- g_signal_connect (widget, "clicked",
- G_CALLBACK (generate_clicked), um);
-#if 0
- g_signal_connect (widget, "state-changed",
- G_CALLBACK (generate_state_changed), um);
-#endif
- um->generate_button = widget;
- g_signal_connect_after (widget, "draw",
- G_CALLBACK (generate_draw), um);
-
um->normal_hint_entry = (GtkWidget *) gtk_builder_get_object (builder, "normal-hint-entry");
/* Label size hack.
@@ -728,8 +674,6 @@ um_password_dialog_new (void)
g_object_unref (builder);
- generate_passwords (um);
-
return um;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]