]> Pileus Git - ~andy/gtk/blob - modules/printbackends/file/gtkprintbackendfile.c
Use gtk-save icon for GtkPrintBackendFile
[~andy/gtk] / modules / printbackends / file / gtkprintbackendfile.c
1 /* GTK - The GIMP Toolkit
2  * gtkprintbackendfile.c: Default implementation of GtkPrintBackend 
3  * for printing to a file
4  * Copyright (C) 2003, Red Hat, Inc.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21
22 #include "config.h"
23
24 #include <unistd.h>
25 #include <sys/types.h>
26 #include <sys/stat.h>
27 #include <fcntl.h>
28 #include <stdlib.h>
29 #include <string.h>
30
31 #include <errno.h>
32 #include <cairo.h>
33 #include <cairo-pdf.h>
34 #include <cairo-ps.h>
35 #include <cairo-svg.h>
36
37 #include <glib/gi18n-lib.h>
38
39 #include "gtk/gtk.h"
40 #include "gtk/gtkprinter-private.h"
41
42 #include "gtkprintbackendfile.h"
43
44 typedef struct _GtkPrintBackendFileClass GtkPrintBackendFileClass;
45
46 #define GTK_PRINT_BACKEND_FILE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_PRINT_BACKEND_FILE, GtkPrintBackendFileClass))
47 #define GTK_IS_PRINT_BACKEND_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_PRINT_BACKEND_FILE))
48 #define GTK_PRINT_BACKEND_FILE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_PRINT_BACKEND_FILE, GtkPrintBackendFileClass))
49
50 #define _STREAM_MAX_CHUNK_SIZE 8192
51
52 static GType print_backend_file_type = 0;
53
54 struct _GtkPrintBackendFileClass
55 {
56   GtkPrintBackendClass parent_class;
57 };
58
59 struct _GtkPrintBackendFile
60 {
61   GtkPrintBackend parent_instance;
62 };
63
64 typedef enum
65 {
66   FORMAT_PDF,
67   FORMAT_PS,
68   FORMAT_SVG,
69   N_FORMATS
70 } OutputFormat;
71
72 static const gchar* formats[N_FORMATS] =
73 {
74   "pdf",
75   "ps",
76   "svg"
77 };
78
79 static GObjectClass *backend_parent_class;
80
81 static void                 gtk_print_backend_file_class_init      (GtkPrintBackendFileClass *class);
82 static void                 gtk_print_backend_file_init            (GtkPrintBackendFile      *impl);
83 static void                 file_printer_get_settings_from_options (GtkPrinter              *printer,
84                                                                     GtkPrinterOptionSet     *options,
85                                                                     GtkPrintSettings        *settings);
86 static GtkPrinterOptionSet *file_printer_get_options               (GtkPrinter              *printer,
87                                                                     GtkPrintSettings        *settings,
88                                                                     GtkPageSetup            *page_setup,
89                                                                     GtkPrintCapabilities     capabilities);
90 static void                 file_printer_prepare_for_print         (GtkPrinter              *printer,
91                                                                     GtkPrintJob             *print_job,
92                                                                     GtkPrintSettings        *settings,
93                                                                     GtkPageSetup            *page_setup);
94 static void                 gtk_print_backend_file_print_stream    (GtkPrintBackend         *print_backend,
95                                                                     GtkPrintJob             *job,
96                                                                     GIOChannel              *data_io,
97                                                                     GtkPrintJobCompleteFunc  callback,
98                                                                     gpointer                 user_data,
99                                                                     GDestroyNotify           dnotify);
100 static cairo_surface_t *    file_printer_create_cairo_surface      (GtkPrinter              *printer,
101                                                                     GtkPrintSettings        *settings,
102                                                                     gdouble                  width,
103                                                                     gdouble                  height,
104                                                                     GIOChannel              *cache_io);
105
106 static GList *              file_printer_list_papers               (GtkPrinter              *printer);
107 static GtkPageSetup *       file_printer_get_default_page_size     (GtkPrinter              *printer);
108
109 static void
110 gtk_print_backend_file_register_type (GTypeModule *module)
111 {
112   static const GTypeInfo print_backend_file_info =
113   {
114     sizeof (GtkPrintBackendFileClass),
115     NULL,               /* base_init */
116     NULL,               /* base_finalize */
117     (GClassInitFunc) gtk_print_backend_file_class_init,
118     NULL,               /* class_finalize */
119     NULL,               /* class_data */
120     sizeof (GtkPrintBackendFile),
121     0,          /* n_preallocs */
122     (GInstanceInitFunc) gtk_print_backend_file_init,
123   };
124
125   print_backend_file_type = g_type_module_register_type (module,
126                                                          GTK_TYPE_PRINT_BACKEND,
127                                                          "GtkPrintBackendFile",
128                                                          &print_backend_file_info, 0);
129 }
130
131 G_MODULE_EXPORT void 
132 pb_module_init (GTypeModule *module)
133 {
134   gtk_print_backend_file_register_type (module);
135 }
136
137 G_MODULE_EXPORT void 
138 pb_module_exit (void)
139 {
140
141 }
142   
143 G_MODULE_EXPORT GtkPrintBackend * 
144 pb_module_create (void)
145 {
146   return gtk_print_backend_file_new ();
147 }
148
149 /*
150  * GtkPrintBackendFile
151  */
152 GType
153 gtk_print_backend_file_get_type (void)
154 {
155   return print_backend_file_type;
156 }
157
158 /**
159  * gtk_print_backend_file_new:
160  *
161  * Creates a new #GtkPrintBackendFile object. #GtkPrintBackendFile
162  * implements the #GtkPrintBackend interface with direct access to
163  * the filesystem using Unix/Linux API calls
164  *
165  * Return value: the new #GtkPrintBackendFile object
166  **/
167 GtkPrintBackend *
168 gtk_print_backend_file_new (void)
169 {
170   return g_object_new (GTK_TYPE_PRINT_BACKEND_FILE, NULL);
171 }
172
173 static void
174 gtk_print_backend_file_class_init (GtkPrintBackendFileClass *class)
175 {
176   GtkPrintBackendClass *backend_class = GTK_PRINT_BACKEND_CLASS (class);
177
178   backend_parent_class = g_type_class_peek_parent (class);
179
180   backend_class->print_stream = gtk_print_backend_file_print_stream;
181   backend_class->printer_create_cairo_surface = file_printer_create_cairo_surface;
182   backend_class->printer_get_options = file_printer_get_options;
183   backend_class->printer_get_settings_from_options = file_printer_get_settings_from_options;
184   backend_class->printer_prepare_for_print = file_printer_prepare_for_print;
185   backend_class->printer_list_papers = file_printer_list_papers;
186   backend_class->printer_get_default_page_size = file_printer_get_default_page_size;
187 }
188
189 /* return N_FORMATS if no explicit format in the settings */
190 static OutputFormat
191 format_from_settings (GtkPrintSettings *settings)
192 {
193   const gchar *value;
194   gint i;
195
196   if (settings == NULL)
197     return N_FORMATS;
198
199   value = gtk_print_settings_get (settings,
200                                   GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT);
201   if (value == NULL)
202     return N_FORMATS;
203
204   for (i = 0; i < N_FORMATS; ++i)
205     if (strcmp (value, formats[i]) == 0)
206       break;
207
208   g_assert (i < N_FORMATS);
209
210   return (OutputFormat) i;
211 }
212
213 static gchar *
214 output_file_from_settings (GtkPrintSettings *settings,
215                            const gchar      *default_format)
216 {
217   gchar *uri = NULL;
218   
219   if (settings)
220     uri = g_strdup (gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_OUTPUT_URI));
221
222   if (uri == NULL)
223     { 
224       const gchar *extension;
225       gchar *name, *locale_name, *path;
226
227       if (default_format)
228         extension = default_format;
229       else
230         {
231           OutputFormat format;
232
233           format = format_from_settings (settings);
234           switch (format)
235             {
236               default:
237               case FORMAT_PDF:
238                 extension = "pdf";
239                 break;
240               case FORMAT_PS:
241                 extension = "ps";
242                 break;
243               case FORMAT_SVG:
244                 extension = "svg";
245                 break;
246             }
247         }
248  
249       /* default filename used for print-to-file */ 
250       name = g_strdup_printf (_("output.%s"), extension);
251       locale_name = g_filename_from_utf8 (name, -1, NULL, NULL, NULL);
252       g_free (name);
253
254       if (locale_name != NULL)
255         {
256           gchar *current_dir = g_get_current_dir ();
257           path = g_build_filename (current_dir, locale_name, NULL);
258           g_free (locale_name);
259
260           uri = g_filename_to_uri (path, NULL, NULL);
261           g_free (path);
262           g_free (current_dir);
263         }
264     }
265
266   return uri;
267 }
268
269 static cairo_status_t
270 _cairo_write (void                *closure,
271               const unsigned char *data,
272               unsigned int         length)
273 {
274   GIOChannel *io = (GIOChannel *)closure;
275   gsize written;
276   GError *error;
277
278   error = NULL;
279
280   GTK_NOTE (PRINTING,
281             g_print ("FILE Backend: Writting %i byte chunk to temp file\n", length));
282
283   while (length > 0) 
284     {
285       g_io_channel_write_chars (io, (const gchar *) data, length, &written, &error);
286
287       if (error != NULL)
288         {
289           GTK_NOTE (PRINTING,
290                      g_print ("FILE Backend: Error writting to temp file, %s\n", error->message));
291
292           g_error_free (error);
293           return CAIRO_STATUS_WRITE_ERROR;
294         }    
295
296       GTK_NOTE (PRINTING,
297                 g_print ("FILE Backend: Wrote %i bytes to temp file\n", written));
298       
299       data += written;
300       length -= written;
301     }
302
303   return CAIRO_STATUS_SUCCESS;
304 }
305
306
307 static cairo_surface_t *
308 file_printer_create_cairo_surface (GtkPrinter       *printer,
309                                    GtkPrintSettings *settings,
310                                    gdouble           width, 
311                                    gdouble           height,
312                                    GIOChannel       *cache_io)
313 {
314   cairo_surface_t *surface;
315   OutputFormat format;
316   const cairo_svg_version_t *versions;
317   int num_versions = 0;
318
319   format = format_from_settings (settings);
320
321   switch (format)
322     {
323       default:
324       case FORMAT_PDF:
325         surface = cairo_pdf_surface_create_for_stream (_cairo_write, cache_io, width, height);
326         break;
327       case FORMAT_PS:
328         surface = cairo_ps_surface_create_for_stream (_cairo_write, cache_io, width, height);
329         break;
330       case FORMAT_SVG:
331         surface = cairo_svg_surface_create_for_stream (_cairo_write, cache_io, width, height);
332         cairo_svg_get_versions (&versions, &num_versions);
333         if (num_versions > 0)
334           cairo_svg_surface_restrict_to_version (surface, versions[num_versions - 1]);
335         break;
336     }
337
338   if (gtk_print_settings_get_printer_lpi (settings) == 0.0)
339     gtk_print_settings_set_printer_lpi (settings, 150.0);
340
341   cairo_surface_set_fallback_resolution (surface,
342                                          2.0 * gtk_print_settings_get_printer_lpi (settings),
343                                          2.0 * gtk_print_settings_get_printer_lpi (settings));
344
345   return surface;
346 }
347
348 typedef struct {
349   GtkPrintBackend *backend;
350   GtkPrintJobCompleteFunc callback;
351   GtkPrintJob *job;
352   GFileOutputStream *target_io_stream;
353   gpointer user_data;
354   GDestroyNotify dnotify;
355 } _PrintStreamData;
356
357 static void
358 file_print_cb (GtkPrintBackendFile *print_backend,
359                GError              *error,
360                gpointer            user_data)
361 {
362   _PrintStreamData *ps = (_PrintStreamData *) user_data;
363
364   GDK_THREADS_ENTER ();
365
366   if (ps->target_io_stream != NULL)
367     g_output_stream_close (G_OUTPUT_STREAM (ps->target_io_stream), NULL, NULL);
368
369   if (ps->callback)
370     ps->callback (ps->job, ps->user_data, error);
371
372   if (ps->dnotify)
373     ps->dnotify (ps->user_data);
374
375   gtk_print_job_set_status (ps->job,
376                             (error != NULL)?GTK_PRINT_STATUS_FINISHED_ABORTED:GTK_PRINT_STATUS_FINISHED);
377
378   if (ps->job)
379     g_object_unref (ps->job);
380  
381   g_free (ps);
382
383   GDK_THREADS_LEAVE ();
384 }
385
386 static gboolean
387 file_write (GIOChannel   *source,
388             GIOCondition  con,
389             gpointer      user_data)
390 {
391   gchar buf[_STREAM_MAX_CHUNK_SIZE];
392   gsize bytes_read;
393   GError *error;
394   GIOStatus read_status;
395   _PrintStreamData *ps = (_PrintStreamData *) user_data;
396
397   error = NULL;
398
399   read_status = 
400     g_io_channel_read_chars (source,
401                              buf,
402                              _STREAM_MAX_CHUNK_SIZE,
403                              &bytes_read,
404                              &error);
405
406   if (read_status != G_IO_STATUS_ERROR)
407     {
408       gsize bytes_written;
409
410       g_output_stream_write_all (G_OUTPUT_STREAM (ps->target_io_stream),
411                                  buf,
412                                  bytes_read,
413                                  &bytes_written,
414                                  NULL,
415                                  &error);
416     }
417
418   if (error != NULL || read_status == G_IO_STATUS_EOF)
419     {
420       file_print_cb (GTK_PRINT_BACKEND_FILE (ps->backend), error, user_data);
421
422       if (error != NULL)
423         {
424           GTK_NOTE (PRINTING,
425                     g_print ("FILE Backend: %s\n", error->message));
426
427           g_error_free (error);
428         }
429
430       return FALSE;
431     }
432
433   GTK_NOTE (PRINTING,
434             g_print ("FILE Backend: Writting %i byte chunk to target file\n", bytes_read));
435
436   return TRUE;
437 }
438
439 static void
440 gtk_print_backend_file_print_stream (GtkPrintBackend        *print_backend,
441                                      GtkPrintJob            *job,
442                                      GIOChannel             *data_io,
443                                      GtkPrintJobCompleteFunc callback,
444                                      gpointer                user_data,
445                                      GDestroyNotify          dnotify)
446 {
447   GError *internal_error = NULL;
448   GtkPrinter *printer;
449   _PrintStreamData *ps;
450   GtkPrintSettings *settings;
451   gchar *uri;
452   GFile *file = NULL;
453
454   printer = gtk_print_job_get_printer (job);
455   settings = gtk_print_job_get_settings (job);
456
457   ps = g_new0 (_PrintStreamData, 1);
458   ps->callback = callback;
459   ps->user_data = user_data;
460   ps->dnotify = dnotify;
461   ps->job = g_object_ref (job);
462   ps->backend = print_backend;
463
464   internal_error = NULL;
465   uri = output_file_from_settings (settings, NULL);
466
467   if (uri == NULL)
468     goto error;
469
470   file = g_file_new_for_uri (uri);
471   ps->target_io_stream = g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &internal_error);
472
473   g_object_unref (file);
474   g_free (uri);
475
476 error:
477   if (internal_error != NULL)
478     {
479       file_print_cb (GTK_PRINT_BACKEND_FILE (print_backend),
480                     internal_error, ps);
481
482       g_error_free (internal_error);
483       return;
484     }
485
486   g_io_add_watch (data_io, 
487                   G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP,
488                   (GIOFunc) file_write,
489                   ps);
490 }
491
492 static void
493 gtk_print_backend_file_init (GtkPrintBackendFile *backend)
494 {
495   GtkPrinter *printer;
496   
497   printer = g_object_new (GTK_TYPE_PRINTER,
498                           "name", _("Print to File"),
499                           "backend", backend,
500                           "is-virtual", TRUE,
501                           NULL); 
502
503   gtk_printer_set_has_details (printer, TRUE);
504   gtk_printer_set_icon_name (printer, "gtk-save");
505   gtk_printer_set_is_active (printer, TRUE);
506
507   gtk_print_backend_add_printer (GTK_PRINT_BACKEND (backend), printer);
508   g_object_unref (printer);
509
510   gtk_print_backend_set_list_done (GTK_PRINT_BACKEND (backend));
511 }
512
513 static void
514 file_printer_output_file_format_changed (GtkPrinterOption    *format_option,
515                                          GtkPrinterOptionSet *set)
516 {
517   GtkPrinterOption *uri_option;
518   gchar            *base = NULL;
519
520   if (! format_option->value)
521     return;
522
523   uri_option = gtk_printer_option_set_lookup (set,
524                                               "gtk-main-page-custom-input");
525
526   if (uri_option && uri_option->value)
527     {
528       const gchar *uri = uri_option->value;
529       const gchar *dot = strrchr (uri, '.');
530
531       if (dot)
532         {
533           gint i;
534
535           /*  check if the file extension matches one of the known ones  */
536           for (i = 0; i < N_FORMATS; i++)
537             if (strcmp (dot + 1, formats[i]) == 0)
538               break;
539
540           if (i < N_FORMATS && strcmp (formats[i], format_option->value))
541             {
542               /*  the file extension is known but doesn't match the
543                *  selected one, strip it away
544                */
545               base = g_strndup (uri, dot - uri);
546             }
547         }
548       else
549         {
550           /*  there's no file extension  */
551           base = g_strdup (uri);
552         }
553     }
554
555   if (base)
556     {
557       gchar *tmp = g_strdup_printf ("%s.%s", base, format_option->value);
558
559       gtk_printer_option_set (uri_option, tmp);
560       g_free (tmp);
561       g_free (base);
562     }
563 }
564
565 static GtkPrinterOptionSet *
566 file_printer_get_options (GtkPrinter           *printer,
567                           GtkPrintSettings     *settings,
568                           GtkPageSetup         *page_setup,
569                           GtkPrintCapabilities  capabilities)
570 {
571   GtkPrinterOptionSet *set;
572   GtkPrinterOption *option;
573   const gchar *n_up[] = {"1", "2", "4", "6", "9", "16" };
574   const gchar *pages_per_sheet = NULL;
575   const gchar *format_names[N_FORMATS] = { N_("PDF"), N_("Postscript"), N_("SVG") };
576   const gchar *supported_formats[N_FORMATS];
577   gchar *display_format_names[N_FORMATS];
578   gint n_formats = 0;
579   OutputFormat format;
580   gchar *uri;
581   gint current_format = 0;
582
583   format = format_from_settings (settings);
584
585   set = gtk_printer_option_set_new ();
586
587   option = gtk_printer_option_new ("gtk-n-up", _("Pages per _sheet:"), GTK_PRINTER_OPTION_TYPE_PICKONE);
588   gtk_printer_option_choices_from_array (option, G_N_ELEMENTS (n_up),
589                                          (char **) n_up, (char **) n_up /* FIXME i18n (localised digits)! */);
590   if (settings)
591     pages_per_sheet = gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_NUMBER_UP);
592   if (pages_per_sheet)
593     gtk_printer_option_set (option, pages_per_sheet);
594   else
595     gtk_printer_option_set (option, "1");
596   gtk_printer_option_set_add (set, option);
597   g_object_unref (option);
598
599   if (capabilities & (GTK_PRINT_CAPABILITY_GENERATE_PDF | GTK_PRINT_CAPABILITY_GENERATE_PS))
600     {
601       if (capabilities & GTK_PRINT_CAPABILITY_GENERATE_PDF)
602         {
603           if (format == FORMAT_PDF || format == N_FORMATS)
604             {
605               format = FORMAT_PDF;
606               current_format = n_formats;
607             }
608           supported_formats[n_formats] = formats[FORMAT_PDF];
609           display_format_names[n_formats] = _(format_names[FORMAT_PDF]);
610           n_formats++;
611         }
612       if (capabilities & GTK_PRINT_CAPABILITY_GENERATE_PS)
613         {
614           if (format == FORMAT_PS || format == N_FORMATS)
615             current_format = n_formats;
616           supported_formats[n_formats] = formats[FORMAT_PS];
617           display_format_names[n_formats] = _(format_names[FORMAT_PS]);
618           n_formats++;
619         }
620     }
621   else
622     {
623       switch (format)
624         {
625           default:
626           case FORMAT_PDF:
627             current_format = FORMAT_PDF;
628             break;
629           case FORMAT_PS:
630             current_format = FORMAT_PS;
631             break;
632           case FORMAT_SVG:
633             current_format = FORMAT_SVG;            
634             break;
635         }
636
637       for (n_formats = 0; n_formats < N_FORMATS; ++n_formats)
638         {
639           supported_formats[n_formats] = formats[n_formats];
640           display_format_names[n_formats] = _(format_names[n_formats]);
641         }
642     }
643
644   uri = output_file_from_settings (settings, supported_formats[current_format]);
645
646   option = gtk_printer_option_new ("gtk-main-page-custom-input", _("File"), 
647                                    GTK_PRINTER_OPTION_TYPE_FILESAVE);
648   gtk_printer_option_set_activates_default (option, TRUE);
649   gtk_printer_option_set (option, uri);
650   g_free (uri);
651   option->group = g_strdup ("GtkPrintDialogExtension");
652   gtk_printer_option_set_add (set, option);
653
654   if (n_formats > 1)
655     {
656       option = gtk_printer_option_new ("output-file-format", _("_Output format"), 
657                                        GTK_PRINTER_OPTION_TYPE_ALTERNATIVE);
658       option->group = g_strdup ("GtkPrintDialogExtension");
659
660       gtk_printer_option_choices_from_array (option, n_formats,
661                                              (char **) supported_formats,
662                                              display_format_names);
663       gtk_printer_option_set (option, supported_formats[current_format]);
664       gtk_printer_option_set_add (set, option);
665
666       g_signal_connect (option, "changed",
667                         G_CALLBACK (file_printer_output_file_format_changed),
668                         set);
669
670       g_object_unref (option);
671     }
672
673   return set;
674 }
675
676 static void
677 file_printer_get_settings_from_options (GtkPrinter          *printer,
678                                         GtkPrinterOptionSet *options,
679                                         GtkPrintSettings    *settings)
680 {
681   GtkPrinterOption *option;
682
683   option = gtk_printer_option_set_lookup (options, "gtk-main-page-custom-input");
684   gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_OUTPUT_URI, option->value);
685
686   option = gtk_printer_option_set_lookup (options, "output-file-format");
687   if (option)
688     gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT, option->value);
689
690   option = gtk_printer_option_set_lookup (options, "gtk-n-up");
691   if (option)
692     gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_NUMBER_UP, option->value);
693
694   option = gtk_printer_option_set_lookup (options, "gtk-n-up-layout");
695   if (option)
696     gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_NUMBER_UP_LAYOUT, option->value);
697 }
698
699 static void
700 file_printer_prepare_for_print (GtkPrinter       *printer,
701                                 GtkPrintJob      *print_job,
702                                 GtkPrintSettings *settings,
703                                 GtkPageSetup     *page_setup)
704 {
705   gdouble scale;
706
707   print_job->print_pages = gtk_print_settings_get_print_pages (settings);
708   print_job->page_ranges = NULL;
709   print_job->num_page_ranges = 0;
710   
711   if (print_job->print_pages == GTK_PRINT_PAGES_RANGES)
712     print_job->page_ranges =
713       gtk_print_settings_get_page_ranges (settings,
714                                           &print_job->num_page_ranges);
715   
716   print_job->collate = gtk_print_settings_get_collate (settings);
717   print_job->reverse = gtk_print_settings_get_reverse (settings);
718   print_job->num_copies = gtk_print_settings_get_n_copies (settings);
719   print_job->number_up = gtk_print_settings_get_number_up (settings);
720   print_job->number_up_layout = gtk_print_settings_get_number_up_layout (settings);
721
722   scale = gtk_print_settings_get_scale (settings);
723   if (scale != 100.0)
724     print_job->scale = scale/100.0;
725
726   print_job->page_set = gtk_print_settings_get_page_set (settings);
727   print_job->rotate_to_orientation = TRUE;
728 }
729
730 static GList *
731 file_printer_list_papers (GtkPrinter *printer)
732 {
733   GList *result = NULL;
734   GList *papers, *p;
735   GtkPageSetup *page_setup;
736
737   papers = gtk_paper_size_get_paper_sizes (TRUE);
738
739   for (p = papers; p; p = p->next)
740     {
741       GtkPaperSize *paper_size = p->data;
742
743       page_setup = gtk_page_setup_new ();
744       gtk_page_setup_set_paper_size (page_setup, paper_size);
745       gtk_paper_size_free (paper_size);
746       result = g_list_prepend (result, page_setup);
747     }
748
749   g_list_free (papers);
750
751   return g_list_reverse (result);
752 }
753
754 static GtkPageSetup *
755 file_printer_get_default_page_size (GtkPrinter *printer)
756 {
757   GtkPageSetup *result = NULL;
758
759   return result;
760 }