summaryrefslogtreecommitdiff
path: root/gtk/gtkprintbackend.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2019-12-22 14:43:48 -0500
committerMatthias Clasen <mclasen@redhat.com>2020-05-31 13:01:17 -0400
commita026677849b595ff3b3b0c12add476624c64a8ff (patch)
treee62b82a7627ea506500a64cf8cf15c5e0d0da4f5 /gtk/gtkprintbackend.c
parent1c389b1f246794495ee673ea67558771288342e2 (diff)
downloadgtk+-a026677849b595ff3b3b0c12add476624c64a8ff.tar.gz
printbackend: Use a list store
Diffstat (limited to 'gtk/gtkprintbackend.c')
-rw-r--r--gtk/gtkprintbackend.c103
1 files changed, 32 insertions, 71 deletions
diff --git a/gtk/gtkprintbackend.c b/gtk/gtkprintbackend.c
index 7e54470603..a6f44c08ca 100644
--- a/gtk/gtkprintbackend.c
+++ b/gtk/gtkprintbackend.c
@@ -41,7 +41,7 @@ static void gtk_print_backend_get_property (GObject *object,
struct _GtkPrintBackendPrivate
{
- GHashTable *printers;
+ GListStore *printers;
guint printer_list_requested : 1;
guint printer_list_done : 1;
GtkPrintBackendStatus status;
@@ -331,9 +331,7 @@ gtk_print_backend_init (GtkPrintBackend *backend)
priv = backend->priv = gtk_print_backend_get_instance_private (backend);
- priv->printers = g_hash_table_new_full (g_str_hash, g_str_equal,
- (GDestroyNotify) g_free,
- (GDestroyNotify) g_object_unref);
+ priv->printers = g_list_store_new (GTK_TYPE_PRINTER);
priv->auth_info_required = NULL;
priv->auth_info = NULL;
}
@@ -350,11 +348,7 @@ gtk_print_backend_dispose (GObject *object)
/* We unref the printers in dispose, not in finalize so that
* we can break refcount cycles with gtk_print_backend_destroy
*/
- if (priv->printers)
- {
- g_hash_table_destroy (priv->printers);
- priv->printers = NULL;
- }
+ g_clear_object (&priv->printers);
backend_parent_class->dispose (object);
}
@@ -411,58 +405,25 @@ fallback_printer_get_capabilities (GtkPrinter *printer)
return 0;
}
-
-static void
-printer_hash_to_sorted_active_list (const gchar *key,
- gpointer value,
- GList **out_list)
-{
- GtkPrinter *printer;
-
- printer = GTK_PRINTER (value);
-
- if (gtk_printer_get_name (printer) == NULL)
- return;
-
- if (!gtk_printer_is_active (printer))
- return;
-
- *out_list = g_list_insert_sorted (*out_list, value, (GCompareFunc) gtk_printer_compare);
-}
-
-
void
gtk_print_backend_add_printer (GtkPrintBackend *backend,
GtkPrinter *printer)
{
- GtkPrintBackendPrivate *priv;
-
g_return_if_fail (GTK_IS_PRINT_BACKEND (backend));
- priv = backend->priv;
-
- if (!priv->printers)
- return;
-
- g_hash_table_insert (priv->printers,
- g_strdup (gtk_printer_get_name (printer)),
- g_object_ref (printer));
+ g_list_store_append (backend->priv->printers, printer);
}
void
gtk_print_backend_remove_printer (GtkPrintBackend *backend,
GtkPrinter *printer)
{
- GtkPrintBackendPrivate *priv;
+ guint position;
g_return_if_fail (GTK_IS_PRINT_BACKEND (backend));
- priv = backend->priv;
- if (!priv->printers)
- return;
-
- g_hash_table_remove (priv->printers,
- gtk_printer_get_name (printer));
+ if (g_list_store_find (backend->priv->printers, printer, &position))
+ g_list_store_remove (backend->priv->printers, position);
}
void
@@ -488,54 +449,54 @@ gtk_print_backend_set_list_done (GtkPrintBackend *backend)
GList *
gtk_print_backend_get_printer_list (GtkPrintBackend *backend)
{
- GtkPrintBackendPrivate *priv;
- GList *result;
+ GList *result = NULL;
+ guint i;
g_return_val_if_fail (GTK_IS_PRINT_BACKEND (backend), NULL);
- priv = backend->priv;
-
- result = NULL;
- if (priv->printers != NULL)
- g_hash_table_foreach (priv->printers,
- (GHFunc) printer_hash_to_sorted_active_list,
- &result);
+ for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (backend->priv->printers)); i++)
+ {
+ GtkPrinter *printer = g_list_model_get_item (G_LIST_MODEL (backend->priv->printers), i);
+ result = g_list_prepend (result, printer);
+ g_object_unref (printer);
+ }
- if (!priv->printer_list_requested && priv->printers != NULL)
+ if (!backend->priv->printer_list_requested)
{
if (GTK_PRINT_BACKEND_GET_CLASS (backend)->request_printer_list)
GTK_PRINT_BACKEND_GET_CLASS (backend)->request_printer_list (backend);
- priv->printer_list_requested = TRUE;
+ backend->priv->printer_list_requested = TRUE;
}
return result;
}
gboolean
-gtk_print_backend_printer_list_is_done (GtkPrintBackend *print_backend)
+gtk_print_backend_printer_list_is_done (GtkPrintBackend *backend)
{
- g_return_val_if_fail (GTK_IS_PRINT_BACKEND (print_backend), TRUE);
+ g_return_val_if_fail (GTK_IS_PRINT_BACKEND (backend), TRUE);
- return print_backend->priv->printer_list_done;
+ return backend->priv->printer_list_done;
}
GtkPrinter *
gtk_print_backend_find_printer (GtkPrintBackend *backend,
const gchar *printer_name)
{
- GtkPrintBackendPrivate *priv;
- GtkPrinter *printer;
+ GtkPrinter *result = NULL;
+ guint i;
g_return_val_if_fail (GTK_IS_PRINT_BACKEND (backend), NULL);
- priv = backend->priv;
-
- if (priv->printers)
- printer = g_hash_table_lookup (priv->printers, printer_name);
- else
- printer = NULL;
+ for (i = 0; !result && i < g_list_model_get_n_items (G_LIST_MODEL (backend->priv->printers)); i++)
+ {
+ GtkPrinter *printer = g_list_model_get_item (G_LIST_MODEL (backend->priv->printers), i);
+ if (strcmp (gtk_printer_get_name (printer), printer_name) == 0)
+ result = printer;
+ g_object_unref (printer);
+ }
- return printer;
+ return result;
}
void
@@ -754,7 +715,7 @@ request_password (GtkPrintBackend *backend,
}
void
-gtk_print_backend_destroy (GtkPrintBackend *print_backend)
+gtk_print_backend_destroy (GtkPrintBackend *backend)
{
/* The lifecycle of print backends and printers are tied, such that
* the backend owns the printers, but the printers also ref the backend.
@@ -762,5 +723,5 @@ gtk_print_backend_destroy (GtkPrintBackend *print_backend)
* will be around. However, this results in a cycle, which we break
* with this call, which causes the print backend to release its printers.
*/
- g_object_run_dispose (G_OBJECT (print_backend));
+ g_object_run_dispose (G_OBJECT (backend));
}