+
+static void
+update_adjustment (GtkAdjustment *adj, PsppireAxis *axis, gint page_size)
+{
+ double position =
+ (adj->value + adj->page_size)
+ /
+ (adj->upper - adj->lower);
+
+ const glong last_item = psppire_axis_unit_count (axis) - 1;
+
+ if (isnan (position) || position < 0)
+ position = 0;
+
+ adj->upper =
+ psppire_axis_pixel_start (axis, last_item)
+ +
+ psppire_axis_unit_size (axis, last_item)
+ ;
+
+ adj->lower = 0;
+ adj->page_size = page_size;
+
+ adj->value = position * (adj->upper - adj->lower) - adj->page_size;
+
+ if ( adj->value < adj->lower)
+ adj->value = adj->lower;
+
+ gtk_adjustment_changed (adj);
+}
+
+