Let's focus on the client programs for a moment. Imagine you
wanted to write a client program from scratch, using only the
facilities provided by X. You'd quickly find that Xlib is pretty
spartan, and that doing things like putting buttons on screen, text,
or nice controls (scrollbars, radio boxes) for the users, is terribly
complicated.

Luckily, someone else went to the trouble of programming these
controls and giving them to us in a usable form; a library. These
controls are usually known as "widgets" and of course, the library is
a "widget library". Then I just have to call a function from this
library with some parameters and have a button on-screen. Examples of
widgets include menus, buttons, radio buttons, scrollbars, and
canvases.

A "canvas" is an interesting kind of widget, because it's
basically a sub-area within the client where i can draw
stuff. Understandably, since I shouldn't use Xlib directly, because
that would interfere with the widget library, the library itself gives
a way to draw arbitrary graphics within the canvas widget.

Since the widget library is the one actually drawing the
elements on-screen, as well as interpreting user's actions into input,
the library used is largely responsible for each client's aspect and
behavior. From a developer's point of view, a widget library also has
a certain API (set of functions), and that might define which widget
library i'll want to use.