[empathy: 13/24] account-settings: don't block notify::ready on getting a password



commit e52ae339c601c4173b011ad28bcdca816649fd4c
Author: Jonny Lamb <jonnylamb gnome org>
Date:   Fri Dec 10 12:02:17 2010 +0000

    account-settings: don't block notify::ready on getting a password
    
    The account widget acts a little more synchronously, so we can't wait
    for the keyring to give us the password. We can signal later about it
    though.
    
    Signed-off-by: Jonny Lamb <jonnylamb gnome org>

 libempathy-gtk/empathy-account-widget.c |   36 +++++++++++++++++++++++++++++++
 libempathy/empathy-account-settings.c   |   25 ++++++++++++++++-----
 2 files changed, 55 insertions(+), 6 deletions(-)
---
diff --git a/libempathy-gtk/empathy-account-widget.c b/libempathy-gtk/empathy-account-widget.c
index 27cb882..9cbddd3 100644
--- a/libempathy-gtk/empathy-account-widget.c
+++ b/libempathy-gtk/empathy-account-widget.c
@@ -109,6 +109,7 @@ typedef struct {
   GtkWidget *param_account_widget;
   GtkWidget *param_password_widget;
 
+  gboolean automatic_change;
   GtkWidget *remember_password_widget;
 
   /* Used only for IRC accounts */
@@ -313,6 +314,11 @@ static void
 account_widget_entry_changed_cb (GtkEditable *entry,
     EmpathyAccountWidget *self)
 {
+  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
+
+  if (priv->automatic_change)
+    return;
+
   account_widget_entry_changed_common (self, GTK_ENTRY (entry), FALSE);
   empathy_account_widget_changed (self);
 }
@@ -2016,6 +2022,30 @@ remember_password_toggled_cb (GtkToggleButton *button,
 }
 
 static void
+account_settings_password_retrieved_cb (GObject *object,
+    gpointer user_data)
+{
+  EmpathyAccountWidget *self = user_data;
+  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
+  const gchar *password = empathy_account_settings_get_string (
+      priv->settings, "password");
+
+  if (password != NULL)
+    {
+      /* We have to do this so that when we call gtk_entry_set_text,
+       * the ::changed callback doesn't think the user made the
+       * change. */
+      priv->automatic_change = TRUE;
+      gtk_entry_set_text (GTK_ENTRY (priv->param_password_widget), password);
+      priv->automatic_change = FALSE;
+    }
+
+  gtk_toggle_button_set_active (
+      GTK_TOGGLE_BUTTON (priv->remember_password_widget),
+      !EMP_STR_EMPTY (password));
+}
+
+static void
 do_constructed (GObject *obj)
 {
   EmpathyAccountWidget *self = EMPATHY_ACCOUNT_WIDGET (obj);
@@ -2115,6 +2145,12 @@ do_constructed (GObject *obj)
               GTK_TOGGLE_BUTTON (priv->remember_password_widget),
               !EMP_STR_EMPTY (empathy_account_settings_get_string (
                       priv->settings, "password")));
+
+          /* The password might not have been retrieved from the
+           * keyring yet. We should update the remember password
+           * toggle button and the password entry when/if it is. */
+          g_signal_connect (priv->settings, "password-retrieved",
+              G_CALLBACK (account_settings_password_retrieved_cb), self);
         }
 
       g_signal_connect (priv->remember_password_widget, "toggled",
diff --git a/libempathy/empathy-account-settings.c b/libempathy/empathy-account-settings.c
index e0a24b4..75538e2 100644
--- a/libempathy/empathy-account-settings.c
+++ b/libempathy/empathy-account-settings.c
@@ -50,6 +50,13 @@ enum {
   PROP_READY
 };
 
+enum {
+  PASSWORD_RETRIEVED = 1,
+  LAST_SIGNAL
+};
+
+static gulong signals[LAST_SIGNAL] = { 0, };
+
 /* private structure */
 typedef struct _EmpathyAccountSettingsPriv EmpathyAccountSettingsPriv;
 
@@ -319,6 +326,13 @@ empathy_account_settings_class_init (
       "Whether this account is ready to be used",
       FALSE,
       G_PARAM_STATIC_STRINGS | G_PARAM_READABLE));
+
+  signals[PASSWORD_RETRIEVED] =
+      g_signal_new ("password-retrieved",
+          G_TYPE_FROM_CLASS (empathy_account_settings_class),
+          G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+          g_cclosure_marshal_VOID__VOID,
+          G_TYPE_NONE, 0);
 }
 
 static void
@@ -452,9 +466,7 @@ empathy_account_settings_get_password_cb (GObject *source,
   priv->password = g_strdup (password);
   priv->password_original = g_strdup (password);
 
-  priv->password_retrieved = TRUE;
-
-  empathy_account_settings_check_readyness (self);
+  g_signal_emit (self, signals[PASSWORD_RETRIEVED], 0);
 }
 
 static void
@@ -546,14 +558,15 @@ empathy_account_settings_check_readyness (EmpathyAccountSettings *self)
 
   /* priv->account won't be a proper account if it's the account
    * assistant showing this widget. */
-  if (priv->supports_sasl && !priv->password_retrieved
-      && !priv->password_requested && priv->account != NULL)
+  if (priv->supports_sasl && !priv->password_requested
+      && priv->account != NULL)
     {
       priv->password_requested = TRUE;
 
+      /* Make this call but don't block on its readiness. We'll signal
+       * if it's updated later with ::password-retrieved. */
       empathy_keyring_get_password_async (priv->account,
           empathy_account_settings_get_password_cb, self);
-      return;
     }
 
   priv->ready = TRUE;



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