Chapter 9. Adjustments

GTK has various widgets that can be visually adjusted by the user
using the mouse or the keyboard, such as the range widgets, described
in the Range Widgets
section. There are also a few widgets that display some adjustable
portion of a larger area of data, such as the text widget and the
viewport widget.

Obviously, an application needs to be able to react to changes the
user makes in range widgets. One way to do this would be to have each
widget emit its own type of signal when its adjustment changes, and
either pass the new value to the signal handler, or require it to look
inside the widget's data structure in order to ascertain the value.
But you may also want to connect the adjustments of several widgets
together, so that adjusting one adjusts the others. The most obvious
example of this is connecting a scrollbar to a panning viewport or a
scrolling text area. If each widget has its own way of setting or
getting the adjustment value, then the programmer may have to write
their own signal handlers to translate between the output of one
widget's signal and the "input" of another's adjustment setting
function.

GTK solves this problem using the Adjustment object, which is not a
widget but a way for widgets to store and pass adjustment information
in an abstract and flexible form. The most obvious use of Adjustment
is to store the configuration parameters and values of range widgets,
such as scrollbars and scale controls. However, since Adjustments are
derived from Object, they have some special powers beyond those of
normal data structures. Most importantly, they can emit signals, just
like widgets, and these signals can be used not only to allow your
program to react to user input on adjustable widgets, but also to
propagate adjustment values transparently between adjustable widgets.

The value argument is the initial value you
want to give to the adjustment, usually corresponding to the topmost
or leftmost position of an adjustable widget. The
lower argument specifies the lowest value which the
adjustment can hold. The step_increment argument
specifies the "smaller" of the two increments by which the user can
change the value, while the page_increment is the
"larger" one. The page_size argument usually
corresponds somehow to the visible area of a panning widget. The
upper argument is used to represent the bottom most
or right most coordinate in a panning widget's child. Therefore it is
not always the largest number that
value can take, since the
page_size of such widgets is usually
non-zero.