the section
called Realizing, Mapping, and Showing in the
chapter called GTK+ Basics goes into some
detail on this. But here is a brief summary.
Showing a widget implies mapping it eventually (to be
precise, it schedules the widget to be mapped when its
parent widgets are mapped). Mapping a widget means
calling gdk_window_show() to
display the widget's
GdkWindow on the screen (if it has a GdkWindow, some widgets
don't). To map a widget you must first realize it.
Therefore showing a widget implies realizing it.
Therefore if you show a widget you don't need to
explicitly realize it with
gtk_widget_realize() because it will be realized
eventually anyway.
There's one exception, however. To realize a widget means to allocate X
server resources for it, most notably a GdkWindow. Some things you might
want to do require the
GdkWindow to exist, so you might want to force a
widget to be realized immediately. gtk_widget_realize() does this. Since
parent widgets must be realized before their children,
gtk_widget_realize() will
immediately realize all of a widget's parents as well.
One of these parents must be a toplevel window, or
realization will not be possible.
If you force-realize a widget, you still have to call
gtk_widget_show() since
realization does not map the widget.
A good but not foolproof rule of thumb: if you are
using
GTK_WIDGET(widget)->window, you will need
widget to be realized.
However, it should be noted that force-realizing a
widget is always a mildly bad idea; it is inefficient
and uncomfortably low-level. In many cases you can work
around the need to do so.