+
+static void
+gtk_viewport_get_preferred_size (GtkWidget *widget,
+ GtkOrientation orientation,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ GtkViewport *viewport = GTK_VIEWPORT (widget);
+ GtkViewportPrivate *priv = viewport->priv;
+ GtkStyleContext *context;
+ GtkStateFlags state;
+ GtkBorder padding, border;
+ GtkWidget *child;
+ gint child_min, child_nat;
+ gint minimum, natural;
+
+ child = gtk_bin_get_child (GTK_BIN (widget));
+
+ /* XXX This should probably be (border_width * 2); but GTK+ has
+ * been doing this with a single border for a while now...
+ */
+ minimum = gtk_container_get_border_width (GTK_CONTAINER (widget));
+
+ context = gtk_widget_get_style_context (GTK_WIDGET (widget));
+ state = gtk_widget_get_state_flags (GTK_WIDGET (widget));
+ gtk_style_context_get_padding (context, state, &padding);
+
+ if (priv->shadow_type != GTK_SHADOW_NONE)
+ {
+ gtk_style_context_get_border (context, state, &border);
+
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ minimum += border.left + border.right;
+ else
+ minimum += border.top + border.bottom;
+ }
+
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ minimum += padding.left + padding.right;
+ else
+ minimum += padding.top + padding.bottom;
+
+ natural = minimum;
+
+ if (child && gtk_widget_get_visible (child))
+ {
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ gtk_widget_get_preferred_width (child, &child_min, &child_nat);
+ else
+ gtk_widget_get_preferred_height (child, &child_min, &child_nat);
+
+ minimum += child_min;
+ natural += child_nat;
+ }
+
+ if (minimum_size)
+ *minimum_size = minimum;
+
+ if (natural_size)
+ *natural_size = natural;
+}
+
+static void
+gtk_viewport_get_preferred_width (GtkWidget *widget,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ gtk_viewport_get_preferred_size (widget, GTK_ORIENTATION_HORIZONTAL, minimum_size, natural_size);
+}
+
+static void
+gtk_viewport_get_preferred_height (GtkWidget *widget,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ gtk_viewport_get_preferred_size (widget, GTK_ORIENTATION_VERTICAL, minimum_size, natural_size);
+}