- GtkLayoutPrivate *priv = layout->priv;
- gboolean need_adjust = FALSE;
-
- if (hadj)
- g_return_if_fail (GTK_IS_ADJUSTMENT (hadj));
- else if (priv->hadjustment)
- hadj = new_default_adjustment ();
- if (vadj)
- g_return_if_fail (GTK_IS_ADJUSTMENT (vadj));
- else if (priv->vadjustment)
- vadj = new_default_adjustment ();
-
- if (priv->hadjustment && (priv->hadjustment != hadj))
- {
- g_signal_handlers_disconnect_by_func (priv->hadjustment,
- gtk_layout_adjustment_changed,
- layout);
- g_object_unref (priv->hadjustment);
- }
-
- if (priv->vadjustment && (priv->vadjustment != vadj))
- {
- g_signal_handlers_disconnect_by_func (priv->vadjustment,
- gtk_layout_adjustment_changed,
- layout);
- g_object_unref (priv->vadjustment);
- }
-
- if (priv->hadjustment != hadj)
- {
- priv->hadjustment = hadj;
- g_object_ref_sink (priv->hadjustment);
- gtk_layout_set_adjustment_upper (priv->hadjustment, priv->width, FALSE);
-
- g_signal_connect (priv->hadjustment, "value-changed",
- G_CALLBACK (gtk_layout_adjustment_changed),
- layout);
- need_adjust = TRUE;
- }
-
- if (priv->vadjustment != vadj)
- {
- priv->vadjustment = vadj;
- g_object_ref_sink (priv->vadjustment);
- gtk_layout_set_adjustment_upper (priv->vadjustment, priv->height, FALSE);
-
- g_signal_connect (priv->vadjustment, "value-changed",
- G_CALLBACK (gtk_layout_adjustment_changed),
- layout);
- need_adjust = TRUE;
- }
-
- /* vadj or hadj can be NULL while constructing; don't emit a signal
- then */
- if (need_adjust && vadj && hadj)
- gtk_layout_adjustment_changed (NULL, layout);
+ GtkAllocation allocation;
+ GtkAdjustment *adj = layout->priv->vadjustment;
+ gdouble old_value;
+ gdouble new_value;
+ gdouble new_upper;
+
+ gtk_widget_get_allocation (GTK_WIDGET (layout), &allocation);
+
+ old_value = gtk_adjustment_get_value (adj);
+ new_upper = MAX (allocation.height, layout->priv->height);
+
+ g_object_set (adj,
+ "lower", 0.0,
+ "upper", new_upper,
+ "page-size", (gdouble)allocation.height,
+ "step-increment", allocation.height * 0.1,
+ "page-increment", allocation.height * 0.9,
+ NULL);
+
+ new_value = CLAMP (old_value, 0, new_upper - allocation.height);
+ if (new_value != old_value)
+ gtk_adjustment_set_value (adj, new_value);