1 /* this file is part of evince, a gnome document viewer
3 * Copyright (C) 2004 Martin Kretzschmar
6 * Martin Kretzschmar <martink@gnome.org>
8 * Evince is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * Evince is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
28 #include <glib/gi18n.h>
29 #include <glib-object.h>
31 /* for gnome_print_job_set_file */
32 #define GNOME_PRINT_UNSTABLE_API
33 #include <libgnomeprint/gnome-print-job.h>
35 #include "ev-ps-exporter.h"
36 #include "ev-print-job.h"
38 #define EV_PRINT_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_PRINT_JOB, EvPrintJobClass))
39 #define EV_IS_PRINT_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), EV_PRINT_JOB))
40 #define EV_PRINT_JOB_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), EV_PRINT_JOB, EvPrintJobClass))
43 GObject parent_instance;
46 GnomePrintJob *gnome_print_job;
47 double width; /* FIXME unused */
48 double height; /* FIXME unused */
49 gboolean duplex; /* FIXME unused */
50 int copies; /* FIXME unused */
51 int collate; /* FIXME unsued */
60 struct _EvPrintJobClass {
61 GObjectClass parent_class;
71 G_DEFINE_TYPE (EvPrintJob, ev_print_job, G_TYPE_OBJECT);
74 ev_print_job_finalize (GObject *object)
76 EvPrintJob *job = EV_PRINT_JOB (object);
78 if (job && job->document) {
79 g_object_unref (job->document);
83 if (job && job->gnome_print_job) {
84 g_object_unref (job->gnome_print_job);
85 job->gnome_print_job = NULL;
88 G_OBJECT_CLASS (ev_print_job_parent_class)->finalize (object);
92 ev_print_job_set_property (GObject *object, guint prop_id,
93 const GValue *value, GParamSpec *pspec)
97 job = EV_PRINT_JOB (object);
100 case PROP_GNOME_PRINT_JOB:
101 ev_print_job_set_gnome_print_job (
102 job, GNOME_PRINT_JOB (g_value_get_object (value)));
105 ev_print_job_set_document (job, EV_DOCUMENT (g_value_get_object (value)));
107 case PROP_PRINT_DIALOG:
108 ev_print_job_use_print_dialog_settings (
109 job, GNOME_PRINT_DIALOG (g_value_get_object (value)));
112 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
119 ev_print_job_get_property (GObject *object, guint prop_id,
120 GValue *value, GParamSpec *pspec)
124 job = EV_PRINT_JOB (object);
127 case PROP_GNOME_PRINT_JOB:
128 g_value_set_object (value, job->gnome_print_job);
131 g_value_set_object (value, job->document);
134 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
141 ev_print_job_class_init (EvPrintJobClass *ev_print_job_class)
143 GObjectClass *g_object_class;
145 g_object_class = G_OBJECT_CLASS (ev_print_job_class);
147 g_object_class->finalize = ev_print_job_finalize;
148 g_object_class->set_property = ev_print_job_set_property;
149 g_object_class->get_property = ev_print_job_get_property;
151 g_object_class_install_property (g_object_class,
152 PROP_GNOME_PRINT_JOB,
153 g_param_spec_object ("gnome_print_job",
156 GNOME_TYPE_PRINT_JOB,
158 g_object_class_install_property (g_object_class,
160 g_param_spec_object ("document",
162 "Document from which to print",
163 G_TYPE_OBJECT, /* EV_TYPE_DOCUMENT, */
165 g_object_class_install_property (g_object_class,
167 g_param_spec_object ("print_dialog",
169 "GnomePrintDialog with user settings",
170 GNOME_TYPE_PRINT_DIALOG,
176 ev_print_job_init (EvPrintJob *ev_print_job)
181 ev_print_job_set_gnome_print_job (EvPrintJob *job, GnomePrintJob *gpj)
183 g_return_if_fail (EV_IS_PRINT_JOB (job));
185 if (job->gnome_print_job == gpj)
188 if (job->gnome_print_job)
189 g_object_unref (job->gnome_print_job);
194 job->gnome_print_job = gpj;
198 ev_print_job_set_document (EvPrintJob *job, EvDocument *document)
200 g_return_if_fail (EV_IS_PRINT_JOB (job));
202 if (job->document == document)
206 g_object_ref (job->document);
209 g_object_ref (document);
211 job->document = document;
215 ev_print_job_use_print_dialog_settings (EvPrintJob *job, GnomePrintDialog *dialog)
217 GnomePrintConfig *print_config;
219 g_return_if_fail (EV_IS_PRINT_JOB (job));
220 g_return_if_fail (GNOME_IS_PRINT_DIALOG (dialog));
222 print_config = gnome_print_dialog_get_config (dialog);
223 gnome_print_dialog_get_copies (dialog, &job->copies, &job->collate);
224 gnome_print_config_get_page_size (print_config,
225 &job->width, &job->height);
226 gnome_print_config_get_boolean (print_config,
227 GNOME_PRINT_KEY_DUPLEX, &job->duplex);
228 gnome_print_config_unref (print_config);
232 idle_print_handler (EvPrintJob *job)
234 if (!job->printing) {
235 ev_ps_exporter_begin (EV_PS_EXPORTER (job->document),
237 job->next_page = 1; /* FIXME use 0-based page numbering? */
238 job->printing = TRUE;
242 if (job->next_page <= ev_document_get_n_pages (job->document)) {
244 g_printerr ("Printing page %d\n", job->next_page);
246 ev_ps_exporter_do_page (EV_PS_EXPORTER (job->document),
250 } else { /* no more pages */
251 ev_ps_exporter_end (EV_PS_EXPORTER (job->document));
256 gnome_print_job_print (job->gnome_print_job);
258 unlink (job->temp_file);
259 g_free (job->temp_file);
261 g_object_unref (job->gnome_print_job);
262 job->gnome_print_job = NULL;
264 job->printing = FALSE;
271 print_closure_finalize (EvPrintJob *job, GClosure *closure)
273 g_object_unref (job);
277 ev_print_job_print (EvPrintJob *job, GtkWindow *parent)
280 GSource *idle_source;
282 g_return_if_fail (EV_IS_PRINT_JOB (job));
283 g_return_if_fail (job->document != NULL);
284 g_return_if_fail (EV_IS_PS_EXPORTER (job->document));
286 g_printerr ("Printing...\n");
289 job->fd = g_file_open_tmp ("evince_print.ps.XXXXXX", &job->temp_file, NULL);
291 return; /* FIXME use GError */
293 gnome_print_job_set_file (job->gnome_print_job, job->temp_file);
296 closure = g_cclosure_new (G_CALLBACK (idle_print_handler), job, NULL);
297 g_closure_add_finalize_notifier (
298 closure, job, (GClosureNotify)print_closure_finalize);
300 idle_source = g_idle_source_new ();
301 g_source_set_closure (idle_source, closure);
302 job->idle_id = g_source_attach (idle_source, NULL);
303 g_source_unref (idle_source);