Merge master into gtk3.
[pspp] / src / ui / gui / psppire-output-window.c
index c59930ccef007ec0c9666b282fc3bd265357cb52..e4f6c6ec95de0c2d83e68799b3b21899fbdb4cce 100644 (file)
@@ -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
@@ -38,7 +38,6 @@
 #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"
@@ -163,12 +162,10 @@ psppire_output_cast (struct output_driver *driver)
 static void on_dwgarea_realize (GtkWidget *widget, gpointer data);
 
 static gboolean
-expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
+draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data)
 {
   PsppireOutputWindow *viewer = PSPPIRE_OUTPUT_WINDOW (data);
   struct xr_rendering *r = g_object_get_data (G_OBJECT (widget), "rendering");
-  cairo_t *cr = gdk_cairo_create (widget->window);
-
   const GtkStyle *style = gtk_widget_get_style (GTK_WIDGET (viewer));
 
   PangoFontDescription *font_desc;
@@ -195,14 +192,12 @@ expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
   pango_font_description_free (font_desc);
 
   xr_rendering_apply_options (r, &viewer->render_opts);
-
-  xr_rendering_draw (r, cr, event->area.x, event->area.y,
-                     event->area.width, event->area.height);
-  cairo_destroy (cr);
+  xr_rendering_draw_all (r, cr);
 
   return TRUE;
 }
 
+
 static void
 psppire_output_submit (struct output_driver *this,
                        const struct output_item *item)
@@ -246,7 +241,7 @@ psppire_output_submit (struct output_driver *this,
         return;
     }
 
-  cr = gdk_cairo_create (GTK_WIDGET (pod->viewer)->window);
+  cr = gdk_cairo_create (gtk_widget_get_window (GTK_WIDGET (pod->viewer)));
   if (pod->xr == NULL)
     {
       const GtkStyle *style = gtk_widget_get_style (GTK_WIDGET (viewer));
@@ -309,8 +304,8 @@ psppire_output_submit (struct output_driver *this,
   g_signal_connect (drawing_area, "realize",
                      G_CALLBACK (on_dwgarea_realize), pod->viewer);
 
-  g_signal_connect (drawing_area, "expose_event",
-                     G_CALLBACK (expose_event_callback), pod->viewer);
+  g_signal_connect (drawing_area, "draw",
+                     G_CALLBACK (draw_callback), pod->viewer);
 
   gtk_widget_set_size_request (drawing_area, tw, th);
   gtk_layout_put (pod->viewer->output, drawing_area, 0, pod->viewer->y);
@@ -454,8 +449,8 @@ on_row_activate (GtkTreeView *overview,
   g_value_unset (&value);
 
   vadj = gtk_layout_get_vadjustment (window->output);
-  min = vadj->lower;
-  max = vadj->upper - vadj->page_size;
+  min = gtk_adjustment_get_lower (vadj);
+  max = gtk_adjustment_get_upper (vadj) - gtk_adjustment_get_page_size (vadj);
   if (y < min)
     y = min;
   else if (y > max)
@@ -653,14 +648,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 +669,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);
@@ -757,7 +765,7 @@ clipboard_get_cb (GtkClipboard     *clipboard,
   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);
@@ -820,7 +828,7 @@ clipboard_get_cb (GtkClipboard     *clipboard,
 
   if ( g_file_get_contents (filename, &text, &length, NULL) )
     {
-      gtk_selection_data_set (selection_data, selection_data->target,
+      gtk_selection_data_set (selection_data, gtk_selection_data_get_target (selection_data),
                              8,
                              (const guchar *) text, length);
     }
@@ -1009,11 +1017,14 @@ psppire_output_window_init (PsppireOutputWindow *window)
                    NULL);
 
   {
+    GtkWidget *w;
     GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (xml, "uimanager1", GTK_TYPE_UI_MANAGER));
     merge_help_menu (uim);
 
+    w = gtk_ui_manager_get_widget (uim,"/ui/menubar/windows_menuitem/windows_minimise-all");
+
     PSPPIRE_WINDOW (window)->menu =
-      GTK_MENU_SHELL (gtk_ui_manager_get_widget (uim,"/ui/menubar/windows_menuitem/windows_minimise-all")->parent);
+      GTK_MENU_SHELL (gtk_widget_get_parent (w));
   }
 
   g_signal_connect_swapped (get_action_assert (xml, "file_export"), "activate",