psppire-window: Avoid doubled separator in Windows menu.
[pspp] / src / ui / gui / psppire-output-window.c
index d1d7e89166154b849352028d9858ab1a5ab4267b..c59930ccef007ec0c9666b282fc3bd265357cb52 100644 (file)
@@ -57,8 +57,6 @@ enum
     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);
 
@@ -75,8 +73,8 @@ psppire_output_window_get_type (void)
       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,
@@ -112,6 +110,10 @@ psppire_output_window_dispose (GObject *obj)
   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);
@@ -134,24 +136,10 @@ psppire_output_window_class_init (PsppireOutputWindowClass *class)
   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. */
 
@@ -975,6 +963,8 @@ psppire_output_window_init (PsppireOutputWindow *window)
 
   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"));
 
@@ -1051,6 +1041,26 @@ psppire_output_window_new (void)
 }
 
 \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)
 {
@@ -1082,8 +1092,7 @@ 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);
 }
@@ -1150,7 +1159,7 @@ draw_page (GtkPrintOperation *operation,
           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++]);
@@ -1168,9 +1177,9 @@ psppire_output_window_print (PsppireOutputWindow *window)
     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);
@@ -1180,7 +1189,6 @@ psppire_output_window_print (PsppireOutputWindow *window)
       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);