From 852da86aa670c46ada66da733e7b9cac1ebeb291 Mon Sep 17 00:00:00 2001 From: Ben Pfaff 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