/* PSPPIRE - a graphical user interface for PSPP.
- Copyright (C) 2008, 2009, 2010, 2011, 2012 Free Software Foundation
+ Copyright (C) 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include "ui/gui/builder-wrapper.h"
#include "ui/gui/psppire-output-window.h"
-#include "gl/error.h"
#include "gl/tmpdir.h"
#include "gl/xalloc.h"
#include "gl/c-xvasprintf.h"
if ( response == GTK_RESPONSE_ACCEPT )
{
- int file_type = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));
- char *filename = gtk_file_chooser_get_filename (chooser);
+ gint file_type = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));
+ gchar *filename = gtk_file_chooser_get_filename (chooser);
struct string_map options;
g_return_if_fail (filename);
if (file_type == FT_AUTO)
{
+ /* If the "Infer file type from extension" option was chosen,
+ search for the respective type in the list.
+ (It's a O(n) search, but fortunately n is small). */
gint i;
for (i = 1 ; i < N_EXTENSIONS ; ++i)
{
}
}
}
-
+ else if (! g_str_has_suffix (filename, ft[file_type].ext))
+ {
+ /* If an explicit document format was chosen, and if the chosen
+ filename does not already have that particular "extension",
+ then append it.
+ */
+
+ gchar *of = filename;
+ filename = g_strconcat (filename, ft[file_type].ext, NULL);
+ g_free (of);
+ }
string_map_init (&options);
string_map_insert (&options, "output-file", filename);
if (path_search (dirname, sizeof dirname, NULL, NULL, true)
|| mkdtemp (dirname) == NULL)
{
- error (0, errno, _("failed to create temporary directory"));
+ msg_error (errno, _("failed to create temporary directory during clipboard operation"));
return;
}
filename = xasprintf ("%s/clip.tmp", dirname);
}
\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++]);