scrolledwindow: make gtk_scrolled_window_add() smart

There's really no reason why we shouldn't automatically create a
GtkViewport when the widget added to GtkScrolledWindow is not a
GtkScrollable, instead of just printing a g_warning.
Copy the viewport special case into the scrolled window implementation
of gtk_container_add().

https://bugzilla.gnome.org/show_bug.cgi?id=693015
This commit is contained in:
Cosimo Cecchi 2013-02-01 17:03:44 +01:00 committed by Matthias Clasen
parent 5f41eb74a5
commit 9efa28591c
2 changed files with 22 additions and 14 deletions

View File

@ -67,8 +67,8 @@
* If a widget has native scrolling abilities, it can be added to the * If a widget has native scrolling abilities, it can be added to the
* #GtkScrolledWindow with gtk_container_add(). If a widget does not, you * #GtkScrolledWindow with gtk_container_add(). If a widget does not, you
* must first add the widget to a #GtkViewport, then add the #GtkViewport * must first add the widget to a #GtkViewport, then add the #GtkViewport
* to the scrolled window. The convenience function * to the scrolled window. gtk_container_add() will do this for you for
* gtk_scrolled_window_add_with_viewport() does exactly this, so you can * widgets that don't implement #GtkScrollable natively, so you can
* ignore the presence of the viewport. * ignore the presence of the viewport.
* *
* The position of the scrollbars is controlled by the scroll * The position of the scrollbars is controlled by the scroll
@ -3032,7 +3032,7 @@ gtk_scrolled_window_add (GtkContainer *container,
GtkScrolledWindowPrivate *priv; GtkScrolledWindowPrivate *priv;
GtkScrolledWindow *scrolled_window; GtkScrolledWindow *scrolled_window;
GtkBin *bin; GtkBin *bin;
GtkWidget *child_widget; GtkWidget *child_widget, *scrollable_child;
GtkAdjustment *hadj, *vadj; GtkAdjustment *hadj, *vadj;
bin = GTK_BIN (container); bin = GTK_BIN (container);
@ -3042,20 +3042,27 @@ gtk_scrolled_window_add (GtkContainer *container,
scrolled_window = GTK_SCROLLED_WINDOW (container); scrolled_window = GTK_SCROLLED_WINDOW (container);
priv = scrolled_window->priv; priv = scrolled_window->priv;
if (gtk_widget_get_realized (GTK_WIDGET (bin))) if (GTK_IS_SCROLLABLE (child))
gtk_widget_set_parent_window (child, priv->overshoot_window); {
scrollable_child = child;
}
else
{
scrollable_child = gtk_viewport_new (NULL, NULL);
gtk_widget_show (scrollable_child);
gtk_container_add (GTK_CONTAINER (scrollable_child), child);
}
_gtk_bin_set_child (bin, child); if (gtk_widget_get_realized (GTK_WIDGET (bin)))
gtk_widget_set_parent (child, GTK_WIDGET (bin)); gtk_widget_set_parent_window (scrollable_child, priv->overshoot_window);
_gtk_bin_set_child (bin, scrollable_child);
gtk_widget_set_parent (scrollable_child, GTK_WIDGET (bin));
hadj = gtk_range_get_adjustment (GTK_RANGE (priv->hscrollbar)); hadj = gtk_range_get_adjustment (GTK_RANGE (priv->hscrollbar));
vadj = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)); vadj = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar));
if (GTK_IS_SCROLLABLE (child)) g_object_set (scrollable_child, "hadjustment", hadj, "vadjustment", vadj, NULL);
g_object_set (child, "hadjustment", hadj, "vadjustment", vadj, NULL);
else
g_warning ("gtk_scrolled_window_add(): cannot add non scrollable widget "
"use gtk_scrolled_window_add_with_viewport() instead");
} }
static void static void

View File

@ -49,8 +49,9 @@
* #GtkTreeView or #GtkIconView, it can be added to a #GtkScrolledWindow * #GtkTreeView or #GtkIconView, it can be added to a #GtkScrolledWindow
* with gtk_container_add(). If a widget does not, you must first add the * with gtk_container_add(). If a widget does not, you must first add the
* widget to a #GtkViewport, then add the viewport to the scrolled window. * widget to a #GtkViewport, then add the viewport to the scrolled window.
* The convenience function gtk_scrolled_window_add_with_viewport() does * gtk_container_add() does this automatically if a child that does not
* exactly this, so you can ignore the presence of the viewport. * implement #GtkScrollable is added to a #GtkScrolledWindow, so you can
* ignore the presence of the viewport.
* *
* The #GtkViewport will start scrolling content only if allocated less * The #GtkViewport will start scrolling content only if allocated less
* than the child widget's minimum size in a given orientation. * than the child widget's minimum size in a given orientation.