]> Pileus Git - ~andy/gtk/blobdiff - modules/printbackends/cups/gtkprintbackendcups.c
Check whether a resolution has been set in GtkPrintSettings
[~andy/gtk] / modules / printbackends / cups / gtkprintbackendcups.c
index 67d2d47dec841aa0554fbe1acc930a2a6dbeeab8..2e1e1a9da82895fb1bfb8f25097dd0a8689ca227 100644 (file)
@@ -317,7 +317,7 @@ _cairo_write_to_cups (void                *closure,
        }    
 
       GTK_NOTE (PRINTING,
-                g_print ("CUPS Backend: Wrote %i bytes to temp file\n", written));
+                g_print ("CUPS Backend: Wrote %"G_GSIZE_FORMAT" bytes to temp file\n", written));
 
       data += written;
       length -= written;
@@ -333,18 +333,19 @@ cups_printer_create_cairo_surface (GtkPrinter       *printer,
                                   gdouble           height,
                                   GIOChannel       *cache_io)
 {
-  cairo_surface_t *surface; 
+  cairo_surface_t *surface;
   ppd_file_t      *ppd_file = NULL;
   ppd_attr_t      *ppd_attr = NULL;
   ppd_attr_t      *ppd_attr_res = NULL;
   ppd_attr_t      *ppd_attr_screen_freq = NULL;
   ppd_attr_t      *ppd_attr_res_screen_freq = NULL;
   gchar           *res_string = NULL;
-  int              level = 2;
-  /* TODO: check if it is a ps or pdf printer */
-  
-  surface = cairo_ps_surface_create_for_stream  (_cairo_write_to_cups, cache_io, width, height);
+  gint             level = 2;
+
+  if (gtk_printer_accepts_pdf (printer))
+    surface = cairo_pdf_surface_create_for_stream (_cairo_write_to_cups, cache_io, width, height);
+  else
+    surface = cairo_ps_surface_create_for_stream  (_cairo_write_to_cups, cache_io, width, height);
 
   ppd_file = gtk_printer_cups_get_ppd (GTK_PRINTER_CUPS (printer));
 
@@ -376,14 +377,14 @@ cups_printer_create_cairo_surface (GtkPrinter       *printer,
             }
         }
 
-      res_string = g_strdup_printf ("%ddpi", 
+      res_string = g_strdup_printf ("%ddpi",
                                     gtk_print_settings_get_resolution (settings));
       ppd_attr_res_screen_freq = ppdFindAttr (ppd_file, "ResScreenFreq", res_string);
       g_free (res_string);
 
       if (ppd_attr_res_screen_freq == NULL)
         {
-          res_string = g_strdup_printf ("%dx%ddpi", 
+          res_string = g_strdup_printf ("%dx%ddpi",
                                         gtk_print_settings_get_resolution_x (settings),
                                         gtk_print_settings_get_resolution_y (settings));
           ppd_attr_res_screen_freq = ppdFindAttr (ppd_file, "ResScreenFreq", res_string);
@@ -398,11 +399,14 @@ cups_printer_create_cairo_surface (GtkPrinter       *printer,
         gtk_print_settings_set_printer_lpi (settings, atof (ppd_attr_screen_freq->value));
     }
 
-  if (level == 2)
-    cairo_ps_surface_restrict_to_level (surface, CAIRO_PS_LEVEL_2);
+  if (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_PS)
+    {
+      if (level == 2)
+        cairo_ps_surface_restrict_to_level (surface, CAIRO_PS_LEVEL_2);
 
-  if (level == 3)
-    cairo_ps_surface_restrict_to_level (surface, CAIRO_PS_LEVEL_3);
+      if (level == 3)
+        cairo_ps_surface_restrict_to_level (surface, CAIRO_PS_LEVEL_3);
+    }
 
   cairo_surface_set_fallback_resolution (surface,
                                          2.0 * gtk_print_settings_get_printer_lpi (settings),
@@ -707,7 +711,6 @@ gtk_print_backend_cups_set_password (GtkPrintBackend  *backend,
   GtkPrintBackendCups *cups_backend = GTK_PRINT_BACKEND_CUPS (backend);
   GList *l;
   char   dispatch_hostname[HTTP_MAX_URI];
-  gchar *key;
   gchar *username = NULL;
   gchar *hostname = NULL;
   gchar *password = NULL;
@@ -729,15 +732,15 @@ gtk_print_backend_cups_set_password (GtkPrintBackend  *backend,
 
   if (hostname != NULL && username != NULL && password != NULL)
     {
-      key = g_strconcat (username, "@", hostname, NULL);
+      gchar *key = g_strconcat (username, "@", hostname, NULL);
       g_hash_table_insert (cups_backend->auth, key, g_strdup (password));
+      GTK_NOTE (PRINTING,
+                g_print ("CUPS backend: storing password for %s\n", key));
     }
 
   g_free (cups_backend->username);
   cups_backend->username = g_strdup (username);
 
-  GTK_NOTE (PRINTING,
-            g_print ("CUPS backend: storing password for %s\n", key));
 
   for (l = cups_backend->requests; l; l = l->next)
     {
@@ -846,9 +849,6 @@ request_password (gpointer data)
 
       switch (dispatch->request->ipp_request->request.op.operation_id)
         {
-          case 0:
-            prompt = g_strdup_printf ( _("Authentication is required to get a file from %s"), hostname);
-            break;
           case IPP_PRINT_JOB:
             if (job_title != NULL && printer_name != NULL)
               prompt = g_strdup_printf ( _("Authentication is required to print document '%s' on printer %s"), job_title, printer_name);
@@ -874,7 +874,11 @@ request_password (gpointer data)
             prompt = g_strdup_printf ( _("Authentication is required to get printers from %s"), hostname);
             break;
           default:
-            prompt = g_strdup_printf ( _("Authentication is required on %s"), hostname);
+            /* work around gcc warning about 0 not being a value for this enum */
+            if (dispatch->request->ipp_request->request.op.operation_id == 0)
+              prompt = g_strdup_printf ( _("Authentication is required to get a file from %s"), hostname);
+            else
+              prompt = g_strdup_printf ( _("Authentication is required on %s"), hostname);
             break;
         }
 
@@ -1683,7 +1687,7 @@ cups_request_printer_list_cb (GtkPrintBackendCups *cups_backend,
           N_("The door is open on printer '%s'."),
           N_("Printer '%s' is low on paper."),
           N_("Printer '%s' is out of paper."),
-          N_("Printer '%s' is currently off-line."),
+          N_("Printer '%s' is currently offline."),
           N_("There is a problem on printer '%s'.")
         };
       gboolean is_paused = FALSE;
@@ -2231,7 +2235,6 @@ cups_request_ppd_cb (GtkPrintBackendCups *print_backend,
                      GtkCupsResult       *result,
                      GetPPDData          *data)
 {
-  ipp_t *response;
   GtkPrinter *printer;
 
   GDK_THREADS_ENTER ();
@@ -2260,8 +2263,6 @@ cups_request_ppd_cb (GtkPrintBackendCups *print_backend,
       goto done;
     }
 
-  response = gtk_cups_result_get_response (result);
-
   /* let ppdOpenFd take over the ownership of the open file */
   g_io_channel_seek_position (data->ppd_io, 0, G_SEEK_SET, NULL);
   data->printer->ppd_file = ppdOpenFd (dup (g_io_channel_unix_get_fd (data->ppd_io)));
@@ -2342,7 +2343,7 @@ cups_request_ppd (GtkPrinter *printer)
 
 #ifdef G_ENABLE_DEBUG 
   /* If we are debugging printing don't delete the tmp files */
-  if (!(gtk_debug_flags & GTK_DEBUG_PRINTING))
+  if (!(gtk_get_debug_flags () & GTK_DEBUG_PRINTING))
     unlink (ppd_filename);
 #else
   unlink (ppd_filename);
@@ -2829,13 +2830,23 @@ static const struct {
 static const struct {
   const char *ppd_keyword;
   const char *name;
-} option_names[] = {
+} ppd_option_names[] = {
   {"Duplex", "gtk-duplex" },
   {"MediaType", "gtk-paper-type"},
   {"InputSlot", "gtk-paper-source"},
   {"OutputBin", "gtk-output-tray"},
 };
 
+static const struct {
+  const char *lpoption;
+  const char *name;
+} lpoption_names[] = {
+  {"number-up", "gtk-n-up" },
+  {"number-up-layout", "gtk-n-up-layout"},
+  {"job-billing", "gtk-billing-info"},
+  {"job-priority", "gtk-job-prio"},
+};
+
 /* keep sorted when changing */
 static const char *color_option_whitelist[] = {
   "BRColorEnhancement",
@@ -3351,17 +3362,33 @@ create_boolean_option (ppd_file_t   *ppd_file,
 }
 
 static gchar *
-get_option_name (const gchar *keyword)
+get_ppd_option_name (const gchar *keyword)
 {
   int i;
 
-  for (i = 0; i < G_N_ELEMENTS (option_names); i++)
-    if (strcmp (option_names[i].ppd_keyword, keyword) == 0)
-      return g_strdup (option_names[i].name);
+  for (i = 0; i < G_N_ELEMENTS (ppd_option_names); i++)
+    if (strcmp (ppd_option_names[i].ppd_keyword, keyword) == 0)
+      return g_strdup (ppd_option_names[i].name);
 
   return g_strdup_printf ("cups-%s", keyword);
 }
 
+static gchar *
+get_lpoption_name (const gchar *lpoption)
+{
+  int i;
+
+  for (i = 0; i < G_N_ELEMENTS (ppd_option_names); i++)
+    if (strcmp (ppd_option_names[i].ppd_keyword, lpoption) == 0)
+      return g_strdup (ppd_option_names[i].name);
+
+  for (i = 0; i < G_N_ELEMENTS (lpoption_names); i++)
+    if (strcmp (lpoption_names[i].lpoption, lpoption) == 0)
+      return g_strdup (lpoption_names[i].name);
+
+  return g_strdup_printf ("cups-%s", lpoption);
+}
+
 static int
 strptr_cmp (const void *a, 
            const void *b)
@@ -3396,7 +3423,7 @@ handle_option (GtkPrinterOptionSet *set,
   if (STRING_IN_TABLE (ppd_option->keyword, cups_option_blacklist))
     return;
 
-  name = get_option_name (ppd_option->keyword);
+  name = get_ppd_option_name (ppd_option->keyword);
 
   option = NULL;
   if (ppd_option->ui == PPD_UI_PICKONE)
@@ -3720,10 +3747,62 @@ cups_printer_get_options (GtkPrinter           *printer,
       if (STRING_IN_TABLE (opts[i].name, cups_option_blacklist))
         continue;
 
-      name = get_option_name (opts[i].name);
-      option = gtk_printer_option_set_lookup (set, name);
-      if (option)
-        gtk_printer_option_set (option, opts[i].value);
+      name = get_lpoption_name (opts[i].name);
+      if (strcmp (name, "cups-job-sheets") == 0)
+        {
+          gchar **values;
+          gint    num_values;
+          
+          values = g_strsplit (opts[i].value, ",", 2);
+          num_values = g_strv_length (values);
+
+          option = gtk_printer_option_set_lookup (set, "gtk-cover-before");
+          if (option && num_values > 0)
+            gtk_printer_option_set (option, g_strstrip (values[0]));
+
+          option = gtk_printer_option_set_lookup (set, "gtk-cover-after");
+          if (option && num_values > 1)
+            gtk_printer_option_set (option, g_strstrip (values[1]));
+
+          g_strfreev (values);
+        }
+      else if (strcmp (name, "cups-job-hold-until") == 0)
+        {
+          GtkPrinterOption *option2 = NULL;
+
+          option = gtk_printer_option_set_lookup (set, "gtk-print-time-text");
+          if (option && opts[i].value)
+            {
+              option2 = gtk_printer_option_set_lookup (set, "gtk-print-time");
+              if (option2)
+                {
+                  if (strcmp (opts[i].value, "indefinite") == 0)
+                    gtk_printer_option_set (option2, "on-hold");
+                  else
+                    {
+                      gtk_printer_option_set (option2, "at");
+                      gtk_printer_option_set (option, opts[i].value);
+                    }
+                }
+            }
+        }
+      else if (strcmp (name, "cups-sides") == 0)
+        {
+          option = gtk_printer_option_set_lookup (set, "gtk-duplex");
+          if (option && opts[i].value)
+            {
+              if (strcmp (opts[i].value, "two-sided-short-edge") == 0)
+                gtk_printer_option_set (option, "DuplexTumble");
+              else if (strcmp (opts[i].value, "two-sided-long-edge") == 0)
+                gtk_printer_option_set (option, "DuplexNoTumble");
+            }
+        }
+      else
+        {
+          option = gtk_printer_option_set_lookup (set, name);
+          if (option)
+            gtk_printer_option_set (option, opts[i].value);
+        }
       g_free (name);
     }
 
@@ -3739,7 +3818,7 @@ mark_option_from_set (GtkPrinterOptionSet *set,
                      ppd_option_t        *ppd_option)
 {
   GtkPrinterOption *option;
-  char *name = get_option_name (ppd_option->keyword);
+  char *name = get_ppd_option_name (ppd_option->keyword);
 
   option = gtk_printer_option_set_lookup (set, name);
 
@@ -3774,7 +3853,7 @@ set_conflicts_from_option (GtkPrinterOptionSet *set,
 
   if (ppd_option->conflicted)
     {
-      name = get_option_name (ppd_option->keyword);
+      name = get_ppd_option_name (ppd_option->keyword);
       option = gtk_printer_option_set_lookup (set, name);
 
       if (option)
@@ -4012,23 +4091,29 @@ set_option_from_settings (GtkPrinterOption *option,
        gtk_printer_option_set (option, cups_value);
       else
        {
-         int res = gtk_print_settings_get_resolution (settings);
-         int res_x = gtk_print_settings_get_resolution_x (settings);
-         int res_y = gtk_print_settings_get_resolution_y (settings);
+         if (gtk_print_settings_get_int_with_default (settings, GTK_PRINT_SETTINGS_RESOLUTION, -1) != -1 ||
+             gtk_print_settings_get_int_with_default (settings, GTK_PRINT_SETTINGS_RESOLUTION_X, -1) != -1 ||
+             gtk_print_settings_get_int_with_default (settings, GTK_PRINT_SETTINGS_RESOLUTION_Y, -1) != -1 ||
+             option->value == NULL || option->value[0] == '\0')
+           {
+              int res = gtk_print_settings_get_resolution (settings);
+              int res_x = gtk_print_settings_get_resolution_x (settings);
+              int res_y = gtk_print_settings_get_resolution_y (settings);
 
-          if (res_x != res_y)
-            {
-             value = g_strdup_printf ("%dx%ddpi", res_x, res_y);
-             gtk_printer_option_set (option, value);
-             g_free (value);
+              if (res_x != res_y)
+                {
+                  value = g_strdup_printf ("%dx%ddpi", res_x, res_y);
+                  gtk_printer_option_set (option, value);
+                  g_free (value);
+                }
+              else if (res != 0)
+                {
+                  value = g_strdup_printf ("%ddpi", res);
+                  gtk_printer_option_set (option, value);
+                  g_free (value);
+                }
             }
-          else if (res != 0)
-           {
-             value = g_strdup_printf ("%ddpi", res);
-             gtk_printer_option_set (option, value);
-             g_free (value);
-           }
-       }
+        }
     }
   else if (strcmp (option->name, "gtk-paper-type") == 0)
     map_settings_to_option (option, media_type_map, G_N_ELEMENTS (media_type_map),
@@ -4288,44 +4373,49 @@ cups_printer_prepare_for_print (GtkPrinter       *printer,
                                GtkPrintSettings *settings,
                                GtkPageSetup     *page_setup)
 {
+  GtkPrintPages pages;
+  GtkPageRange *ranges;
+  gint n_ranges;
   GtkPageSet page_set;
   GtkPaperSize *paper_size;
   const char *ppd_paper_name;
   double scale;
 
-  print_job->print_pages = gtk_print_settings_get_print_pages (settings);
-  print_job->page_ranges = NULL;
-  print_job->num_page_ranges = 0;
-  
-  if (print_job->print_pages == GTK_PRINT_PAGES_RANGES)
-    print_job->page_ranges =
-      gtk_print_settings_get_page_ranges (settings,
-                                         &print_job->num_page_ranges);
-  
+  pages = gtk_print_settings_get_print_pages (settings);
+  gtk_print_job_set_pages (print_job, pages);
+
+  if (pages == GTK_PRINT_PAGES_RANGES)
+    ranges = gtk_print_settings_get_page_ranges (settings, &n_ranges);
+  else
+    {
+      ranges = NULL;
+      n_ranges = 0;
+    }
+
+  gtk_print_job_set_page_ranges (print_job, ranges, n_ranges);
   if (gtk_print_settings_get_collate (settings))
     gtk_print_settings_set (settings, "cups-Collate", "True");
-  print_job->collate = FALSE;
+  gtk_print_job_set_collate (print_job, FALSE);
 
   if (gtk_print_settings_get_reverse (settings))
     gtk_print_settings_set (settings, "cups-OutputOrder", "Reverse");
-  print_job->reverse = FALSE;
+  gtk_print_job_set_reverse (print_job, FALSE);
 
   if (gtk_print_settings_get_n_copies (settings) > 1)
     gtk_print_settings_set_int (settings, "cups-copies",
-                               gtk_print_settings_get_n_copies (settings));
-  print_job->num_copies = 1;
+                                gtk_print_settings_get_n_copies (settings));
+  gtk_print_job_set_num_copies (print_job, 1);
 
   scale = gtk_print_settings_get_scale (settings);
-  print_job->scale = 1.0;
   if (scale != 100.0)
-    print_job->scale = scale/100.0;
+    gtk_print_job_set_scale (print_job, scale / 100.0);
 
   page_set = gtk_print_settings_get_page_set (settings);
   if (page_set == GTK_PAGE_SET_EVEN)
     gtk_print_settings_set (settings, "cups-page-set", "even");
   else if (page_set == GTK_PAGE_SET_ODD)
     gtk_print_settings_set (settings, "cups-page-set", "odd");
-  print_job->page_set = GTK_PAGE_SET_ALL;
+  gtk_print_job_set_page_set (print_job, GTK_PAGE_SET_ALL);
 
   paper_size = gtk_page_setup_get_paper_size (page_setup);
   ppd_paper_name = gtk_paper_size_get_ppd_name (paper_size);
@@ -4377,7 +4467,7 @@ cups_printer_prepare_for_print (GtkPrinter       *printer,
       g_type_class_unref (enum_class);
     }
 
-  print_job->rotate_to_orientation = TRUE;
+  gtk_print_job_set_rotate (print_job, TRUE);
 }
 
 static GtkPageSetup *