]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-password-dialog.c
factor out start_gnome_contacts()
[empathy.git] / libempathy-gtk / empathy-password-dialog.c
index 2b1048c1c41b25f51a70edf88518fe4b7202a1af..339e0a146068bf4febea6a4bf97268ba19055fde 100644 (file)
@@ -28,7 +28,7 @@
 #include <libempathy/empathy-utils.h>
 
 G_DEFINE_TYPE (EmpathyPasswordDialog, empathy_password_dialog,
-    GTK_TYPE_MESSAGE_DIALOG)
+    EMPATHY_TYPE_BASE_PASSWORD_DIALOG)
 
 enum {
   PROP_HANDLER = 1,
@@ -36,17 +36,9 @@ enum {
   LAST_PROPERTY,
 };
 
-typedef struct {
+struct _EmpathyPasswordDialogPriv {
   EmpathyServerSASLHandler *handler;
-
-  GtkWidget *entry;
-  GtkWidget *ticky;
-  GtkWidget *ok_button;
-
-  gboolean grabbing;
-
-  gboolean dispose_run;
-} EmpathyPasswordDialogPriv;
+};
 
 static void
 empathy_password_dialog_get_property (GObject *object,
@@ -54,12 +46,12 @@ empathy_password_dialog_get_property (GObject *object,
     GValue *value,
     GParamSpec *pspec)
 {
-  EmpathyPasswordDialogPriv *priv = EMPATHY_PASSWORD_DIALOG (object)->priv;
+  EmpathyPasswordDialog *self = (EmpathyPasswordDialog *) object;
 
   switch (property_id)
     {
     case PROP_HANDLER:
-      g_value_set_object (value, priv->handler);
+      g_value_set_object (value, self->priv->handler);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -73,13 +65,13 @@ empathy_password_dialog_set_property (GObject *object,
     const GValue *value,
     GParamSpec *pspec)
 {
-  EmpathyPasswordDialogPriv *priv = EMPATHY_PASSWORD_DIALOG (object)->priv;
+  EmpathyPasswordDialog *self = (EmpathyPasswordDialog *) object;
 
   switch (property_id)
     {
     case PROP_HANDLER:
-      g_assert (priv->handler == NULL); /* construct only */
-      priv->handler = g_value_dup_object (value);
+      g_assert (self->priv->handler == NULL); /* construct only */
+      self->priv->handler = g_value_dup_object (value);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -90,14 +82,9 @@ empathy_password_dialog_set_property (GObject *object,
 static void
 empathy_password_dialog_dispose (GObject *object)
 {
-  EmpathyPasswordDialogPriv *priv = EMPATHY_PASSWORD_DIALOG (object)->priv;
+  EmpathyPasswordDialog *self = (EmpathyPasswordDialog *) object;
 
-  if (priv->dispose_run)
-    return;
-
-  priv->dispose_run = TRUE;
-
-  tp_clear_object (&priv->handler);
+  tp_clear_object (&self->priv->handler);
 
   G_OBJECT_CLASS (empathy_password_dialog_parent_class)->dispose (object);
 }
@@ -107,106 +94,23 @@ password_dialog_response_cb (GtkDialog *dialog,
     gint response,
     gpointer user_data)
 {
-  EmpathyPasswordDialogPriv *priv = EMPATHY_PASSWORD_DIALOG (user_data)->priv;
+  EmpathyPasswordDialog *self = (EmpathyPasswordDialog *) dialog;
+  EmpathyBasePasswordDialog *base = (EmpathyBasePasswordDialog *) dialog;
 
   if (response == GTK_RESPONSE_OK)
     {
-      empathy_server_sasl_handler_provide_password (priv->handler,
-          gtk_entry_get_text (GTK_ENTRY (priv->entry)),
-          gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->ticky)));
+      empathy_server_sasl_handler_provide_password (self->priv->handler,
+          gtk_entry_get_text (GTK_ENTRY (base->entry)),
+          gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (base->ticky)));
     }
   else
     {
-      empathy_server_sasl_handler_cancel (priv->handler);
+      empathy_server_sasl_handler_cancel (self->priv->handler);
     }
 
   gtk_widget_destroy (GTK_WIDGET (dialog));
 }
 
-static void
-clear_icon_released_cb (GtkEntry *entry,
-    GtkEntryIconPosition icon_pos,
-    GdkEvent *event,
-    gpointer user_data)
-{
-  gtk_entry_set_text (entry, "");
-}
-
-static void
-password_entry_changed_cb (GtkEditable *entry,
-    gpointer user_data)
-{
-  EmpathyPasswordDialogPriv *priv = EMPATHY_PASSWORD_DIALOG (user_data)->priv;
-  const gchar *str;
-
-  str = gtk_entry_get_text (GTK_ENTRY (entry));
-
-  gtk_entry_set_icon_sensitive (GTK_ENTRY (entry),
-      GTK_ENTRY_ICON_SECONDARY, !EMP_STR_EMPTY (str));
-
-  gtk_widget_set_sensitive (priv->ok_button,
-      !EMP_STR_EMPTY (str));
-}
-
-static gboolean
-password_dialog_grab_keyboard (GtkWidget *widget,
-    GdkEvent *event,
-    gpointer user_data)
-{
-  EmpathyPasswordDialogPriv *priv = EMPATHY_PASSWORD_DIALOG (user_data)->priv;
-
-  if (!priv->grabbing)
-    {
-      GdkGrabStatus status = gdk_keyboard_grab (gtk_widget_get_window (widget),
-          FALSE, gdk_event_get_time (event));
-
-      if (status != GDK_GRAB_SUCCESS)
-        DEBUG ("Could not grab keyboard; grab status was %u", status);
-      else
-        priv->grabbing = TRUE;
-    }
-
-  return FALSE;
-}
-
-static gboolean
-password_dialog_ungrab_keyboard (GtkWidget *widget,
-    GdkEvent *event,
-    gpointer user_data)
-{
-  EmpathyPasswordDialogPriv *priv = EMPATHY_PASSWORD_DIALOG (user_data)->priv;
-
-  if (priv->grabbing)
-    {
-      gdk_keyboard_ungrab (gdk_event_get_time (event));
-      priv->grabbing = FALSE;
-    }
-
-  return FALSE;
-}
-
-static gboolean
-password_dialog_window_state_changed (GtkWidget *widget,
-    GdkEventWindowState *event,
-    gpointer data)
-{
-  GdkWindowState state = gdk_window_get_state (gtk_widget_get_window (widget));
-
-  if (state & GDK_WINDOW_STATE_WITHDRAWN
-      || state & GDK_WINDOW_STATE_ICONIFIED
-      || state & GDK_WINDOW_STATE_FULLSCREEN
-      || state & GDK_WINDOW_STATE_MAXIMIZED)
-    {
-      password_dialog_ungrab_keyboard (widget, (GdkEvent *) event, data);
-    }
-  else
-    {
-      password_dialog_grab_keyboard (widget, (GdkEvent *) event, data);
-    }
-
-  return FALSE;
-}
-
 static void
 password_dialog_handler_invalidated_cb (EmpathyServerSASLHandler *handler,
     EmpathyPasswordDialog *dialog)
@@ -217,86 +121,28 @@ password_dialog_handler_invalidated_cb (EmpathyServerSASLHandler *handler,
 static void
 empathy_password_dialog_constructed (GObject *object)
 {
-  EmpathyPasswordDialog *dialog;
-  EmpathyPasswordDialogPriv *priv;
-  TpAccount *account;
-  GtkWidget *icon;
-  GtkBox *box;
+  EmpathyPasswordDialog *self = (EmpathyPasswordDialog *) object;
+  EmpathyBasePasswordDialog *base = (EmpathyBasePasswordDialog *) object;
   gchar *text;
 
-  dialog = EMPATHY_PASSWORD_DIALOG (object);
-  priv = dialog->priv;
+  G_OBJECT_CLASS (empathy_password_dialog_parent_class)->constructed (object);
 
-  g_assert (priv->handler != NULL);
-
-  priv->grabbing = FALSE;
-
-  account = empathy_server_sasl_handler_get_account (priv->handler);
-
-  tp_g_signal_connect_object (priv->handler, "invalidated",
+  tp_g_signal_connect_object (self->priv->handler, "invalidated",
       G_CALLBACK (password_dialog_handler_invalidated_cb),
       object, 0);
 
-  /* dialog */
-  gtk_dialog_add_button (GTK_DIALOG (dialog),
-      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
-
-  priv->ok_button = gtk_dialog_add_button (GTK_DIALOG (dialog),
-      GTK_STOCK_OK, GTK_RESPONSE_OK);
-  gtk_widget_set_sensitive (priv->ok_button, FALSE);
-
   text = g_strdup_printf (_("Enter your password for account\n<b>%s</b>"),
-      tp_account_get_display_name (account));
-  gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog), text);
+      tp_account_get_display_name (base->account));
+  gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (self), text);
   g_free (text);
 
-  gtk_window_set_icon_name (GTK_WINDOW (dialog),
-      GTK_STOCK_DIALOG_AUTHENTICATION);
-
-  box = GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog)));
-
-  /* dialog icon */
-  icon = gtk_image_new_from_icon_name (tp_account_get_icon_name (account),
-      GTK_ICON_SIZE_DIALOG);
-  gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (dialog), icon);
-  gtk_widget_show (icon);
-
-  /* entry */
-  priv->entry = gtk_entry_new ();
-  gtk_entry_set_visibility (GTK_ENTRY (priv->entry), FALSE);
-
-  /* entry clear icon */
-  gtk_entry_set_icon_from_stock (GTK_ENTRY (priv->entry),
-      GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_CLEAR);
-  gtk_entry_set_icon_sensitive (GTK_ENTRY (priv->entry),
-      GTK_ENTRY_ICON_SECONDARY, FALSE);
-
-  g_signal_connect (priv->entry, "icon-release",
-      G_CALLBACK (clear_icon_released_cb), NULL);
-  g_signal_connect (priv->entry, "changed",
-      G_CALLBACK (password_entry_changed_cb), dialog);
-
-  gtk_box_pack_start (box, priv->entry, FALSE, FALSE, 0);
-  gtk_widget_show (priv->entry);
-
-  /* remember password ticky box */
-  priv->ticky = gtk_check_button_new_with_label (_("Remember password"));
-
-  gtk_box_pack_start (box, priv->ticky, FALSE, FALSE, 0);
-  gtk_widget_show (priv->ticky);
-
-  g_signal_connect (dialog, "response",
-      G_CALLBACK (password_dialog_response_cb), dialog);
-  g_signal_connect (dialog, "window-state-event",
-      G_CALLBACK (password_dialog_window_state_changed), dialog);
-  g_signal_connect (dialog, "map-event",
-      G_CALLBACK (password_dialog_grab_keyboard), dialog);
-  g_signal_connect (dialog, "unmap-event",
-      G_CALLBACK (password_dialog_ungrab_keyboard), dialog);
-
-  gtk_widget_grab_focus (priv->entry);
+  /* only show it if we actually support it */
+  if (empathy_server_sasl_handler_can_save_response_somewhere (
+        self->priv->handler))
+    gtk_widget_show (base->ticky);
 
-  gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ALWAYS);
+  g_signal_connect (self, "response",
+      G_CALLBACK (password_dialog_response_cb), self);
 }
 
 static void
@@ -332,5 +178,7 @@ empathy_password_dialog_new (EmpathyServerSASLHandler *handler)
   g_assert (EMPATHY_IS_SERVER_SASL_HANDLER (handler));
 
   return g_object_new (EMPATHY_TYPE_PASSWORD_DIALOG,
-      "handler", handler, NULL);
+      "handler", handler,
+      "account", empathy_server_sasl_handler_get_account (handler),
+      NULL);
 }