[gnome-control-center] printers: Allow dismissing authentication in "Add New Printer" dialog



commit 6f3ed9087dbbdddbcb8067344186e6cef99c6fbb
Author: Felipe Borges <felipeborges gnome org>
Date:   Sat Nov 12 18:04:18 2016 +0100

    printers: Allow dismissing authentication in "Add New Printer" dialog
    
    Introduce a "go-back" button allowing to get back to the list of
    printers when the user is exposed to the authentication form in
    the "Add New Printer" dialog.
    
    This is a redesign based on the newest mockups available at
    https://wiki.gnome.org/Design/SystemSettings/Printers#Guidelines
    
    https://bugzilla.gnome.org/show_bug.cgi?id=760783

 panels/printers/new-printer-dialog.ui   |   37 +++++++++++++++++++---
 panels/printers/pp-new-printer-dialog.c |   29 ++++++++++++++++-
 panels/printers/pp-samba.c              |   50 +++++++++++++++++++++---------
 3 files changed, 94 insertions(+), 22 deletions(-)
---
diff --git a/panels/printers/new-printer-dialog.ui b/panels/printers/new-printer-dialog.ui
index 90bfbef..479d9c8 100644
--- a/panels/printers/new-printer-dialog.ui
+++ b/panels/printers/new-printer-dialog.ui
@@ -37,17 +37,44 @@
         <property name="visible">True</property>
         <property name="show-close-button">False</property>
         <child>
-          <object class="GtkButton" id="new-printer-cancel-button">
-            <property name="label" translatable="yes">_Cancel</property>
+          <object class="GtkStack" id="headerbar-topleft-buttons">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="use_underline">True</property>
+            <property name="valign">center</property>
+            <child>
+              <object class="GtkButton" id="new-printer-cancel-button">
+                <property name="label" translatable="yes">_Cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="name">addprinter-page</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="go-back-button">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="halign">start</property>
+                <child>
+                  <object class="GtkImage">
+                    <property name="visible">True</property>
+                    <property name="icon-name">go-previous-symbolic</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="name">authentication-page</property>
+              </packing>
+            </child>
           </object>
         </child>
         <child>
           <object class="GtkStack" id="headerbar-topright-buttons">
             <property name="visible">True</property>
+            <property name="valign">center</property>
             <child>
               <object class="GtkButton" id="new-printer-add-button">
                 <property name="label" translatable="yes">_Add</property>
diff --git a/panels/printers/pp-new-printer-dialog.c b/panels/printers/pp-new-printer-dialog.c
index fe48d1d..13c3c41 100644
--- a/panels/printers/pp-new-printer-dialog.c
+++ b/panels/printers/pp-new-printer-dialog.c
@@ -267,6 +267,8 @@ get_authenticated_samba_devices_cb (GObject      *source_object,
   GError                    *error = NULL;
   GList                     *iter;
 
+  g_object_ref (samba);
+
   result = pp_samba_get_devices_finish (samba, res, &error);
   g_object_unref (source_object);
 
@@ -291,8 +293,6 @@ get_authenticated_samba_devices_cb (GObject      *source_object,
 
       if (!cancelled)
         {
-          remove_device_from_list (dialog,
-                                   data->server_name);
 
           if (result->devices != NULL)
             {
@@ -344,6 +344,9 @@ go_to_page (PpNewPrinterDialog *dialog,
 
   stack = GTK_STACK (WID ("headerbar-topright-buttons"));
   gtk_stack_set_visible_child_name (stack, page);
+
+  stack = GTK_STACK (WID ("headerbar-topleft-buttons"));
+  gtk_stack_set_visible_child_name (stack, page);
 }
 
 static gchar *
@@ -361,6 +364,7 @@ on_authenticate (GtkWidget *button,
 {
   PpNewPrinterDialog        *dialog = PP_NEW_PRINTER_DIALOG (user_data);
   PpNewPrinterDialogPrivate *priv = dialog->priv;
+  gchar                     *hostname = NULL;
   gchar                     *username = NULL;
   gchar                     *password = NULL;
 
@@ -379,6 +383,9 @@ on_authenticate (GtkWidget *button,
 
   gtk_header_bar_set_title (GTK_HEADER_BAR (WID ("headerbar")), _("Add Printer"));
   go_to_page (dialog, ADDPRINTER_PAGE);
+
+  g_object_get (PP_HOST (priv->samba_host), "hostname", &hostname, NULL);
+  remove_device_from_list (dialog, hostname);
 }
 
 static void
@@ -436,6 +443,23 @@ auth_entries_changed (GtkEditable *editable,
 }
 
 static void
+on_go_back_button_clicked (GtkButton *button,
+                           gpointer   user_data)
+{
+  PpNewPrinterDialog        *dialog = PP_NEW_PRINTER_DIALOG (user_data);
+  PpNewPrinterDialogPrivate *priv = dialog->priv;
+
+  pp_samba_set_auth_info (priv->samba_host, NULL, NULL);
+  g_clear_object (&priv->samba_host);
+
+  go_to_page (dialog, ADDPRINTER_PAGE);
+  gtk_header_bar_set_title (GTK_HEADER_BAR (WID ("headerbar")), _("Add Printer"));
+  gtk_widget_set_sensitive (WID ("new-printer-add-button"), FALSE);
+
+  gtk_tree_selection_unselect_all (gtk_tree_view_get_selection (priv->treeview));
+}
+
+static void
 authenticate_samba_server (GtkButton *button,
                            gpointer   user_data)
 {
@@ -535,6 +559,7 @@ pp_new_printer_dialog_init (PpNewPrinterDialog *dialog)
   /* Authentication form widgets */
   g_signal_connect (WID ("username-entry"), "changed", G_CALLBACK (auth_entries_changed), dialog);
   g_signal_connect (WID ("password-entry"), "changed", G_CALLBACK (auth_entries_changed), dialog);
+  g_signal_connect (WID ("go-back-button"), "clicked", G_CALLBACK (on_go_back_button_clicked), dialog);
 
   /* Set junctions */
   widget = WID ("scrolledwindow1");
diff --git a/panels/printers/pp-samba.c b/panels/printers/pp-samba.c
index e2cb88c..04db2d8 100644
--- a/panels/printers/pp-samba.c
+++ b/panels/printers/pp-samba.c
@@ -88,7 +88,6 @@ typedef struct
   PpSamba       *samba;
   PpDevicesList *devices;
   GMainContext  *context;
-  gboolean       waiting;
   gboolean       auth_if_needed;
   gboolean       hostname_set;
   gboolean       cancelled;
@@ -111,8 +110,6 @@ get_auth_info (gpointer user_data)
   SMBData *data = (SMBData *) user_data;
   PpSamba *samba = PP_SAMBA (data->samba);
 
-  samba->priv->waiting = TRUE;
-
   g_signal_emit_by_name (samba, "authentication-required");
 
   return FALSE;
@@ -125,17 +122,17 @@ pp_samba_set_auth_info (PpSamba     *samba,
 {
   PpSambaPrivate *priv = samba->priv;
 
+  g_free (priv->username);
   if ((username != NULL) && (username[0] != '\0'))
-    {
-      g_free (priv->username);
-      priv->username = g_strdup (username);
-    }
+    priv->username = g_strdup (username);
+  else
+    priv->username = NULL;
 
+  g_free (priv->password);
   if ((password != NULL) && (password[0] != '\0'))
-    {
-      g_free (priv->password);
-      priv->password = g_strdup (password);
-    }
+    priv->password = g_strdup (password);
+  else
+    priv->password = NULL;
 
   priv->waiting = FALSE;
 }
@@ -174,6 +171,8 @@ auth_fn (SMBCCTX    *smb_context,
       g_source_attach (source, data->context);
       g_source_unref (source);
 
+      samba->priv->waiting = TRUE;
+
       /*
        * smbclient needs to get authentication data
        * from this synchronous callback so we are blocking
@@ -184,11 +183,32 @@ auth_fn (SMBCCTX    *smb_context,
           g_usleep (POLL_DELAY);
         }
 
-      if (g_strcmp0 (username, samba->priv->username) != 0)
-        g_strlcpy (username, samba->priv->username, unmaxlen);
+      /* Samba tries to call the auth_fn again if we just set the values
+       * to NULL when we want to cancel the authentication 
+       */
+      if (samba->priv->username == NULL && samba->priv->password == NULL)
+        data->cancelled = TRUE;
+
+      if (samba->priv->username != NULL)
+        {
+          if (g_strcmp0 (username, samba->priv->username) != 0)
+            g_strlcpy (username, samba->priv->username, unmaxlen);
+        }
+      else
+        {
+          username[0] = '\0';
+        }
+
+      if (samba->priv->password != NULL)
+        {
+          if (g_strcmp0 (password, samba->priv->password) != 0)
+            g_strlcpy (password, samba->priv->password, pwmaxlen);
+        }
+      else
+        {
+          password[0] = '\0';
+        }
 
-      if (g_strcmp0 (password, samba->priv->password) != 0)
-        g_strlcpy (password, samba->priv->password, pwmaxlen);
     }
 }
 


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