]> Pileus Git - ~andy/gtk/commitdiff
scrolledwindow: make gtk_scrolled_window_add() smart
authorCosimo Cecchi <cosimoc@gnome.org>
Fri, 1 Feb 2013 16:03:44 +0000 (17:03 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 2 Feb 2013 03:58:53 +0000 (22:58 -0500)
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

gtk/gtkscrolledwindow.c
gtk/gtkviewport.c

index 230fab68420ed651ab59d9bfaf9aadfafc85964b..665c57049e97e413f422dc562e9715a8e909a8b6 100644 (file)
@@ -67,8 +67,8 @@
  * If a widget has native scrolling abilities, it can be added to the
  * #GtkScrolledWindow with gtk_container_add(). If a widget does not, you
  * must first add the widget to a #GtkViewport, then add the #GtkViewport
- * to the scrolled window. The convenience function
- * gtk_scrolled_window_add_with_viewport() does exactly this, so you can
+ * to the scrolled window. gtk_container_add() will do this for you for
+ * widgets that don't implement #GtkScrollable natively, so you can
  * ignore the presence of the viewport.
  *
  * The position of the scrollbars is controlled by the scroll
@@ -3032,7 +3032,7 @@ gtk_scrolled_window_add (GtkContainer *container,
   GtkScrolledWindowPrivate *priv;
   GtkScrolledWindow *scrolled_window;
   GtkBin *bin;
-  GtkWidget *child_widget;
+  GtkWidget *child_widget, *scrollable_child;
   GtkAdjustment *hadj, *vadj;
 
   bin = GTK_BIN (container);
@@ -3042,20 +3042,27 @@ gtk_scrolled_window_add (GtkContainer *container,
   scrolled_window = GTK_SCROLLED_WINDOW (container);
   priv = scrolled_window->priv;
 
+  if (GTK_IS_SCROLLABLE (child))
+    {
+      scrollable_child = child;
+    }
+  else
+    {
+      scrollable_child = gtk_viewport_new (NULL, NULL);
+      gtk_widget_show (scrollable_child);
+      gtk_container_add (GTK_CONTAINER (scrollable_child), child);
+    }
+
   if (gtk_widget_get_realized (GTK_WIDGET (bin)))
-    gtk_widget_set_parent_window (child, priv->overshoot_window);
+    gtk_widget_set_parent_window (scrollable_child, priv->overshoot_window);
 
-  _gtk_bin_set_child (bin, child);
-  gtk_widget_set_parent (child, GTK_WIDGET (bin));
+  _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));
   vadj = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar));
 
-  if (GTK_IS_SCROLLABLE (child))
-    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");
+  g_object_set (scrollable_child, "hadjustment", hadj, "vadjustment", vadj, NULL);
 }
 
 static void
index a80e811dcb44ad06e510cc33dfe31590f08e5461..e82d70baee0a1cd35b5454b29c7fc7ad02631154 100644 (file)
@@ -49,8 +49,9 @@
  * #GtkTreeView or #GtkIconView, it can be added to a #GtkScrolledWindow
  * 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.
- * The convenience function gtk_scrolled_window_add_with_viewport() does
- * exactly this, so you can ignore the presence of the viewport.
+ * gtk_container_add() does this automatically if a child that does not
+ * 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
  * than the child widget's minimum size in a given orientation.