X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-print-job.c;h=955e4bab183b246f5f9b2bd9919f22be07631a3b;hb=a24ba773afb595b2be95a01702816aa66f50ac54;hp=0c66b81a2e175d1e67ad29352f14828e555a90c9;hpb=fed5ac607fbe74668f1b74c2022ef56b5ee25d61;p=evince.git diff --git a/shell/ev-print-job.c b/shell/ev-print-job.c index 0c66b81a..955e4bab 100644 --- a/shell/ev-print-job.c +++ b/shell/ev-print-job.c @@ -34,6 +34,7 @@ #include "ev-ps-exporter.h" #include "ev-print-job.h" +#include "ev-page-cache.h" #define EV_PRINT_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_PRINT_JOB, EvPrintJobClass)) #define EV_IS_PRINT_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), EV_PRINT_JOB)) @@ -50,6 +51,10 @@ struct _EvPrintJob { int copies; /* FIXME unused */ int collate; /* FIXME unsued */ + /* range printing */ + int first_page; + int last_page; + int fd; char *temp_file; guint idle_id; @@ -215,6 +220,7 @@ void ev_print_job_use_print_dialog_settings (EvPrintJob *job, GnomePrintDialog *dialog) { GnomePrintConfig *print_config; + EvPageCache *page_cache = ev_page_cache_get (job->document); g_return_if_fail (EV_IS_PRINT_JOB (job)); g_return_if_fail (GNOME_IS_PRINT_DIALOG (dialog)); @@ -224,7 +230,26 @@ ev_print_job_use_print_dialog_settings (EvPrintJob *job, GnomePrintDialog *dialo gnome_print_config_get_page_size (print_config, &job->width, &job->height); gnome_print_config_get_boolean (print_config, - GNOME_PRINT_KEY_DUPLEX, &job->duplex); + (guchar *)GNOME_PRINT_KEY_DUPLEX, &job->duplex); + + page_cache = ev_page_cache_get (job->document); + + /* get the printing ranges */ + switch (gnome_print_dialog_get_range (dialog)) { + case GNOME_PRINT_RANGE_ALL: + job->first_page = 0; + job->last_page = ev_page_cache_get_n_pages (page_cache) - 1; + break; + case GNOME_PRINT_RANGE_RANGE: + gnome_print_dialog_get_range_page (dialog, &job->first_page, &job->last_page); + /* convert 1-based user interface to 0-based internal numbers */ + job->first_page--; + job->last_page--; + break; + default: + g_assert_not_reached (); + } + gnome_print_config_unref (print_config); } @@ -232,23 +257,36 @@ static gboolean idle_print_handler (EvPrintJob *job) { if (!job->printing) { - ev_ps_exporter_begin (EV_PS_EXPORTER (job->document), - job->temp_file); - job->next_page = 1; /* FIXME use 0-based page numbering? */ + ev_document_doc_mutex_lock (); + ev_ps_exporter_begin ( + EV_PS_EXPORTER (job->document), + job->temp_file, job->first_page, job->last_page, + job->width, job->height, job->duplex); + ev_document_doc_mutex_unlock (); + job->next_page = job->first_page; job->printing = TRUE; return TRUE; } - if (job->next_page <= ev_document_get_n_pages (job->document)) { + if (job->next_page <= job->last_page) { + EvRenderContext *rc; #if 0 g_printerr ("Printing page %d\n", job->next_page); #endif - ev_ps_exporter_do_page (EV_PS_EXPORTER (job->document), - job->next_page); + rc = ev_render_context_new (0, job->next_page, 1.0); + + ev_document_doc_mutex_lock (); + ev_ps_exporter_do_page (EV_PS_EXPORTER (job->document), rc); + ev_document_doc_mutex_unlock (); + + g_object_unref (rc); + job->next_page++; return TRUE; } else { /* no more pages */ + ev_document_doc_mutex_lock (); ev_ps_exporter_end (EV_PS_EXPORTER (job->document)); + ev_document_doc_mutex_unlock (); close (job->fd); job->fd = 0;