]> 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 1b83e32e61624a8e40482f742f1feadb391be2bc..2e1e1a9da82895fb1bfb8f25097dd0a8689ca227 100644 (file)
@@ -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),
@@ -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)));
@@ -4090,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),
@@ -4366,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);
@@ -4455,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 *