#include "gl/error.h"
#include "gl/tmpdir.h"
#include "gl/xalloc.h"
+#include "gl/c-xvasprintf.h"
#include "helper.h"
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. */
GtkAction *copy_action;
GtkAction *select_all_action;
GtkTreeSelection *sel;
+ GtkTreeModel *model;
string_map_init (&window->render_opts);
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"));
g_signal_connect (sel, "changed", G_CALLBACK (on_selection_change), copy_action);
- gtk_tree_view_set_model (window->overview,
- GTK_TREE_MODEL (gtk_tree_store_new (
+ model = GTK_TREE_MODEL (gtk_tree_store_new (
N_COLS,
G_TYPE_STRING, /* COL_TITLE */
G_TYPE_POINTER, /* COL_ADDR */
- G_TYPE_LONG))); /* COL_Y */
+ G_TYPE_LONG)); /* COL_Y */
+ gtk_tree_view_set_model (window->overview, model);
+ g_object_unref (model);
window->in_command = false;
NULL));
}
-
\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_init (&options);
string_map_insert_nocopy (&options, xstrdup ("paper-size"),
- xasprintf("%.2fx%.2fmm", width, height));
+ c_xasprintf("%.2fx%.2fmm", width, height));
string_map_insert_nocopy (&options, xstrdup ("left-margin"),
- xasprintf ("%.2fmm", left_margin));
+ c_xasprintf ("%.2fmm", left_margin));
string_map_insert_nocopy (&options, xstrdup ("right-margin"),
- xasprintf ("%.2fmm", right_margin));
+ c_xasprintf ("%.2fmm", right_margin));
string_map_insert_nocopy (&options, xstrdup ("top-margin"),
- xasprintf ("%.2fmm", top_margin));
+ c_xasprintf ("%.2fmm", top_margin));
string_map_insert_nocopy (&options, xstrdup ("bottom-margin"),
- xasprintf ("%.2fmm", 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);