+ /* Enable this to help with debugging. It shows you which widgets are being
+ put where. */
+ if (0)
+ {
+ GdkRGBA green = {0, 1, 0, 1};
+ gtk_widget_override_background_color (GTK_WIDGET (view->output),
+ GTK_STATE_NORMAL, &green);
+ GdkRGBA red = {1, 0, 0, 1};
+ gtk_widget_override_background_color (drawing_area, GTK_STATE_NORMAL, &red);
+ }
+
+ g_object_set_data_full (G_OBJECT (drawing_area),
+ "rendering", r, free_rendering);
+
+ g_signal_connect (drawing_area, "draw",
+ G_CALLBACK (draw_callback), view);
+
+ gtk_widget_set_size_request (drawing_area, tw, th);
+ gint xpos = get_xpos (view, tw);
+
+ gtk_layout_put (view->output, drawing_area, xpos, view->y);
+
+ gtk_widget_show (drawing_area);
+}
+
+static void
+rerender (struct psppire_output_view *view)
+{
+ struct output_view_item *item;
+ GdkWindow *gdkw = gtk_widget_get_window (GTK_WIDGET (view->output));
+ cairo_t *cr;
+
+ if (!view->n_items || ! gdkw)
+ return;
+
+ cr = gdk_cairo_create (gdkw);
+ if (view->xr == NULL)
+ create_xr (view);
+ view->y = 0;
+ view->max_width = 0;
+ for (item = view->items; item < &view->items[view->n_items]; item++)
+ {
+ struct xr_rendering *r;
+ GtkAllocation alloc;
+ int tw, th;
+
+ if (view->y > 0)
+ view->y += view->font_height / 2;
+
+ r = xr_rendering_create (view->xr, item->item, cr);
+ if (r == NULL)
+ {
+ g_warn_if_reached ();
+ continue;
+ }
+
+ xr_rendering_measure (r, &tw, &th);
+
+ gint xpos = get_xpos (view, tw);
+
+ if (!item->drawing_area)
+ {
+ item->drawing_area = gtk_drawing_area_new ();
+ create_drawing_area (view, item->drawing_area, r, tw, th);
+ }
+ else
+ {
+ 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, xpos, view->y);
+ }
+
+ alloc.x = xpos;
+ alloc.y = view->y;
+ alloc.width = tw;
+ alloc.height = th;
+ gtk_widget_size_allocate(item->drawing_area,&alloc);
+
+ if (view->max_width < tw)
+ view->max_width = tw;
+ view->y += th;
+ }
+
+ gtk_layout_set_size (view->output, view->max_width, view->y);
+ cairo_destroy (cr);