From e15ce77fdce11d47bc92a209efb013c008d502d5 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Tue, 24 Oct 2006 18:32:58 +0000 Subject: Use print settings scale, copies, collate and reverse which were ignored. 2006-10-24 Carlos Garcia Campos * shell/ev-jobs.[ch]: (ev_job_print_new), (ev_job_print_run): * shell/ev-window.c: (ev_window_print_dialog_response_cb): Use print settings scale, copies, collate and reverse which were ignored. Fixes bug #359032. --- diff --git a/ChangeLog b/ChangeLog index 9044eea..0729dfd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-10-24 Carlos Garcia Campos + + * shell/ev-jobs.[ch]: (ev_job_print_new), (ev_job_print_run): + * shell/ev-window.c: (ev_window_print_dialog_response_cb): + + Use print settings scale, copies, collate and reverse which were + ignored. Fixes bug #359032. + 2006-10-24 Nickolay V. Shmyrev * configure.ac: diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c index 416c788..1799602 100644 --- a/shell/ev-jobs.c +++ b/shell/ev-jobs.c @@ -528,10 +528,13 @@ ev_job_xfer_run (EvJobXfer *job) EvJob * ev_job_print_new (EvDocument *document, - EvPrintRange *ranges, - gint n_ranges, - gdouble width, - gdouble height) + gdouble width, + gdouble height, + EvPrintRange *ranges, + gint n_ranges, + gint copies, + gdouble collate, + gdouble reverse) { EvJobPrint *job; @@ -542,12 +545,16 @@ ev_job_print_new (EvDocument *document, job->temp_file = NULL; job->error = NULL; + job->width = width; + job->height = height; + job->ranges = ranges; job->n_ranges = n_ranges; - job->width = width; - job->height = height; - + job->copies = copies; + job->collate = collate; + job->reverse = reverse; + return EV_JOB (job); } @@ -603,6 +610,17 @@ ev_print_job_print_page (EvJobPrint *job, return FALSE; } +static void +ev_job_print_do_page (EvJobPrint *job, gint page) +{ + EvDocument *document = EV_JOB (job)->document; + EvRenderContext *rc; + + rc = ev_render_context_new (0, page, 1.0); + ev_ps_exporter_do_page (EV_PS_EXPORTER (document), rc); + g_object_unref (rc); +} + void ev_job_print_run (EvJobPrint *job) { @@ -637,25 +655,36 @@ ev_job_print_run (EvJobPrint *job) MIN (first_page, last_page), MAX (first_page, last_page), job->width, job->height, FALSE); - ev_document_doc_mutex_unlock (); - for (i = first_page; i <= last_page; i++) { - EvRenderContext *rc; - - if (job->n_ranges > 0 && - !ev_print_job_print_page (job, i)) - continue; + for (i = 0; i < job->copies; i++) { + gint page, step; - rc = ev_render_context_new (0, i, 1.0); - - ev_document_doc_mutex_lock (); - ev_ps_exporter_do_page (EV_PS_EXPORTER (document), rc); - ev_document_doc_mutex_unlock (); + step = job->reverse ? -1 : 1; + page = job->reverse ? last_page : first_page; + while ((job->reverse && (page >= first_page)) || + (!job->reverse && (page <= last_page))) { + gint n_pages = 1; + gint j; + + if (job->n_ranges > 0 && !ev_print_job_print_page (job, page)) { + page += step; + continue; + } + + if (job->collate) + n_pages = job->copies; + + for (j = 0; j < n_pages; j++) { + ev_job_print_do_page (job, page); + } + + page += step; + } - g_object_unref (rc); + if (job->collate) + break; } - ev_document_doc_mutex_lock (); ev_ps_exporter_end (EV_PS_EXPORTER (document)); ev_document_doc_mutex_unlock (); diff --git a/shell/ev-jobs.h b/shell/ev-jobs.h index e4497f2..a8db1e9 100644 --- a/shell/ev-jobs.h +++ b/shell/ev-jobs.h @@ -191,6 +191,9 @@ struct _EvJobPrint gchar *temp_file; EvPrintRange *ranges; gint n_ranges; + gint copies; + gboolean collate; + gboolean reverse; gdouble width; gdouble height; }; @@ -246,10 +249,13 @@ void ev_job_xfer_run (EvJobXfer *xfer); /* EvJobPrint */ GType ev_job_print_get_type (void) G_GNUC_CONST; EvJob *ev_job_print_new (EvDocument *document, + gdouble width, + gdouble height, EvPrintRange *ranges, gint n_ranges, - gdouble width, - gdouble height); + gint copies, + gdouble collate, + gdouble reverse); void ev_job_print_run (EvJobPrint *print); G_END_DECLS diff --git a/shell/ev-window.c b/shell/ev-window.c index aea1c1b..e179574 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -1519,8 +1519,16 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog, gint response, EvWindow *window) { - EvBackend document_type; - gboolean export_to_ps = TRUE; + EvPrintRange *ranges = NULL; + EvPageCache *page_cache; + gint n_ranges = 0; + gint copies; + gboolean collate; + gboolean reverse; + gdouble scale; + gint current_page; + gint width; + gint height; GtkPrintPages print_pages; if (response != GTK_RESPONSE_OK) { @@ -1544,32 +1552,7 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog, window->priv->print_page_setup = g_object_ref ( gtk_print_unix_dialog_get_page_setup (GTK_PRINT_UNIX_DIALOG (dialog))); - document_type = ev_document_factory_get_backend (window->priv->document); - print_pages = gtk_print_settings_get_print_pages (window->priv->print_settings); - - if (print_pages == GTK_PRINT_PAGES_ALL) { - switch (document_type) { - case EV_BACKEND_PDF: - /* Export to ps when printing to file */ - if (gtk_print_settings_has_key (window->priv->print_settings, - GTK_PRINT_SETTINGS_OUTPUT_URI)) { - export_to_ps = TRUE; - } else { - export_to_ps = !gtk_printer_accepts_pdf (window->priv->printer); - } - - break; - case EV_BACKEND_PS: - export_to_ps = FALSE; - break; - default: - export_to_ps = TRUE; - break; - } - } - - if ((export_to_ps || document_type == EV_BACKEND_PS) && - !gtk_printer_accepts_ps (window->priv->printer)) { + if (!gtk_printer_accepts_ps (window->priv->printer)) { GtkWidget *msgdialog; msgdialog = gtk_message_dialog_new (GTK_WINDOW (dialog), @@ -1584,65 +1567,55 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog, return FALSE; } - if (export_to_ps) { - EvPrintRange *ranges = NULL; - EvPageCache *page_cache; - gint n_ranges = 0; - gint current_page; - gint width; - gint height; - - ev_window_clear_print_job (window); - - current_page = - gtk_print_unix_dialog_get_current_page (GTK_PRINT_UNIX_DIALOG (dialog)); - - switch (print_pages) { - case GTK_PRINT_PAGES_CURRENT: - ranges = g_new0 (EvPrintRange, 1); - - ranges->start = current_page; - ranges->end = current_page; - n_ranges = 1; - - break; - case GTK_PRINT_PAGES_RANGES: { - GtkPageRange *page_range; - - page_range = gtk_print_settings_get_page_ranges (window->priv->print_settings, - &n_ranges); - if (n_ranges > 0) - ranges = g_memdup (page_range, n_ranges * sizeof (GtkPageRange)); - } - break; - default: - break; - } - - page_cache = ev_page_cache_get (window->priv->document); - ev_page_cache_get_size (page_cache, - current_page, - 0, 1.0, - &width, &height); + ev_window_clear_print_job (window); + + current_page = gtk_print_unix_dialog_get_current_page (GTK_PRINT_UNIX_DIALOG (dialog)); + print_pages = gtk_print_settings_get_print_pages (window->priv->print_settings); - window->priv->print_job = - ev_job_print_new (window->priv->document, - ranges, n_ranges, - (gdouble)width, - (gdouble)height); + switch (print_pages) { + case GTK_PRINT_PAGES_CURRENT: + ranges = g_new0 (EvPrintRange, 1); - g_signal_connect (window->priv->print_job, "finished", - G_CALLBACK (ev_window_print_job_cb), - window); - /* The priority doesn't matter for this job */ - ev_job_queue_add_job (window->priv->print_job, EV_JOB_PRIORITY_LOW); - } else { - gchar *filename; - - filename = g_filename_from_uri (window->priv->uri, NULL, NULL); - ev_window_print_send (window, filename); - g_free (filename); + ranges->start = current_page; + ranges->end = current_page; + n_ranges = 1; + + break; + case GTK_PRINT_PAGES_RANGES: { + GtkPageRange *page_range; + + page_range = gtk_print_settings_get_page_ranges (window->priv->print_settings, + &n_ranges); + if (n_ranges > 0) + ranges = g_memdup (page_range, n_ranges * sizeof (GtkPageRange)); + } + break; + default: + break; } + + scale = gtk_print_settings_get_scale (window->priv->print_settings) * 0.01; + page_cache = ev_page_cache_get (window->priv->document); + ev_page_cache_get_size (page_cache, + current_page, + 0, scale, + &width, &height); + + copies = gtk_print_settings_get_n_copies (window->priv->print_settings); + collate = gtk_print_settings_get_collate (window->priv->print_settings); + reverse = gtk_print_settings_get_reverse (window->priv->print_settings); + + window->priv->print_job = ev_job_print_new (window->priv->document, + (gdouble)width, + (gdouble)height, + ranges, n_ranges, + copies, collate, reverse); + + g_signal_connect (window->priv->print_job, "finished", + G_CALLBACK (ev_window_print_job_cb), + window); + /* The priority doesn't matter for this job */ + ev_job_queue_add_job (window->priv->print_job, EV_JOB_PRIORITY_LOW); gtk_widget_destroy (GTK_WIDGET (dialog)); window->priv->print_dialog = NULL; -- cgit v0.9.1