From 852da86aa670c46ada66da733e7b9cac1ebeb291 Mon Sep 17 00:00:00 2001
From: Ben Pfaff <blp@cs.stanford.edu>
Date: Sat, 18 Oct 2014 10:38:53 -0700
Subject: [PATCH] psppire-output-view: Properly render the first few items of
 output.

Commit 18f9e37c8bc5 (psppire-output-view: Only render output items once the
window is realized.) fixed a crashing bug, but when I tested it I didn't
carefully look at the output.  In fact, any output items that were rendered
before the window was realized were not displayed, because the widgets
created for them were never shown or properly initialized.  This commit
fixes the problem.

Reported by Adam Zammit.
Bug #43362.
---
 src/ui/gui/psppire-output-view.c | 54 +++++++++++++++++++-------------
 1 file changed, 33 insertions(+), 21 deletions(-)

diff --git a/src/ui/gui/psppire-output-view.c b/src/ui/gui/psppire-output-view.c
index 3f254d7b63..6e9858c576 100644
--- a/src/ui/gui/psppire-output-view.c
+++ b/src/ui/gui/psppire-output-view.c
@@ -188,6 +188,25 @@ create_xr (struct psppire_output_view *view)
   cairo_destroy (cr);
 }
 
+static void
+create_drawing_area (struct psppire_output_view *view,
+                     GtkWidget *drawing_area, struct xr_rendering *r,
+                     int tw, int th)
+{
+  g_object_set_data_full (G_OBJECT (drawing_area),
+                          "rendering", r, free_rendering);
+
+  g_signal_connect (drawing_area, "realize",
+                    G_CALLBACK (on_dwgarea_realize), view);
+  g_signal_connect (drawing_area, "expose_event",
+                    G_CALLBACK (expose_event_callback), view);
+
+  gtk_widget_set_size_request (drawing_area, tw, th);
+  gtk_layout_put (view->output, drawing_area, 0, view->y);
+
+  gtk_widget_show (drawing_area);
+}
+
 static void
 rerender (struct psppire_output_view *view)
 {
@@ -209,7 +228,6 @@ rerender (struct psppire_output_view *view)
     {
       struct xr_rendering *r;
       int tw, th;
-      bool new;
 
       if (view->y > 0)
         view->y += view->font_height / 2;
@@ -223,17 +241,18 @@ rerender (struct psppire_output_view *view)
 
       xr_rendering_measure (r, &tw, &th);
 
-      new = !item->drawing_area;
-      if (new)
-        item->drawing_area = gtk_drawing_area_new ();
-      g_object_set_data_full (G_OBJECT (item->drawing_area),
-                              "rendering", r, free_rendering);
-
-      gtk_widget_set_size_request (item->drawing_area, tw, th);
-      if (new)
-        gtk_layout_put (view->output, item->drawing_area, 0, view->y);
+      if (!item->drawing_area)
+        {
+          item->drawing_area = gtk_drawing_area_new ();
+          create_drawing_area (view, item->drawing_area, r, tw, th);
+        }
       else
-        gtk_layout_move (view->output, item->drawing_area, 0, view->y);
+        {
+          g_object_set_data_full (G_OBJECT (item->drawing_area),
+                                  "rendering", r, free_rendering);
+          gtk_widget_set_size_request (item->drawing_area, tw, th);
+          gtk_layout_move (view->output, item->drawing_area, 0, view->y);
+        }
 
       if (view->max_width < tw)
         view->max_width = tw;
@@ -297,17 +316,10 @@ psppire_output_view_put (struct psppire_output_view *view,
 
       xr_rendering_measure (r, &tw, &th);
 
-      g_object_set_data_full (G_OBJECT (drawing_area), "rendering", r, free_rendering);
-      g_signal_connect (drawing_area, "realize",
-                        G_CALLBACK (on_dwgarea_realize), view);
-      g_signal_connect (drawing_area, "expose_event",
-                        G_CALLBACK (expose_event_callback), view);
-
-      gtk_widget_set_size_request (drawing_area, tw, th);
-      gtk_layout_put (view->output, drawing_area, 0, view->y);
-
-      gtk_widget_show (drawing_area);
+      create_drawing_area (view, drawing_area, r, tw, th);
     }
+  else
+    tw = th = 0;
 
   if (view->overview
       && (!is_text_item (item)
-- 
2.30.2