[gnome-control-center/gnome-3-14] printers: Don't show the same device multiple times



commit 2a3a7c355bc6cc25977b3300697930cdd524b9b7
Author: Marek Kasik <mkasik redhat com>
Date:   Mon May 25 14:57:04 2015 +0200

    printers: Don't show the same device multiple times
    
    Pass all discovered devices to 'GroupPhysicalDevices' instead of just
    the devices already present in the list and the newly discovered ones.
    Replace an existing device in the list if there is a better device
    (e.g. replace 'usb:' by 'hp:' device).
    
    https://bugzilla.gnome.org/show_bug.cgi?id=693186

 panels/printers/pp-new-printer-dialog.c |  146 ++++++++++---------------------
 panels/printers/pp-utils.c              |    4 +-
 2 files changed, 49 insertions(+), 101 deletions(-)
---
diff --git a/panels/printers/pp-new-printer-dialog.c b/panels/printers/pp-new-printer-dialog.c
index 01731a8..d609478 100644
--- a/panels/printers/pp-new-printer-dialog.c
+++ b/panels/printers/pp-new-printer-dialog.c
@@ -64,8 +64,7 @@ static void     new_printer_dialog_response_cb (GtkDialog *_dialog,
                                                 gpointer   user_data);
 static void     update_spinner_state (PpNewPrinterDialog *dialog);
 static void     add_devices_to_list (PpNewPrinterDialog  *dialog,
-                                     GList               *devices,
-                                     gboolean             new_device);
+                                     GList               *devices);
 static void     remove_device_from_list (PpNewPrinterDialog *dialog,
                                          const gchar        *device_name);
 
@@ -84,7 +83,7 @@ struct _PpNewPrinterDialogPrivate
   GtkBuilder *builder;
 
   GList *devices;
-  GList *new_devices;
+  GList *local_cups_devices;
 
   cups_dest_t *dests;
   gint         num_of_dests;
@@ -331,9 +330,7 @@ get_authenticated_samba_devices_cb (GObject      *source_object,
 
           if (result->devices != NULL)
             {
-              add_devices_to_list (dialog,
-                                   result->devices,
-                                   FALSE);
+              add_devices_to_list (dialog, result->devices);
 
               device = (PpPrintDevice *) result->devices->data;
               if (device != NULL)
@@ -511,8 +508,8 @@ pp_new_printer_dialog_finalize (GObject *object)
   g_list_free_full (priv->devices, (GDestroyNotify) pp_print_device_free);
   priv->devices = NULL;
 
-  g_list_free_full (priv->new_devices, (GDestroyNotify) pp_print_device_free);
-  priv->new_devices = NULL;
+  g_list_free_full (priv->local_cups_devices, (GDestroyNotify) pp_print_device_free);
+  priv->local_cups_devices = NULL;
 
   if (priv->num_of_dests > 0)
     {
@@ -599,9 +596,8 @@ remove_device_from_list (PpNewPrinterDialog *dialog,
 }
 
 static void
-add_device_to_list (PpNewPrinterDialog *dialog,
-                    PpPrintDevice      *device,
-                    gboolean            new_device)
+add_device_to_list (PpNewPrinterDialog  *dialog,
+                    PpPrintDevice       *device)
 {
   PpNewPrinterDialogPrivate *priv = dialog->priv;
   PpPrintDevice             *store_device;
@@ -629,7 +625,7 @@ add_device_to_list (PpNewPrinterDialog *dialog,
           store_device->show = TRUE;
 
           canonicalized_name = canonicalize_device_name (priv->devices,
-                                                         priv->new_devices,
+                                                         priv->local_cups_devices,
                                                          priv->dests,
                                                          priv->num_of_dests,
                                                          store_device);
@@ -639,13 +635,13 @@ add_device_to_list (PpNewPrinterDialog *dialog,
           g_free (store_device->device_name);
           store_device->device_name = canonicalized_name;
 
-          if (new_device)
-            priv->new_devices = g_list_append (priv->new_devices, store_device);
+          if (device->acquisition_method == ACQUISITION_METHOD_DEFAULT_CUPS_SERVER)
+            priv->local_cups_devices = g_list_append (priv->local_cups_devices, store_device);
           else
             priv->devices = g_list_append (priv->devices, store_device);
         }
       else if (device->is_authenticated_server &&
-              device->host_name != NULL)
+               device->host_name != NULL)
         {
           store_device = g_new0 (PpPrintDevice, 1);
           store_device->device_name = g_strdup (device->host_name);
@@ -660,14 +656,13 @@ add_device_to_list (PpNewPrinterDialog *dialog,
 
 static void
 add_devices_to_list (PpNewPrinterDialog  *dialog,
-                     GList               *devices,
-                     gboolean             new_device)
+                     GList               *devices)
 {
   GList *iter;
 
   for (iter = devices; iter; iter = iter->next)
     {
-      add_device_to_list (dialog, (PpPrintDevice *) iter->data, new_device);
+      add_device_to_list (dialog, (PpPrintDevice *) iter->data);
     }
 }
 
@@ -725,72 +720,59 @@ group_physical_devices_cb (gchar    ***device_uris,
 {
   PpNewPrinterDialog        *dialog = (PpNewPrinterDialog *) user_data;
   PpNewPrinterDialogPrivate *priv = dialog->priv;
-  PpPrintDevice             *device, *tmp;
+  PpPrintDevice             *device, *better_device;
+  GList                     *iter;
   gint                       i, j;
 
-  if (device_uris)
+  if (device_uris != NULL)
     {
-      for (i = 0; device_uris[i]; i++)
+      for (i = 0; device_uris[i] != NULL; i++)
         {
-          if (device_uris[i])
+          /* Is there any device in this sublist? */
+          if (device_uris[i][0] != NULL)
             {
-              for (j = 0; device_uris[i][j]; j++)
+              for (j = 0; device_uris[i][j] != NULL; j++)
                 {
                   device = device_in_list (device_uris[i][j], priv->devices);
-                  if (device)
+                  if (device != NULL)
                     break;
                 }
 
-              if (device)
+              /* Is this sublist represented in the current list of devices? */
+              if (device != NULL)
                 {
-                  for (j = 0; device_uris[i][j]; j++)
+                  /* Is there better device in the sublist? */
+                  if (j != 0)
                     {
-                      tmp = device_in_list (device_uris[i][j], priv->new_devices);
-                      if (tmp)
+                      better_device = device_in_list (device_uris[i][0], priv->local_cups_devices);
+                      iter = g_list_find (priv->devices, device);
+                      if (iter != NULL && better_device != NULL)
                         {
-                          priv->new_devices = g_list_remove (priv->new_devices, tmp);
-                          pp_print_device_free (tmp);
+                          iter->data = pp_print_device_copy (better_device);
+                          pp_print_device_free (device);
                         }
                     }
                 }
               else
                 {
-                  for (j = 0; device_uris[i][j]; j++)
+                  device = device_in_list (device_uris[i][0], priv->local_cups_devices);
+                  if (device != NULL)
                     {
-                      tmp = device_in_list (device_uris[i][j], priv->new_devices);
-                      if (tmp)
-                        {
-                          priv->new_devices = g_list_remove (priv->new_devices, tmp);
-                          if (j == 0)
-                            {
-                              priv->devices = g_list_append (priv->devices, tmp);
-                            }
-                          else
-                            {
-                              pp_print_device_free (tmp);
-                            }
-                        }
+                      priv->devices = g_list_append (priv->devices, pp_print_device_copy (device));
                     }
                 }
             }
         }
 
-      for (i = 0; device_uris[i]; i++)
-        {
-          for (j = 0; device_uris[i][j]; j++)
-            {
-              g_free (device_uris[i][j]);
-            }
-
-          g_free (device_uris[i]);
-        }
+      for (i = 0; device_uris[i] != NULL; i++)
+        g_strfreev (device_uris[i]);
 
       g_free (device_uris);
     }
   else
     {
-      priv->devices = g_list_concat (priv->devices, priv->new_devices);
-      priv->new_devices = NULL;
+      priv->devices = g_list_concat (priv->devices, priv->local_cups_devices);
+      priv->local_cups_devices = NULL;
     }
 
   actualize_devices_list (dialog);
@@ -907,11 +889,9 @@ get_cups_devices_cb (GList    *devices,
 
       if (devices)
         {
-          add_devices_to_list (dialog,
-                               devices,
-                               TRUE);
+          add_devices_to_list (dialog, devices);
 
-          length = g_list_length (priv->devices) + g_list_length (devices);
+          length = g_list_length (priv->devices) + g_list_length (priv->local_cups_devices);
           if (length > 0)
             {
               all_devices = g_new0 (PpPrintDevice *, length);
@@ -931,7 +911,7 @@ get_cups_devices_cb (GList    *devices,
                     }
                 }
 
-              for (iter = devices; iter != NULL; iter = iter->next)
+              for (iter = priv->local_cups_devices; iter != NULL; iter = iter->next)
                 {
                   pp_device = (PpPrintDevice *) iter->data;
                   if (pp_device != NULL)
@@ -1045,9 +1025,7 @@ get_snmp_devices_cb (GObject      *source_object,
 
       if (result->devices)
         {
-          add_devices_to_list (dialog,
-                               result->devices,
-                               FALSE);
+          add_devices_to_list (dialog, result->devices);
         }
 
       actualize_devices_list (dialog);
@@ -1100,9 +1078,7 @@ get_remote_cups_devices_cb (GObject      *source_object,
 
       if (result->devices)
         {
-          add_devices_to_list (dialog,
-                               result->devices,
-                               FALSE);
+          add_devices_to_list (dialog, result->devices);
         }
 
       actualize_devices_list (dialog);
@@ -1155,9 +1131,7 @@ get_samba_host_devices_cb (GObject      *source_object,
 
       if (result->devices)
         {
-          add_devices_to_list (dialog,
-                               result->devices,
-                               FALSE);
+          add_devices_to_list (dialog, result->devices);
         }
 
       actualize_devices_list (dialog);
@@ -1208,9 +1182,7 @@ get_samba_devices_cb (GObject      *source_object,
 
       if (result->devices)
         {
-          add_devices_to_list (dialog,
-                               result->devices,
-                               FALSE);
+          add_devices_to_list (dialog, result->devices);
         }
 
       actualize_devices_list (dialog);
@@ -1261,9 +1233,7 @@ get_jetdirect_devices_cb (GObject      *source_object,
 
       if (result->devices != NULL)
         {
-          add_devices_to_list (dialog,
-                               result->devices,
-                               FALSE);
+          add_devices_to_list (dialog, result->devices);
         }
 
       actualize_devices_list (dialog);
@@ -1315,9 +1285,7 @@ get_lpd_devices_cb (GObject      *source_object,
 
       if (result->devices != NULL)
         {
-          add_devices_to_list (dialog,
-                               result->devices,
-                               FALSE);
+          add_devices_to_list (dialog, result->devices);
         }
 
       actualize_devices_list (dialog);
@@ -1574,26 +1542,6 @@ search_address (const gchar        *text,
             iter = iter->next;
         }
 
-      iter = priv->new_devices;
-      while (iter)
-        {
-          device = iter->data;
-
-          if (device->acquisition_method == ACQUISITION_METHOD_REMOTE_CUPS_SERVER ||
-              device->acquisition_method == ACQUISITION_METHOD_SNMP ||
-              device->acquisition_method == ACQUISITION_METHOD_JETDIRECT ||
-              device->acquisition_method == ACQUISITION_METHOD_LPD ||
-              device->acquisition_method == ACQUISITION_METHOD_SAMBA_HOST)
-            {
-              tmp = iter;
-              iter = iter->next;
-              priv->new_devices = g_list_remove_link (priv->new_devices, tmp);
-              g_list_free_full (tmp, (GDestroyNotify) pp_print_device_free);
-            }
-          else
-            iter = iter->next;
-        }
-
       if (text && text[0] != '\0')
         {
           gchar *scheme = NULL;
@@ -2022,7 +1970,7 @@ ppd_selection_cb (GtkDialog *_dialog,
           priv->new_device->device_original_name = g_strdup (ppd_display_name);
 
           printer_name = canonicalize_device_name (priv->devices,
-                                                   priv->new_devices,
+                                                   priv->local_cups_devices,
                                                    priv->dests,
                                                    priv->num_of_dests,
                                                    priv->new_device);
diff --git a/panels/printers/pp-utils.c b/panels/printers/pp-utils.c
index bd8f5d3..2830fca 100644
--- a/panels/printers/pp-utils.c
+++ b/panels/printers/pp-utils.c
@@ -4159,7 +4159,7 @@ guess_device_hostname (PpPrintDevice *device)
 
 gchar *
 canonicalize_device_name (GList         *devices,
-                          GList         *new_devices,
+                          GList         *local_cups_devices,
                           cups_dest_t   *dests,
                           gint           num_of_dests,
                           PpPrintDevice *device)
@@ -4283,7 +4283,7 @@ canonicalize_device_name (GList         *devices,
             already_present = TRUE;
         }
 
-      for (iter = new_devices; iter; iter = iter->next)
+      for (iter = local_cups_devices; iter; iter = iter->next)
         {
           item = (PpPrintDevice *) iter->data;
           if (g_strcmp0 (item->device_original_name, new_name) == 0)


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