From 14e63a7370602119f86dbe86a431b4e361bbf103 Mon Sep 17 00:00:00 2001 From: Cosimo Cecchi Date: Sat, 10 Mar 2012 11:43:53 -0500 Subject: [PATCH] scrolledwindow: take into account border/padding for junction When the scrolled window has a frame (and the scrollbar is within the bevel), we should take into account the CSS border/padding of the frame and offset the scrollbars junction rendering with it. --- gtk/gtkscrolledwindow.c | 42 +++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index 3ebc02a0f..71a68c246 100644 --- a/gtk/gtkscrolledwindow.c +++ b/gtk/gtkscrolledwindow.c @@ -1433,18 +1433,45 @@ gtk_scrolled_window_draw_scrollbars_junction (GtkScrolledWindow *scrolled_window cairo_t *cr) { GtkScrolledWindowPrivate *priv = scrolled_window->priv; + GtkWidget *widget = GTK_WIDGET (scrolled_window); GtkAllocation wid_allocation, hscr_allocation, vscr_allocation; GtkStyleContext *context; GdkRectangle junction_rect; - gboolean is_rtl; + gboolean is_rtl, scrollbars_within_bevel; - is_rtl = gtk_widget_get_direction (GTK_WIDGET (scrolled_window)) == GTK_TEXT_DIR_RTL; - gtk_widget_get_allocation (GTK_WIDGET (scrolled_window), &wid_allocation); + is_rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL; + gtk_widget_get_allocation (widget, &wid_allocation); gtk_widget_get_allocation (GTK_WIDGET (priv->hscrollbar), &hscr_allocation); gtk_widget_get_allocation (GTK_WIDGET (priv->vscrollbar), &vscr_allocation); - junction_rect.x = 0; - junction_rect.y = 0; + gtk_widget_style_get (widget, + "scrollbars-within-bevel", &scrollbars_within_bevel, + NULL); + context = gtk_widget_get_style_context (widget); + + if (scrollbars_within_bevel && + priv->shadow_type != GTK_SHADOW_NONE) + { + GtkStateFlags state; + GtkBorder padding, border; + + state = gtk_widget_get_state_flags (widget); + + gtk_style_context_save (context); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_FRAME); + gtk_style_context_get_padding (context, state, &padding); + gtk_style_context_get_border (context, state, &border); + gtk_style_context_restore (context); + + junction_rect.x = padding.left + border.left; + junction_rect.y = padding.top + border.top; + } + else + { + junction_rect.x = 0; + junction_rect.y = 0; + } + junction_rect.width = vscr_allocation.width; junction_rect.height = hscr_allocation.height; @@ -1454,13 +1481,12 @@ gtk_scrolled_window_draw_scrollbars_junction (GtkScrolledWindow *scrolled_window (!is_rtl && (priv->real_window_placement == GTK_CORNER_TOP_LEFT || priv->real_window_placement == GTK_CORNER_BOTTOM_LEFT))) - junction_rect.x = hscr_allocation.width; + junction_rect.x += hscr_allocation.width; if (priv->real_window_placement == GTK_CORNER_TOP_LEFT || priv->real_window_placement == GTK_CORNER_TOP_RIGHT) - junction_rect.y = vscr_allocation.height; + junction_rect.y += vscr_allocation.height; - context = gtk_widget_get_style_context (GTK_WIDGET (scrolled_window)); gtk_style_context_save (context); gtk_style_context_add_class (context, GTK_STYLE_CLASS_SCROLLBARS_JUNCTION); -- 2.43.2