X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-output-view.c;h=a7367ed76a9d85723d195e2ce98b21035c57463b;hb=1c492427c0c4e03065f4a327549a6d31b9e693a8;hp=93e9e2f6e0a5232289b390ac7e2a13a718225b3f;hpb=230829329be6a772f2380a0ee54c5258b09cc811;p=pspp diff --git a/src/ui/gui/psppire-output-view.c b/src/ui/gui/psppire-output-view.c index 93e9e2f6e0..a7367ed76a 100644 --- a/src/ui/gui/psppire-output-view.c +++ b/src/ui/gui/psppire-output-view.c @@ -54,7 +54,7 @@ struct psppire_output_view GtkLayout *output; int render_width; int max_width; - int y; + glong y; struct string_map render_opts; GtkTreeView *overview; @@ -160,11 +160,34 @@ create_xr (struct psppire_output_view *view) cairo_destroy (cr); } +/* Return the horizontal position to place a widget whose + width is CHILD_WIDTH */ +static gint +get_xpos (const struct psppire_output_view *view, gint child_width) +{ + GdkWindow *gdkw = gtk_widget_get_window (GTK_WIDGET (view->output)); + guint w = gdk_window_get_width (gdkw); + int gutter = 0; + g_object_get (view->output, "border-width", &gutter, NULL); + return (gtk_widget_get_direction (GTK_WIDGET (view->output)) == GTK_TEXT_DIR_RTL) ? w - child_width - gutter: gutter; +} + static void create_drawing_area (struct psppire_output_view *view, GtkWidget *drawing_area, struct xr_rendering *r, int tw, int th) { + /* 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); @@ -172,7 +195,9 @@ create_drawing_area (struct psppire_output_view *view, G_CALLBACK (draw_callback), view); gtk_widget_set_size_request (drawing_area, tw, th); - gtk_layout_put (view->output, drawing_area, 0, view->y); + gint xpos = get_xpos (view, tw); + + gtk_layout_put (view->output, drawing_area, xpos, view->y); gtk_widget_show (drawing_area); } @@ -181,13 +206,15 @@ 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 || !gtk_widget_get_window (GTK_WIDGET (view->output))) + if (!view->n_items || ! gdkw) return; - cr = gdk_cairo_create (gtk_widget_get_window (GTK_WIDGET (view->output))); - + 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++) @@ -208,6 +235,8 @@ rerender (struct psppire_output_view *view) xr_rendering_measure (r, &tw, &th); + gint xpos = get_xpos (view, tw); + if (!item->drawing_area) { item->drawing_area = gtk_drawing_area_new (); @@ -218,10 +247,10 @@ rerender (struct psppire_output_view *view) 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); + gtk_layout_move (view->output, item->drawing_area, xpos, view->y); } - alloc.x = 0; + alloc.x = xpos; alloc.y = view->y; alloc.width = tw; alloc.height = th; @@ -344,7 +373,7 @@ psppire_output_view_put (struct psppire_output_view *view, gtk_tree_store_set (store, &iter, COL_NAME, ds_cstr (&name), COL_ADDR, item, - COL_Y, (glong)(view->y), + COL_Y, (view->y), -1); ds_destroy (&name);