-
-\f
-static void
-create_xr_print_driver (GtkPrintContext *context, PsppireOutputWindow *window)
-{
- struct string_map options;
- GtkPageSetup *page_setup;
- double width, height;
- double left_margin;
- double right_margin;
- double top_margin;
- double bottom_margin;
-
- page_setup = gtk_print_context_get_page_setup (context);
- width = gtk_page_setup_get_paper_width (page_setup, GTK_UNIT_MM);
- height = gtk_page_setup_get_paper_height (page_setup, GTK_UNIT_MM);
- left_margin = gtk_page_setup_get_left_margin (page_setup, GTK_UNIT_MM);
- right_margin = gtk_page_setup_get_right_margin (page_setup, GTK_UNIT_MM);
- top_margin = gtk_page_setup_get_top_margin (page_setup, GTK_UNIT_MM);
- bottom_margin = gtk_page_setup_get_bottom_margin (page_setup, GTK_UNIT_MM);
-
- string_map_init (&options);
- string_map_insert_nocopy (&options, xstrdup ("paper-size"),
- xasprintf("%.2fx%.2fmm", width, height));
- string_map_insert_nocopy (&options, xstrdup ("left-margin"),
- xasprintf ("%.2fmm", left_margin));
- string_map_insert_nocopy (&options, xstrdup ("right-margin"),
- xasprintf ("%.2fmm", right_margin));
- string_map_insert_nocopy (&options, xstrdup ("top-margin"),
- xasprintf ("%.2fmm", top_margin));
- string_map_insert_nocopy (&options, xstrdup ("bottom-margin"),
- xasprintf ("%.2fmm", bottom_margin));
-
- window->print_xrd =
- xr_driver_create (gtk_print_context_get_cairo_context (context), &options);
-
- string_map_destroy (&options);
-}
-
-static gboolean
-paginate (GtkPrintOperation *operation,
- GtkPrintContext *context,
- PsppireOutputWindow *window)
-{
- if (window->paginated)
- {
- /* Sometimes GTK+ emits this signal again even after pagination is
- complete. Don't let that screw up printing. */
- return TRUE;
- }
- else if ( window->print_item < window->n_items )
- {
- xr_driver_output_item (window->print_xrd, window->items[window->print_item++]);
- while (xr_driver_need_new_page (window->print_xrd))
- {
- xr_driver_next_page (window->print_xrd, NULL);
- window->print_n_pages ++;
- }
- return FALSE;
- }
- else
- {
- gtk_print_operation_set_n_pages (operation, window->print_n_pages);
-
- /* Re-create the driver to do the real printing. */
- xr_driver_destroy (window->print_xrd);
- create_xr_print_driver (context, window);
- window->print_item = 0;
- window->paginated = TRUE;
-
- return TRUE;
- }
-}
-
-static void
-begin_print (GtkPrintOperation *operation,
- GtkPrintContext *context,
- PsppireOutputWindow *window)
-{
- create_xr_print_driver (context, window);
-
- window->print_item = 0;
- window->print_n_pages = 1;
- window->paginated = FALSE;
-}
-
-static void
-end_print (GtkPrintOperation *operation,
- GtkPrintContext *context,
- PsppireOutputWindow *window)
-{
- xr_driver_destroy (window->print_xrd);
-}
-
-
-static void
-draw_page (GtkPrintOperation *operation,
- GtkPrintContext *context,
- gint page_number,
- PsppireOutputWindow *window)
-{
- xr_driver_next_page (window->print_xrd, gtk_print_context_get_cairo_context (context));
- while (!xr_driver_need_new_page (window->print_xrd)
- && window->print_item < window->n_items)
- xr_driver_output_item (window->print_xrd, window->items [window->print_item++]);
-}
-
-