get_cairo_context_from_print_context (GtkPrintContext *context)
{
cairo_t *cr = gtk_print_context_get_cairo_context (context);
-
- /*
- For all platforms except windows, gtk_print_context_get_dpi_[xy] returns 72.
- Windows returns 600.
- */
- double xres = gtk_print_context_get_dpi_x (context);
- double yres = gtk_print_context_get_dpi_y (context);
-
- /* This means that the cairo context now has its dimensions in Points */
- cairo_scale (cr, xres / 72.0, yres / 72.0);
-
- return cr;
+ return cairo_reference (cr);
}
-
static void
create_xr_print_driver (GtkPrintContext *context, struct psppire_output_view *view)
{
[V] = gtk_page_setup_get_paper_height (ps, GTK_UNIT_POINTS) * XR_POINT,
};
+ /* These are all 1/2 inch. The "margins" that GTK+ gives us are useless:
+ they are the printer's imagable area. */
int margins[TABLE_N_AXES][2] = {
- [H][0] = gtk_page_setup_get_left_margin (ps, GTK_UNIT_POINTS) * XR_POINT,
- [H][1] = gtk_page_setup_get_right_margin (ps, GTK_UNIT_POINTS) * XR_POINT,
- [V][0] = gtk_page_setup_get_top_margin (ps, GTK_UNIT_POINTS) * XR_POINT,
- [V][1] = gtk_page_setup_get_bottom_margin (ps, GTK_UNIT_POINTS) * XR_POINT,
+ [H][0] = XR_POINT * 36,
+ [H][1] = XR_POINT * 36,
+ [V][0] = XR_POINT * 36,
+ [V][1] = XR_POINT * 36,
};
double size[TABLE_N_AXES];
*view->page_style = (struct xr_page_style) {
.ref_cnt = 1,
- .size = { [H] = size[H], [V] = size[V] },
.margins = {
[H] = { margins[H][0], margins[H][1] },
[V] = { margins[V][0], margins[V][1] },
},
- .font = pango_font_description_copy (proportional_font),
.bg = { .alpha = 0 },
- .font_scale = 72.0 / 128.0,
.initial_page_number = 1,
.object_spacing = 12 * XR_POINT,
};
.ref_cnt = 1,
.size = { [H] = size[H], [V] = size[V] },
+ .min_break = { [H] = size[H] / 2, [V] = size[V] / 2 },
.fonts = {
[XR_FONT_PROPORTIONAL] = proportional_font,
[XR_FONT_FIXED] = fixed_font,
.font_scale = 72.0 / 128.0
};
- view->pager = xr_pager_create (view->page_style);
+ view->pager = xr_pager_create (view->page_style, view->fsm_style);
}
static gboolean
}
else if (view->print_item < view->n_items)
{
- xr_pager_add_item (view->pager, view->fsm_style,
- view->items[view->print_item++].item);
+ xr_pager_add_item (view->pager, view->items[view->print_item++].item);
while (xr_pager_needs_new_page (view->pager))
{
xr_pager_add_page (view->pager,
}
else
{
- gtk_print_operation_set_n_pages (operation, view->print_n_pages);
+ gtk_print_operation_set_n_pages (operation, MAX (1, view->print_n_pages));
/* Re-create the driver to do the real printing. */
xr_pager_destroy (view->pager);
- view->pager = xr_pager_create (view->page_style);
+ view->pager = xr_pager_create (view->page_style, view->fsm_style);
view->print_item = 0;
view->paginated = TRUE;
create_xr_print_driver (context, view);
view->print_item = 0;
- view->print_n_pages = 1;
+ view->print_n_pages = 0;
view->paginated = FALSE;
}
struct psppire_output_view *view)
{
xr_pager_destroy (view->pager);
+ view->pager = NULL;
}
get_cairo_context_from_print_context (context));
while (!xr_pager_needs_new_page (view->pager)
&& view->print_item < view->n_items)
- xr_pager_add_item (view->pager, view->fsm_style,
- view->items [view->print_item++].item);
+ xr_pager_add_item (view->pager, view->items [view->print_item++].item);
}
if (view->print_settings != NULL)
gtk_print_operation_set_print_settings (print, view->print_settings);
+ gtk_print_operation_set_use_full_page (print, TRUE);
+ gtk_print_operation_set_unit (print, GTK_UNIT_POINTS);
+
g_signal_connect (print, "begin_print", G_CALLBACK (begin_print), view);
g_signal_connect (print, "end_print", G_CALLBACK (end_print), view);
g_signal_connect (print, "paginate", G_CALLBACK (paginate), view);