diff options
Diffstat (limited to 'gtk/gtkscrolledwindow.c')
-rw-r--r-- | gtk/gtkscrolledwindow.c | 220 |
1 files changed, 125 insertions, 95 deletions
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index 9c6f1cc660..ad40c08bd7 100644 --- a/gtk/gtkscrolledwindow.c +++ b/gtk/gtkscrolledwindow.c @@ -2482,19 +2482,133 @@ gtk_scrolled_window_allocate_child (GtkScrolledWindow *swindow, } static void +gtk_scrolled_window_allocate_scrollbar (GtkScrolledWindow *scrolled_window, + GtkWidget *scrollbar, + GtkAllocation *allocation) +{ + GtkAllocation child_allocation, content_allocation; + GtkWidget *widget = GTK_WIDGET (scrolled_window); + gint sb_spacing, sb_height, sb_width; + gboolean scrollbars_within_bevel; + GtkScrolledWindowPrivate *priv; + GtkBorder padding, border; + GtkStyleContext *context; + GtkStateFlags state; + + priv = scrolled_window->priv; + + gtk_scrolled_window_allocate_child (scrolled_window, &content_allocation); + sb_spacing = _gtk_scrolled_window_get_scrollbar_spacing (scrolled_window); + gtk_widget_get_preferred_height (priv->hscrollbar, &sb_height, NULL); + gtk_widget_get_preferred_width (priv->vscrollbar, &sb_width, NULL); + + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + + gtk_style_context_save (context); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_FRAME); + gtk_widget_style_get (widget, "scrollbars-within-bevel", &scrollbars_within_bevel, NULL); + gtk_style_context_get_padding (context, state, &padding); + gtk_style_context_get_border (context, state, &border); + gtk_style_context_restore (context); + + if (scrollbar == priv->hscrollbar) + { + child_allocation.x = content_allocation.x; + + if (priv->window_placement == GTK_CORNER_TOP_LEFT || + priv->window_placement == GTK_CORNER_TOP_RIGHT) + { + if (priv->use_indicators) + child_allocation.y = content_allocation.y + content_allocation.height - sb_height; + else + child_allocation.y = content_allocation.y + content_allocation.height + sb_spacing; + } + else + { + if (priv->use_indicators) + child_allocation.y = content_allocation.y; + else + child_allocation.y = content_allocation.y - sb_spacing - sb_height; + } + + child_allocation.width = content_allocation.width; + child_allocation.height = sb_height; + + if (priv->shadow_type != GTK_SHADOW_NONE) + { + if (!scrollbars_within_bevel) + { + child_allocation.x -= padding.left + border.left; + child_allocation.width += padding.left + padding.right + border.left + border.right; + + if (priv->window_placement == GTK_CORNER_TOP_LEFT || + priv->window_placement == GTK_CORNER_TOP_RIGHT) + child_allocation.y += padding.bottom + border.bottom; + else + child_allocation.y -= padding.top + border.top; + } + } + } + else if (scrollbar == priv->vscrollbar) + { + if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL && + (priv->window_placement == GTK_CORNER_TOP_RIGHT || + priv->window_placement == GTK_CORNER_BOTTOM_RIGHT)) || + (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR && + (priv->window_placement == GTK_CORNER_TOP_LEFT || + priv->window_placement == GTK_CORNER_BOTTOM_LEFT))) + { + if (priv->use_indicators) + child_allocation.x = content_allocation.x + content_allocation.width - sb_width; + else + child_allocation.x = content_allocation.x + content_allocation.width + sb_spacing; + } + else + { + if (priv->use_indicators) + child_allocation.x = content_allocation.x; + else + child_allocation.x = content_allocation.x - sb_spacing - sb_width; + } + + child_allocation.y = content_allocation.y; + child_allocation.width = sb_width; + child_allocation.height = content_allocation.height; + + if (priv->shadow_type != GTK_SHADOW_NONE) + { + if (!scrollbars_within_bevel) + { + child_allocation.y -= padding.top + border.top; + child_allocation.height += padding.top + padding.bottom + border.top + border.bottom; + + if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL && + (priv->window_placement == GTK_CORNER_TOP_RIGHT || + priv->window_placement == GTK_CORNER_BOTTOM_RIGHT)) || + (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR && + (priv->window_placement == GTK_CORNER_TOP_LEFT || + priv->window_placement == GTK_CORNER_BOTTOM_LEFT))) + child_allocation.x += padding.right + border.right; + else + child_allocation.x -= padding.left + border.left; + } + } + } + + *allocation = child_allocation; +} + +static void gtk_scrolled_window_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkScrolledWindow *scrolled_window; GtkScrolledWindowPrivate *priv; - GtkStyleContext *context; - GtkStateFlags state; - GtkBorder padding, border; GtkBin *bin; GtkAllocation relative_allocation; GtkAllocation child_allocation; GtkWidget *child; - gboolean scrollbars_within_bevel; gint sb_spacing; gint sb_width; gint sb_height; @@ -2515,19 +2629,7 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget, gtk_widget_get_preferred_height (priv->hscrollbar, &sb_height, NULL); gtk_widget_get_preferred_width (priv->vscrollbar, &sb_width, NULL); - context = gtk_widget_get_style_context (widget); - 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_widget_style_get (widget, "scrollbars-within-bevel", &scrollbars_within_bevel, NULL); - gtk_widget_set_allocation (widget, allocation); - gtk_style_context_restore (context); if (priv->hscrollbar_policy == GTK_POLICY_ALWAYS) priv->hscrollbar_visible = TRUE; @@ -2742,41 +2844,9 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget, gtk_widget_set_child_visible (priv->hscrollbar, priv->hscrollbar_visible); if (priv->hscrollbar_visible) { - child_allocation.x = relative_allocation.x; - if (priv->window_placement == GTK_CORNER_TOP_LEFT || - priv->window_placement == GTK_CORNER_TOP_RIGHT) - { - if (priv->use_indicators) - child_allocation.y = relative_allocation.y + relative_allocation.height - sb_height; - else - child_allocation.y = relative_allocation.y + relative_allocation.height + sb_spacing; - } - else - { - if (priv->use_indicators) - child_allocation.y = relative_allocation.y; - else - child_allocation.y = relative_allocation.y - sb_spacing - sb_height; - } - - child_allocation.width = relative_allocation.width; - child_allocation.height = sb_height; - - if (priv->shadow_type != GTK_SHADOW_NONE) - { - if (!scrollbars_within_bevel) - { - child_allocation.x -= padding.left + border.left; - child_allocation.width += padding.left + padding.right + border.left + border.right; - - if (priv->window_placement == GTK_CORNER_TOP_LEFT || - priv->window_placement == GTK_CORNER_TOP_RIGHT) - child_allocation.y += padding.bottom + border.bottom; - else - child_allocation.y -= padding.top + border.top; - } - } - + gtk_scrolled_window_allocate_scrollbar (scrolled_window, + priv->hscrollbar, + &child_allocation); if (priv->use_indicators) { gdk_window_move_resize (priv->hindicator.window, @@ -2793,49 +2863,9 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget, gtk_widget_set_child_visible (priv->vscrollbar, priv->vscrollbar_visible); if (priv->vscrollbar_visible) { - if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL && - (priv->window_placement == GTK_CORNER_TOP_RIGHT || - priv->window_placement == GTK_CORNER_BOTTOM_RIGHT)) || - (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR && - (priv->window_placement == GTK_CORNER_TOP_LEFT || - priv->window_placement == GTK_CORNER_BOTTOM_LEFT))) - { - if (priv->use_indicators) - child_allocation.x = relative_allocation.x + relative_allocation.width - sb_width; - else - child_allocation.x = relative_allocation.x + relative_allocation.width + sb_spacing; - } - else - { - if (priv->use_indicators) - child_allocation.x = relative_allocation.x; - else - child_allocation.x = relative_allocation.x - sb_spacing - sb_width; - } - - child_allocation.y = relative_allocation.y; - child_allocation.width = sb_width; - child_allocation.height = relative_allocation.height; - - if (priv->shadow_type != GTK_SHADOW_NONE) - { - if (!scrollbars_within_bevel) - { - child_allocation.y -= padding.top + border.top; - child_allocation.height += padding.top + padding.bottom + border.top + border.bottom; - - if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL && - (priv->window_placement == GTK_CORNER_TOP_RIGHT || - priv->window_placement == GTK_CORNER_BOTTOM_RIGHT)) || - (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR && - (priv->window_placement == GTK_CORNER_TOP_LEFT || - priv->window_placement == GTK_CORNER_BOTTOM_LEFT))) - child_allocation.x += padding.right + border.right; - else - child_allocation.x -= padding.left + border.left; - } - } - + gtk_scrolled_window_allocate_scrollbar (scrolled_window, + priv->vscrollbar, + &child_allocation); if (priv->use_indicators) { gdk_window_move_resize (priv->vindicator.window, @@ -3707,7 +3737,7 @@ create_indicator_window (GtkScrolledWindow *scrolled_window, GdkWindowAttr attributes; gint attributes_mask; - gtk_widget_get_allocation (child, &allocation); + gtk_scrolled_window_allocate_scrollbar (scrolled_window, child, &allocation); attributes.window_type = GDK_WINDOW_CHILD; attributes.wclass = GDK_INPUT_OUTPUT; |