- gboolean need_adjust = FALSE;
-
- g_return_if_fail (GTK_IS_LAYOUT (layout));
-
- if (hadj)
- g_return_if_fail (GTK_IS_ADJUSTMENT (hadj));
- else if (layout->hadjustment)
- hadj = new_default_adjustment ();
- if (vadj)
- g_return_if_fail (GTK_IS_ADJUSTMENT (vadj));
- else if (layout->vadjustment)
- vadj = new_default_adjustment ();
-
- if (layout->hadjustment && (layout->hadjustment != hadj))
- {
- g_signal_handlers_disconnect_by_func (layout->hadjustment,
- gtk_layout_adjustment_changed,
- layout);
- g_object_unref (layout->hadjustment);
- }
-
- if (layout->vadjustment && (layout->vadjustment != vadj))
- {
- g_signal_handlers_disconnect_by_func (layout->vadjustment,
- gtk_layout_adjustment_changed,
- layout);
- g_object_unref (layout->vadjustment);
- }
-
- if (layout->hadjustment != hadj)
- {
- layout->hadjustment = hadj;
- g_object_ref_sink (layout->hadjustment);
- gtk_layout_set_adjustment_upper (layout->hadjustment, layout->width, FALSE);
-
- g_signal_connect (layout->hadjustment, "value-changed",
- G_CALLBACK (gtk_layout_adjustment_changed),
- layout);
- need_adjust = TRUE;
- }
-
- if (layout->vadjustment != vadj)
- {
- layout->vadjustment = vadj;
- g_object_ref_sink (layout->vadjustment);
- gtk_layout_set_adjustment_upper (layout->vadjustment, layout->height, FALSE);
-
- g_signal_connect (layout->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);