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 GtkPrintJobPrivate *priv;
170 priv = job->priv = GTK_PRINT_JOB_GET_PRIVATE (job);
172 priv->spool_file_fd = -1;
174 priv->title = g_strdup ("");
175 priv->surface = NULL;
176 priv->backend = NULL;
177 priv->printer = NULL;
179 priv->printer_set = FALSE;
180 priv->settings_set = FALSE;
181 priv->page_setup_set = FALSE;
182 priv->status = GTK_PRINT_STATUS_INITIAL;
184 job->print_pages = GTK_PRINT_PAGES_ALL;
185 job->page_ranges = NULL;
186 job->num_page_ranges = 0;
187 job->collate = FALSE;
188 job->reverse = FALSE;
191 job->page_set = GTK_PAGE_SET_ALL;
192 job->rotate_to_orientation = FALSE;
197 gtk_print_job_constructor (GType type,
198 guint n_construct_properties,
199 GObjectConstructParam *construct_params)
202 GtkPrintJobPrivate *priv;
206 G_OBJECT_CLASS (gtk_print_job_parent_class)->constructor (type,
207 n_construct_properties,
210 job = GTK_PRINT_JOB (object);
213 g_assert (priv->printer_set &&
214 priv->settings_set &&
215 priv->page_setup_set);
217 _gtk_printer_prepare_for_print (priv->printer,
227 gtk_print_job_finalize (GObject *object)
229 GtkPrintJob *job = GTK_PRINT_JOB (object);
230 GtkPrintJobPrivate *priv = job->priv;
232 if (priv->spool_file_fd >= 0)
234 close (priv->spool_file_fd);
235 priv->spool_file_fd = -1;
239 g_object_unref (priv->backend);
242 g_object_unref (priv->printer);
245 cairo_surface_destroy (priv->surface);
248 g_object_unref (priv->settings);
250 if (priv->page_setup)
251 g_object_unref (priv->page_setup);
253 g_free (job->page_ranges);
254 job->page_ranges = NULL;
256 g_free (priv->title);
259 G_OBJECT_CLASS (gtk_print_job_parent_class)->finalize (object);
264 * @title: the job title
265 * @printer: a #GtkPrinter
266 * @settings: a #GtkPrintSettings
267 * @page_setup: a #GtkPageSetup
269 * Creates a new #GtkPrintJob.
271 * Return value: a new #GtkPrintJob
276 gtk_print_job_new (const gchar *title,
278 GtkPrintSettings *settings,
279 GtkPageSetup *page_setup)
282 result = g_object_new (GTK_TYPE_PRINT_JOB,
285 "settings", settings,
286 "page-setup", page_setup,
288 return (GtkPrintJob *) result;
292 * gtk_print_job_get_settings:
293 * @job: a #GtkPrintJob
295 * Gets the #GtkPrintSettings of the print job.
297 * Return value: the settings of @job
302 gtk_print_job_get_settings (GtkPrintJob *job)
304 g_return_val_if_fail (GTK_IS_PRINT_JOB (job), NULL);
306 return job->priv->settings;
310 * gtk_print_job_get_printer:
311 * @job: a #GtkPrintJob
313 * Gets the #GtkPrinter of the print job.
315 * Return value: the printer of @job
320 gtk_print_job_get_printer (GtkPrintJob *job)
322 g_return_val_if_fail (GTK_IS_PRINT_JOB (job), NULL);
324 return job->priv->printer;
328 * gtk_print_job_get_title:
329 * @job: a #GtkPrintJob
331 * Gets the job title.
333 * Return value: the title of @job
337 G_CONST_RETURN gchar *
338 gtk_print_job_get_title (GtkPrintJob *job)
340 g_return_val_if_fail (GTK_IS_PRINT_JOB (job), NULL);
342 return job->priv->title;
346 * gtk_print_job_get_status:
347 * @job: a #GtkPrintJob
349 * Gets the status of the print job.
351 * Return value: the status of @job
356 gtk_print_job_get_status (GtkPrintJob *job)
358 g_return_val_if_fail (GTK_IS_PRINT_JOB (job), GTK_PRINT_STATUS_FINISHED);
360 return job->priv->status;
364 gtk_print_job_set_status (GtkPrintJob *job,
365 GtkPrintStatus status)
367 GtkPrintJobPrivate *priv;
369 g_return_if_fail (GTK_IS_PRINT_JOB (job));
373 if (priv->status == status)
376 priv->status = status;
377 g_signal_emit (job, signals[STATUS_CHANGED], 0);
381 * gtk_print_job_set_source_file:
382 * @job: a #GtkPrintJob
383 * @filename: the file to be printed
384 * @error: return location for errors
386 * Make the #GtkPrintJob send an existing document to the
387 * printing system. The file can be in any format understood
388 * by the platforms printing system (typically PostScript,
389 * but on many platforms PDF may work too).
391 * Returns: %FALSE if an error occurred
396 gtk_print_job_set_source_file (GtkPrintJob *job,
397 const gchar *filename,
400 GtkPrintJobPrivate *priv;
402 g_return_val_if_fail (GTK_IS_PRINT_JOB (job), FALSE);
406 priv->spool_file_fd = g_open (filename, O_RDONLY|O_BINARY);
407 if (priv->spool_file_fd < 0)
409 gchar *display_filename = g_filename_display_name (filename);
410 int save_errno = errno;
414 g_file_error_from_errno (save_errno),
415 _("Failed to open file '%s': %s"),
417 g_strerror (save_errno));
419 g_free (display_filename);
427 * gtk_print_job_get_surface:
428 * @job: a #GtkPrintJob
429 * @error: return location for errors, or %NULL
431 * Gets a cairo surface onto which the pages of
432 * the print job should be rendered.
434 * Return value: the cairo surface of @job
439 gtk_print_job_get_surface (GtkPrintJob *job,
442 GtkPrintJobPrivate *priv;
444 gdouble width, height;
445 GtkPaperSize *paper_size;
447 g_return_val_if_fail (GTK_IS_PRINT_JOB (job), NULL);
452 return priv->surface;
454 g_return_val_if_fail (priv->spool_file_fd == -1, NULL);
456 priv->spool_file_fd = g_file_open_tmp ("gtkprint_XXXXXX",
459 if (priv->spool_file_fd == -1)
462 fchmod (priv->spool_file_fd, S_IRUSR | S_IWUSR);
465 paper_size = gtk_page_setup_get_paper_size (priv->page_setup);
466 width = gtk_paper_size_get_width (paper_size, GTK_UNIT_POINTS);
467 height = gtk_paper_size_get_height (paper_size, GTK_UNIT_POINTS);
469 priv->surface = _gtk_printer_create_cairo_surface (priv->printer,
471 priv->spool_file_fd);
473 return priv->surface;
477 gtk_print_job_set_property (GObject *object,
483 GtkPrintJob *job = GTK_PRINT_JOB (object);
484 GtkPrintJobPrivate *priv = job->priv;
485 GtkPrintSettings *settings;
489 case GTK_PRINT_JOB_PROP_TITLE:
490 priv->title = g_value_dup_string (value);
493 case GTK_PRINT_JOB_PROP_PRINTER:
494 priv->printer = GTK_PRINTER (g_value_dup_object (value));
495 priv->printer_set = TRUE;
496 priv->backend = g_object_ref (gtk_printer_get_backend (priv->printer));
499 case GTK_PRINT_JOB_PROP_PAGE_SETUP:
500 priv->page_setup = GTK_PAGE_SETUP (g_value_dup_object (value));
501 priv->page_setup_set = TRUE;
504 case GTK_PRINT_JOB_PROP_SETTINGS:
505 /* We save a copy of the settings since we modify
506 * if when preparing the printer job. */
507 settings = GTK_PRINT_SETTINGS (g_value_get_object (value));
508 priv->settings = gtk_print_settings_copy (settings);
509 priv->settings_set = TRUE;
513 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
519 gtk_print_job_get_property (GObject *object,
524 GtkPrintJob *job = GTK_PRINT_JOB (object);
525 GtkPrintJobPrivate *priv = job->priv;
529 case GTK_PRINT_JOB_PROP_TITLE:
530 g_value_set_string (value, priv->title);
532 case GTK_PRINT_JOB_PROP_PRINTER:
533 g_value_set_object (value, priv->printer);
535 case GTK_PRINT_JOB_PROP_SETTINGS:
536 g_value_set_object (value, priv->settings);
538 case GTK_PRINT_JOB_PROP_PAGE_SETUP:
539 g_value_set_object (value, priv->page_setup);
542 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
548 * gtk_print_job_send:
549 * @job: a GtkPrintJob
550 * @callback: function to call when the job completes
551 * @user_data: user data that gets passed to @callback
552 * @dnotify: destroy notify for @user_data
553 * @error: return location for errors, or %NULL
555 * Sends the print job off to the printer.
557 * Return value: %FALSE if an error occurred
562 gtk_print_job_send (GtkPrintJob *job,
563 GtkPrintJobCompleteFunc callback,
565 GDestroyNotify dnotify,
568 GtkPrintJobPrivate *priv;
570 g_return_val_if_fail (GTK_IS_PRINT_JOB (job), FALSE);
573 g_return_val_if_fail (priv->spool_file_fd > 0, FALSE);
575 gtk_print_job_set_status (job, GTK_PRINT_STATUS_SENDING_DATA);
576 lseek (priv->spool_file_fd, 0, SEEK_SET);
577 gtk_print_backend_print_stream (priv->backend,
587 #define __GTK_PRINT_JOB_C__
588 #include "gtkaliasdef.c"