+2006-10-30 Carlos Garcia Campos <carlosgc@gnome.org>
+
+ * shell/ev-jobs.[ch]: (ev_job_print_new),
+ (ev_print_job_print_page_in_range), (ev_print_job_print_page_in_set),
+ (ev_job_print_do_page):
+ * shell/ev-window.[ch]: (ev_window_print_dialog_response_cb):
+
+ Allow printing only odd/even pages. Fixes bug #367289.
+
2006-10-29 Wouter Bolsterlee <wbolster@cvs.gnome.org>
* test/test1.py:
}
EvJob *
-ev_job_print_new (EvDocument *document,
- gdouble width,
- gdouble height,
- EvPrintRange *ranges,
- gint n_ranges,
- gint copies,
- gdouble collate,
- gdouble reverse)
+ev_job_print_new (EvDocument *document,
+ gdouble width,
+ gdouble height,
+ EvPrintRange *ranges,
+ gint n_ranges,
+ EvPrintPageSet page_set,
+ gint copies,
+ gdouble collate,
+ gdouble reverse)
{
EvJobPrint *job;
job->ranges = ranges;
job->n_ranges = n_ranges;
+
+ job->page_set = page_set;
job->copies = copies;
job->collate = collate;
}
static gboolean
-ev_print_job_print_page (EvJobPrint *job,
- gint page)
+ev_print_job_print_page_in_range (EvJobPrint *job,
+ gint page)
{
gint i;
return FALSE;
}
+static gboolean
+ev_print_job_print_page_in_set (EvJobPrint *job,
+ gint page)
+{
+ switch (job->page_set) {
+ case EV_PRINT_PAGE_SET_EVEN:
+ return page % 2 == 0;
+ case EV_PRINT_PAGE_SET_ODD:
+ return page % 2 != 0;
+ case EV_PRINT_PAGE_SET_ALL:
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static void
ev_job_print_do_page (EvJobPrint *job, gint page)
{
gint n_pages = 1;
gint j;
- if (job->n_ranges > 0 && !ev_print_job_print_page (job, page)) {
+ if (job->n_ranges > 0 &&
+ !ev_print_job_print_page_in_range (job, page)) {
+ page += step;
+ continue;
+ }
+
+ if (!ev_print_job_print_page_in_set (job, page + 1)) {
page += step;
continue;
}
gchar *temp_file;
EvPrintRange *ranges;
gint n_ranges;
+ EvPrintPageSet page_set;
gint copies;
gboolean collate;
gboolean reverse;
gdouble height,
EvPrintRange *ranges,
gint n_ranges,
+ EvPrintPageSet page_set,
gint copies,
gdouble collate,
gdouble reverse);
gint response,
EvWindow *window)
{
- 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;
+ EvPrintRange *ranges = NULL;
+ EvPrintPageSet page_set;
+ 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) {
gtk_widget_destroy (GTK_WIDGET (dialog));
break;
}
+ page_set = (EvPrintPageSet)gtk_print_settings_get_page_set (window->priv->print_settings);
+
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,
(gdouble)width,
(gdouble)height,
ranges, n_ranges,
- copies, collate, reverse);
+ page_set,
+ copies, collate,
+ reverse);
g_signal_connect (window->priv->print_job, "finished",
G_CALLBACK (ev_window_print_job_cb),
gint end;
} EvPrintRange;
+typedef enum {
+ EV_PRINT_PAGE_SET_ALL,
+ EV_PRINT_PAGE_SET_EVEN,
+ EV_PRINT_PAGE_SET_ODD
+} EvPrintPageSet;
+
typedef struct _EvWindow EvWindow;
typedef struct _EvWindowClass EvWindowClass;
typedef struct _EvWindowPrivate EvWindowPrivate;