N_COLS
};
-static void psppire_output_window_base_finalize (PsppireOutputWindowClass *, gpointer);
-static void psppire_output_window_base_init (PsppireOutputWindowClass *class);
static void psppire_output_window_class_init (PsppireOutputWindowClass *class);
static void psppire_output_window_init (PsppireOutputWindow *window);
static const GTypeInfo psppire_output_window_info =
{
sizeof (PsppireOutputWindowClass),
- (GBaseInitFunc) psppire_output_window_base_init,
- (GBaseFinalizeFunc) psppire_output_window_base_finalize,
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
(GClassInitFunc)psppire_output_window_class_init,
(GClassFinalizeFunc) NULL,
NULL,
PsppireOutputWindow *viewer = PSPPIRE_OUTPUT_WINDOW (obj);
size_t i;
+ if (viewer->dispose_has_run)
+ return;
+
+ viewer->dispose_has_run = TRUE;
for (i = 0; i < viewer->n_items; i++)
output_item_unref (viewer->items[i]);
free (viewer->items);
object_class->dispose = psppire_output_window_dispose;
GTK_WIDGET_CLASS (object_class)->style_set = psppire_output_window_style_set;
-}
-
-
-static void
-psppire_output_window_base_init (PsppireOutputWindowClass *class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (class);
-
object_class->finalize = psppire_output_window_finalize;
}
-
-static void
-psppire_output_window_base_finalize (PsppireOutputWindowClass *class,
- gpointer class_data)
-{
-}
\f
/* Output driver class. */
window->output = GTK_LAYOUT (get_widget_assert (xml, "output"));
window->y = 0;
+ window->print_settings = NULL;
+ window->dispose_has_run = FALSE;
window->overview = GTK_TREE_VIEW (get_widget_assert (xml, "overview"));
}
\f
+
+static cairo_t *
+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;
+}
+
+
static void
create_xr_print_driver (GtkPrintContext *context, PsppireOutputWindow *window)
{
string_map_insert_nocopy (&options, xstrdup ("bottom-margin"),
c_xasprintf ("%.2fmm", bottom_margin));
- window->print_xrd =
- xr_driver_create (gtk_print_context_get_cairo_context (context), &options);
+ window->print_xrd = xr_driver_create (get_cairo_context_from_print_context (context), &options);
string_map_destroy (&options);
}
gint page_number,
PsppireOutputWindow *window)
{
- xr_driver_next_page (window->print_xrd, gtk_print_context_get_cairo_context (context));
+ xr_driver_next_page (window->print_xrd, get_cairo_context_from_print_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++]);
gtk_print_operation_set_print_settings (print, window->print_settings);
g_signal_connect (print, "begin_print", G_CALLBACK (begin_print), window);
- g_signal_connect (print, "end_print", G_CALLBACK (end_print), window);
- g_signal_connect (print, "paginate", G_CALLBACK (paginate), window);
- g_signal_connect (print, "draw_page", G_CALLBACK (draw_page), window);
+ g_signal_connect (print, "end_print", G_CALLBACK (end_print), window);
+ g_signal_connect (print, "paginate", G_CALLBACK (paginate), window);
+ g_signal_connect (print, "draw_page", G_CALLBACK (draw_page), window);
res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
GTK_WINDOW (window), NULL);
if (window->print_settings != NULL)
g_object_unref (window->print_settings);
window->print_settings = g_object_ref (gtk_print_operation_get_print_settings (print));
-
}
g_object_unref (print);