2 * Copyright (C) 2006 John (J5) Palmieri <johnp@redhat.com>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
29 #include <sys/types.h>
32 #include <glib/gstdio.h>
34 #include "gtkprivate.h"
36 #include "gtkprintjob.h"
37 #include "gtkprinter.h"
38 #include "gtkprintbackend.h"
45 struct _GtkPrintJobPrivate
50 cairo_surface_t *surface;
52 GtkPrintStatus status;
53 GtkPrintBackend *backend;
55 GtkPrintSettings *settings;
56 GtkPageSetup *page_setup;
59 gint page_setup_set : 1;
60 gint settings_set : 1;
64 #define GTK_PRINT_JOB_GET_PRIVATE(o) \
65 (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_PRINT_JOB, GtkPrintJobPrivate))
67 static void gtk_print_job_finalize (GObject *object);
68 static void gtk_print_job_set_property (GObject *object,
72 static void gtk_print_job_get_property (GObject *object,
76 static GObject* gtk_print_job_constructor (GType type,
77 guint n_construct_properties,
78 GObjectConstructParam *construct_params);
87 GTK_PRINT_JOB_PROP_TITLE,
88 GTK_PRINT_JOB_PROP_PRINTER,
89 GTK_PRINT_JOB_PROP_PAGE_SETUP,
90 GTK_PRINT_JOB_PROP_SETTINGS
93 static guint signals[LAST_SIGNAL] = { 0 };
95 G_DEFINE_TYPE (GtkPrintJob, gtk_print_job, G_TYPE_OBJECT);
98 gtk_print_job_class_init (GtkPrintJobClass *class)
100 GObjectClass *object_class;
101 object_class = (GObjectClass *) class;
103 object_class->finalize = gtk_print_job_finalize;
104 object_class->constructor = gtk_print_job_constructor;
105 object_class->set_property = gtk_print_job_set_property;
106 object_class->get_property = gtk_print_job_get_property;
108 g_type_class_add_private (class, sizeof (GtkPrintJobPrivate));
110 g_object_class_install_property (G_OBJECT_CLASS (class),
111 GTK_PRINT_JOB_PROP_TITLE,
112 g_param_spec_string ("title",
114 P_("Title of the print job"),
116 GTK_PARAM_READWRITE |
117 G_PARAM_CONSTRUCT_ONLY));
119 g_object_class_install_property (G_OBJECT_CLASS (class),
120 GTK_PRINT_JOB_PROP_PRINTER,
121 g_param_spec_object ("printer",
123 P_("Printer to print the job to"),
125 GTK_PARAM_READWRITE |
126 G_PARAM_CONSTRUCT_ONLY));
128 g_object_class_install_property (G_OBJECT_CLASS (class),
129 GTK_PRINT_JOB_PROP_SETTINGS,
130 g_param_spec_object ("settings",
132 P_("Printer settings"),
133 GTK_TYPE_PRINT_SETTINGS,
134 GTK_PARAM_READWRITE |
135 G_PARAM_CONSTRUCT_ONLY));
137 g_object_class_install_property (G_OBJECT_CLASS (class),
138 GTK_PRINT_JOB_PROP_PAGE_SETUP,
139 g_param_spec_object ("page-setup",
143 GTK_PARAM_READWRITE |
144 G_PARAM_CONSTRUCT_ONLY));
147 * GtkPrintJob::status-changed:
148 * @job: the #GtkPrintJob object on which the signal was emitted
150 * Gets emitted when the status of a job changes. The signal handler
151 * can use gtk_print_job_get_status() to obtain the new status.
155 signals[STATUS_CHANGED] =
156 g_signal_new ("status-changed",
157 G_TYPE_FROM_CLASS (class),
159 G_STRUCT_OFFSET (GtkPrintJobClass, status_changed),
161 g_cclosure_marshal_VOID__VOID,
166 gtk_print_job_init (GtkPrintJob *job)
168 job->priv = GTK_PRINT_JOB_GET_PRIVATE (job);
169 job->priv->spool_file_fd = -1;
171 job->priv->title = g_strdup ("");
172 job->priv->surface = NULL;
173 job->priv->backend = NULL;
174 job->priv->printer = NULL;
176 job->priv->printer_set = FALSE;
177 job->priv->settings_set = FALSE;
178 job->priv->page_setup_set = FALSE;
179 job->priv->status = GTK_PRINT_STATUS_INITIAL;
181 job->print_pages = GTK_PRINT_PAGES_ALL;
182 job->page_ranges = NULL;
183 job->num_page_ranges = 0;
184 job->collate = FALSE;
185 job->reverse = FALSE;
188 job->page_set = GTK_PAGE_SET_ALL;
189 job->rotate_to_orientation = FALSE;
194 gtk_print_job_constructor (GType type,
195 guint n_construct_properties,
196 GObjectConstructParam *construct_params)
202 G_OBJECT_CLASS (gtk_print_job_parent_class)->constructor (type,
203 n_construct_properties,
206 job = GTK_PRINT_JOB (object);
208 g_assert (job->priv->printer_set &&
209 job->priv->settings_set &&
210 job->priv->page_setup_set);
212 _gtk_printer_prepare_for_print (job->priv->printer,
215 job->priv->page_setup);
222 gtk_print_job_finalize (GObject *object)
226 g_return_if_fail (object != NULL);
228 job = GTK_PRINT_JOB (object);
230 if (job->priv->spool_file_fd > 0)
232 close (job->priv->spool_file_fd);
233 job->priv->spool_file_fd = -1;
236 if (job->priv->backend)
237 g_object_unref (G_OBJECT (job->priv->backend));
239 if (job->priv->printer)
240 g_object_unref (G_OBJECT (job->priv->printer));
242 if (job->priv->surface)
243 cairo_surface_destroy (job->priv->surface);
245 if (job->priv->settings)
246 g_object_unref (job->priv->settings);
248 if (job->priv->page_setup)
249 g_object_unref (job->priv->page_setup);
251 g_free (job->page_ranges);
252 job->page_ranges = NULL;
254 g_free (job->priv->title);
255 job->priv->title = NULL;
257 if (G_OBJECT_CLASS (gtk_print_job_parent_class)->finalize)
258 G_OBJECT_CLASS (gtk_print_job_parent_class)->finalize (object);
263 * @title: the job title
264 * @printer: a #GtkPrinter
265 * @settings: a #GtkPrintSettings
266 * @page_setup: a #GtkPageSetup
268 * Creates a new #GtkPrintJob.
270 * Return value: a new #GtkPrintJob
275 gtk_print_job_new (const gchar *title,
277 GtkPrintSettings *settings,
278 GtkPageSetup *page_setup)
281 result = g_object_new (GTK_TYPE_PRINT_JOB,
284 "settings", settings,
285 "page-setup", page_setup,
287 return (GtkPrintJob *) result;
291 * gtk_print_job_get_settings:
292 * @job: a #GtkPrintJob
294 * Gets the #GtkPrintSettings of the print job.
296 * Return value: the settings of @job
301 gtk_print_job_get_settings (GtkPrintJob *job)
303 g_return_val_if_fail (GTK_IS_PRINT_JOB (job), NULL);
305 return job->priv->settings;
309 * gtk_print_job_get_printer:
310 * @job: a #GtkPrintJob
312 * Gets the #GtkPrinter of the print job.
314 * Return value: the printer of @job
319 gtk_print_job_get_printer (GtkPrintJob *job)
321 g_return_val_if_fail (GTK_IS_PRINT_JOB (job), NULL);
323 return job->priv->printer;
327 * gtk_print_job_get_title:
328 * @job: a #GtkPrintJob
330 * Gets the job title.
332 * Return value: the title of @job
336 G_CONST_RETURN gchar *
337 gtk_print_job_get_title (GtkPrintJob *job)
339 g_return_val_if_fail (GTK_IS_PRINT_JOB (job), NULL);
341 return job->priv->title;
345 * gtk_print_job_get_status:
346 * @job: a #GtkPrintJob
348 * Gets the status of the print job.
350 * Return value: the status of @job
355 gtk_print_job_get_status (GtkPrintJob *job)
357 g_return_val_if_fail (GTK_IS_PRINT_JOB (job), GTK_PRINT_STATUS_FINISHED);
359 return job->priv->status;
363 gtk_print_job_set_status (GtkPrintJob *job,
364 GtkPrintStatus status)
366 g_return_if_fail (GTK_IS_PRINT_JOB (job));
368 if (job->priv->status == status)
371 job->priv->status = status;
372 g_signal_emit (job, signals[STATUS_CHANGED], 0);
376 * gtk_print_job_set_source_file:
377 * @job: a #GtkPrintJob
378 * @filename: the file to be printed
379 * @error: return location for errors
381 * Make the #GtkPrintJob send an existing document to the
382 * printing system. The file can be in any format understood
383 * by the platforms printing system (typically PostScript,
384 * but on many platforms PDF may work too).
386 * Returns: %FALSE if an error occurred
391 gtk_print_job_set_source_file (GtkPrintJob *job,
392 const gchar *filename,
395 g_return_val_if_fail (GTK_IS_PRINT_JOB (job), FALSE);
397 job->priv->spool_file_fd = g_open (filename, O_RDONLY|O_BINARY);
398 if (job->priv->spool_file_fd < 0)
400 gchar *display_filename = g_filename_display_name (filename);
401 int save_errno = errno;
405 g_file_error_from_errno (save_errno),
406 _("Failed to open file '%s': %s"),
408 g_strerror (save_errno));
410 g_free (display_filename);
418 * gtk_print_job_get_surface:
419 * @job: a #GtkPrintJob
420 * @error: return location for errors, or %NULL
422 * Gets a cairo surface onto which the pages of
423 * the print job should be rendered.
425 * Return value: the cairo surface of @job
430 gtk_print_job_get_surface (GtkPrintJob *job,
434 gdouble width, height;
435 GtkPaperSize *paper_size;
437 g_return_val_if_fail (GTK_IS_PRINT_JOB (job), NULL);
439 if (job->priv->surface)
440 return job->priv->surface;
442 job->priv->spool_file_fd = g_file_open_tmp ("gtkprint_XXXXXX",
445 if (job->priv->spool_file_fd == -1)
448 fchmod (job->priv->spool_file_fd, S_IRUSR | S_IWUSR);
451 paper_size = gtk_page_setup_get_paper_size (job->priv->page_setup);
452 width = gtk_paper_size_get_width (paper_size, GTK_UNIT_POINTS);
453 height = gtk_paper_size_get_height (paper_size, GTK_UNIT_POINTS);
455 job->priv->surface = _gtk_printer_create_cairo_surface (job->priv->printer,
457 job->priv->spool_file_fd);
459 return job->priv->surface;
463 gtk_print_job_set_property (GObject *object,
469 GtkPrintJob *job = GTK_PRINT_JOB (object);
470 GtkPrintSettings *settings;
474 case GTK_PRINT_JOB_PROP_TITLE:
475 job->priv->title = g_value_dup_string (value);
478 case GTK_PRINT_JOB_PROP_PRINTER:
479 job->priv->printer = GTK_PRINTER (g_value_dup_object (value));
480 job->priv->printer_set = TRUE;
481 job->priv->backend = g_object_ref (gtk_printer_get_backend (job->priv->printer));
484 case GTK_PRINT_JOB_PROP_PAGE_SETUP:
485 job->priv->page_setup = GTK_PAGE_SETUP (g_value_dup_object (value));
486 job->priv->page_setup_set = TRUE;
489 case GTK_PRINT_JOB_PROP_SETTINGS:
490 /* We save a copy of the settings since we modify
491 * if when preparing the printer job. */
492 settings = GTK_PRINT_SETTINGS (g_value_get_object (value));
493 job->priv->settings = gtk_print_settings_copy (settings);
494 job->priv->settings_set = TRUE;
498 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
504 gtk_print_job_get_property (GObject *object,
509 GtkPrintJob *job = GTK_PRINT_JOB (object);
513 case GTK_PRINT_JOB_PROP_TITLE:
514 g_value_set_string (value, job->priv->title);
516 case GTK_PRINT_JOB_PROP_PRINTER:
517 g_value_set_object (value, job->priv->printer);
519 case GTK_PRINT_JOB_PROP_SETTINGS:
520 g_value_set_object (value, job->priv->settings);
522 case GTK_PRINT_JOB_PROP_PAGE_SETUP:
523 g_value_set_object (value, job->priv->page_setup);
526 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
532 * gtk_print_job_send:
533 * @job: a GtkPrintJob
534 * @callback: function to call when the job completes
535 * @user_data: user data that gets passed to @callback
536 * @dnotify: destroy notify for @user_data
537 * @error: return location for errors, or %NULL
539 * Sends the print job off to the printer.
541 * Return value: %FALSE if an error occurred
546 gtk_print_job_send (GtkPrintJob *job,
547 GtkPrintJobCompleteFunc callback,
549 GDestroyNotify dnotify,
552 g_return_val_if_fail (GTK_IS_PRINT_JOB (job), FALSE);
553 g_return_val_if_fail (job->priv->spool_file_fd > 0, FALSE);
555 gtk_print_job_set_status (job, GTK_PRINT_STATUS_SENDING_DATA);
556 lseek (job->priv->spool_file_fd, 0, SEEK_SET);
557 gtk_print_backend_print_stream (job->priv->backend,
559 job->priv->spool_file_fd,
567 #define __GTK_PRINT_JOB_C__
568 #include "gtkaliasdef.c"