diff -up gtk+-2.18.0/gtk/gtkprintunixdialog.c.printing-nonblocking-printer-list gtk+-2.18.0/gtk/gtkprintunixdialog.c --- gtk+-2.18.0/gtk/gtkprintunixdialog.c.printing-nonblocking-printer-list 2009-09-11 22:58:38.000000000 -0400 +++ gtk+-2.18.0/gtk/gtkprintunixdialog.c 2009-09-23 01:28:27.595033076 -0400 @@ -596,7 +596,7 @@ gtk_print_unix_dialog_destroy (GtkPrintU } static void -disconnect_printer_details_request (GtkPrintUnixDialog *dialog) +disconnect_printer_details_request (GtkPrintUnixDialog *dialog, gboolean details_failed) { GtkPrintUnixDialogPrivate *priv = dialog->priv; @@ -606,12 +606,20 @@ disconnect_printer_details_request (GtkP priv->request_details_tag); priv->request_details_tag = 0; set_busy_cursor (dialog, FALSE); - gtk_list_store_set (GTK_LIST_STORE (priv->printer_list), - g_object_get_data (G_OBJECT (priv->request_details_printer), - "gtk-print-tree-iter"), - PRINTER_LIST_COL_STATE, - gtk_printer_get_state_message (priv->request_details_printer), - -1); + if (details_failed) + gtk_list_store_set (GTK_LIST_STORE (priv->printer_list), + g_object_get_data (G_OBJECT (priv->request_details_printer), + "gtk-print-tree-iter"), + PRINTER_LIST_COL_STATE, + _("Getting printer information failed"), + -1); + else + gtk_list_store_set (GTK_LIST_STORE (priv->printer_list), + g_object_get_data (G_OBJECT (priv->request_details_printer), + "gtk-print-tree-iter"), + PRINTER_LIST_COL_STATE, + gtk_printer_get_state_message (priv->request_details_printer), + -1); g_object_unref (priv->request_details_printer); priv->request_details_printer = NULL; } @@ -626,7 +634,7 @@ gtk_print_unix_dialog_finalize (GObject GList *node; unschedule_idle_mark_conflicts (dialog); - disconnect_printer_details_request (dialog); + disconnect_printer_details_request (dialog, FALSE); if (priv->current_printer) { @@ -1781,7 +1789,7 @@ printer_details_acquired (GtkPrinter { GtkPrintUnixDialogPrivate *priv = dialog->priv; - disconnect_printer_details_request (dialog); + disconnect_printer_details_request (dialog, !success); if (success) { @@ -1809,7 +1817,7 @@ selected_printer_changed (GtkTreeSelecti priv->waiting_for_printer = NULL; } - disconnect_printer_details_request (dialog); + disconnect_printer_details_request (dialog, FALSE); printer = NULL; if (gtk_tree_selection_get_selected (selection, NULL, &filter_iter)) diff -up gtk+-2.18.0/modules/printbackends/cups/gtkprintbackendcups.c.printing-nonblocking-printer-list gtk+-2.18.0/modules/printbackends/cups/gtkprintbackendcups.c --- gtk+-2.18.0/modules/printbackends/cups/gtkprintbackendcups.c.printing-nonblocking-printer-list 2009-09-23 01:28:27.557052405 -0400 +++ gtk+-2.18.0/modules/printbackends/cups/gtkprintbackendcups.c 2009-09-23 01:28:27.600060112 -0400 @@ -156,7 +156,7 @@ static GList * cups_printer static GtkPageSetup * cups_printer_get_default_page_size (GtkPrinter *printer); static void cups_printer_request_details (GtkPrinter *printer); static gboolean cups_request_default_printer (GtkPrintBackendCups *print_backend); -static void cups_request_ppd (GtkPrinter *printer); +static gboolean cups_request_ppd (GtkPrinter *printer); static void cups_printer_get_hard_margins (GtkPrinter *printer, double *top, double *bottom, @@ -1906,6 +1906,8 @@ cups_request_printer_list_cb (GtkPrintBa else g_object_ref (printer); + GTK_PRINTER_CUPS (printer)->remote = remote_printer; + gtk_printer_set_is_paused (printer, is_paused); gtk_printer_set_is_accepting_jobs (printer, is_accepting_jobs); @@ -2206,7 +2208,7 @@ done: GDK_THREADS_LEAVE (); } -static void +static gboolean cups_request_ppd (GtkPrinter *printer) { GError *error; @@ -2226,6 +2228,26 @@ cups_request_ppd (GtkPrinter *printer) GTK_NOTE (PRINTING, g_print ("CUPS Backend: %s\n", G_STRFUNC)); + if (cups_printer->remote) + { + GtkCupsConnectionState state; + + state = gtk_cups_connection_test_get_state (cups_printer->remote_cups_connection_test); + + if (state == GTK_CUPS_CONNECTION_IN_PROGRESS) + return TRUE; + + gtk_cups_connection_test_free (cups_printer->remote_cups_connection_test); + cups_printer->remote_cups_connection_test = NULL; + cups_printer->get_remote_ppd_poll = 0; + + if (state == GTK_CUPS_CONNECTION_NOT_AVAILABLE) + { + g_signal_emit_by_name (printer, "details-acquired", FALSE); + return FALSE; + } + } + http = httpConnectEncrypt (cups_printer->hostname, cups_printer->port, cupsEncryption ()); @@ -2255,7 +2277,7 @@ cups_request_ppd (GtkPrinter *printer) g_free (data); g_signal_emit_by_name (printer, "details-acquired", FALSE); - return; + return FALSE; } data->http = http; @@ -2293,6 +2315,8 @@ cups_request_ppd (GtkPrinter *printer) g_free (resource); g_free (ppd_filename); + + return FALSE; } /* Ordering matters for default preference */ @@ -2590,7 +2614,22 @@ cups_printer_request_details (GtkPrinter cups_printer = GTK_PRINTER_CUPS (printer); if (!cups_printer->reading_ppd && gtk_printer_cups_get_ppd (cups_printer) == NULL) - cups_request_ppd (printer); + { + if (cups_printer->remote) + { + if (cups_printer->get_remote_ppd_poll == 0) + { + cups_printer->remote_cups_connection_test = gtk_cups_connection_test_new (cups_printer->hostname); + + if (cups_request_ppd (printer)) + cups_printer->get_remote_ppd_poll = gdk_threads_add_timeout (200, + (GSourceFunc) cups_request_ppd, + printer); + } + } + else + cups_request_ppd (printer); + } } static char * diff -up gtk+-2.18.0/modules/printbackends/cups/gtkprintercups.c.printing-nonblocking-printer-list gtk+-2.18.0/modules/printbackends/cups/gtkprintercups.c --- gtk+-2.18.0/modules/printbackends/cups/gtkprintercups.c.printing-nonblocking-printer-list 2009-09-23 01:28:27.558041288 -0400 +++ gtk+-2.18.0/modules/printbackends/cups/gtkprintercups.c 2009-09-23 01:30:55.841053044 -0400 @@ -78,6 +78,9 @@ gtk_printer_cups_init (GtkPrinterCups *p printer->default_cover_before = NULL; printer->default_cover_after = NULL; printer->auth_info_required = NULL; + printer->remote = FALSE; + printer->get_remote_ppd_poll = 0; + printer->remote_cups_connection_test = NULL; } static void @@ -100,6 +103,11 @@ gtk_printer_cups_finalize (GObject *obje if (printer->ppd_file) ppdClose (printer->ppd_file); + if (printer->get_remote_ppd_poll > 0) + g_source_remove (printer->get_remote_ppd_poll); + + gtk_cups_connection_test_free (printer->remote_cups_connection_test); + G_OBJECT_CLASS (gtk_printer_cups_parent_class)->finalize (object); } diff -up gtk+-2.18.0/modules/printbackends/cups/gtkprintercups.h.printing-nonblocking-printer-list gtk+-2.18.0/modules/printbackends/cups/gtkprintercups.h --- gtk+-2.18.0/modules/printbackends/cups/gtkprintercups.h.printing-nonblocking-printer-list 2009-09-23 01:28:27.559041206 -0400 +++ gtk+-2.18.0/modules/printbackends/cups/gtkprintercups.h 2009-09-23 01:31:02.087036708 -0400 @@ -23,6 +23,7 @@ #include #include #include +#include "gtkcupsutils.h" #include @@ -56,6 +57,10 @@ struct _GtkPrinterCups gchar *default_cover_before; gchar *default_cover_after; + + gboolean remote; + guint get_remote_ppd_poll; + GtkCupsConnectionTest *remote_cups_connection_test; }; struct _GtkPrinterCupsClass