X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-output-window.c;h=4bad5b5efbaa6079ed348b2dc1e88c25f6c13429;hb=858cab0d05698bc5033b678a5865839ee5d73091;hp=fcdc90aeeb4d57f5968992bb2fb3b9b4ced4eea9;hpb=91a737144f000af0c61b429ee58dddda2bb50466;p=pspp diff --git a/src/ui/gui/psppire-output-window.c b/src/ui/gui/psppire-output-window.c index fcdc90aeeb..4bad5b5efb 100644 --- a/src/ui/gui/psppire-output-window.c +++ b/src/ui/gui/psppire-output-window.c @@ -1,5 +1,5 @@ /* 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 @@ -653,14 +653,17 @@ psppire_output_window_export (PsppireOutputWindow *window) 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) { @@ -671,7 +674,17 @@ psppire_output_window_export (PsppireOutputWindow *window) } } } - + 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); @@ -1041,6 +1054,26 @@ psppire_output_window_new (void) } + +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) { @@ -1072,8 +1105,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); } @@ -1140,7 +1172,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++]);