X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fui%2Fgui%2Fpsppire-output-view.c;h=a7367ed76a9d85723d195e2ce98b21035c57463b;hb=5539849055ad928f536d192561cbbaab3b926180;hp=dd5aadb9a0dd6c10c2b0ba197c3d2390ebe36250;hpb=5c6e86d036ccb49f6487f8a10cb4586cb4fc4c23;p=pspp diff --git a/src/ui/gui/psppire-output-view.c b/src/ui/gui/psppire-output-view.c index dd5aadb9a0..a7367ed76a 100644 --- a/src/ui/gui/psppire-output-view.c +++ b/src/ui/gui/psppire-output-view.c @@ -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,12 +206,13 @@ 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; @@ -209,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 (); @@ -219,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;