From 6fa6576dda8da067af30532f84e6391d08ea9b1d Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Sat, 24 Dec 2011 17:26:32 +0100 Subject: [PATCH] =?utf8?q?Set=20cups=20Custom=20print=20options=20correctl?= =?utf8?q?y=20(bug=20#543520,=20patch=20by=20Marek=20Ka=C5=A1=C3=ADk)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This patch fixes the cups print backend to pass Custom options with the "Custom." prefix to cups if neccessary. --- .../printbackends/cups/gtkprintbackendcups.c | 46 +++++++++++++++++-- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/modules/printbackends/cups/gtkprintbackendcups.c b/modules/printbackends/cups/gtkprintbackendcups.c index c5be26a35..e4cde709d 100644 --- a/modules/printbackends/cups/gtkprintbackendcups.c +++ b/modules/printbackends/cups/gtkprintbackendcups.c @@ -489,22 +489,44 @@ cups_print_cb (GtkPrintBackendCups *print_backend, GDK_THREADS_LEAVE (); } +typedef struct { + GtkCupsRequest *request; + GtkPrinterOptionSet *options; +} CupsOptionsData; + static void add_cups_options (const gchar *key, const gchar *value, gpointer user_data) { - GtkCupsRequest *request = user_data; + CupsOptionsData *data = (CupsOptionsData *) user_data; + GtkCupsRequest *request = data->request; + GtkPrinterOptionSet *options = data->options; + GtkPrinterOption *option = NULL; + gchar *new_value = NULL; if (!g_str_has_prefix (key, "cups-")) return; if (strcmp (value, "gtk-ignore-value") == 0) return; + + option = gtk_printer_option_set_lookup (options, key); key = key + strlen ("cups-"); - gtk_cups_request_encode_option (request, key, value); + /* Add "Custom." prefix to custom values */ + if (value && option && + !gtk_printer_option_has_choice (option, value)) + new_value = g_strdup_printf ("Custom.%s", value); + + if (new_value) + { + gtk_cups_request_encode_option (request, key, new_value); + g_free (new_value); + } + else + gtk_cups_request_encode_option (request, key, value); } static void @@ -517,8 +539,12 @@ gtk_print_backend_cups_print_stream (GtkPrintBackend *print_backend, { GtkPrinterCups *cups_printer; CupsPrintStreamData *ps; + CupsOptionsData *options_data; GtkCupsRequest *request; GtkPrintSettings *settings; + GtkPrinterOptionSet *options; + GtkPrintCapabilities capabilities; + GtkPageSetup *page_setup; const gchar *title; char printer_absolute_uri[HTTP_MAX_URI]; @@ -527,6 +553,8 @@ gtk_print_backend_cups_print_stream (GtkPrintBackend *print_backend, cups_printer = GTK_PRINTER_CUPS (gtk_print_job_get_printer (job)); settings = gtk_print_job_get_settings (job); + capabilities = cups_printer_get_capabilities (GTK_PRINTER (cups_printer)); + page_setup = gtk_printer_get_default_page_size (GTK_PRINTER (cups_printer)); request = gtk_cups_request_new_with_username (NULL, GTK_CUPS_POST, @@ -564,8 +592,18 @@ gtk_print_backend_cups_print_stream (GtkPrintBackend *print_backend, IPP_TAG_NAME, "job-name", NULL, title); - gtk_print_settings_foreach (settings, add_cups_options, request); - + options = cups_printer_get_options (GTK_PRINTER (cups_printer), settings, page_setup, capabilities); + + options_data = g_new0 (CupsOptionsData, 1); + options_data->request = request; + options_data->options = options; + + gtk_print_settings_foreach (settings, add_cups_options, options_data); + + g_object_unref (page_setup); + g_object_unref (options); + g_free (options_data); + ps = g_new0 (CupsPrintStreamData, 1); ps->callback = callback; ps->user_data = user_data; -- 2.43.2