psppire-output-view: Properly render the first few items of output.
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 18 Oct 2014 17:38:53 +0000 (10:38 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Sat, 18 Oct 2014 17:39:21 +0000 (10:39 -0700)
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

index 3f254d7b63fb3e4b4b84496d604cd6df2dbc54fc..6e9858c576180c8c2a3d6b93e593dc95a4d38d09 100644 (file)
@@ -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)