Gimp handles all this with its own special code, which you most
definitely don't want to try to replicate.
There are several ways to handle this. Basically the thing you have
to know is that widget drawing happens in response to "expose" events,
and what you need to accomplish is to make the large widget ignore
exposures that fall within the area of the small widget. When a
container, such as GtkFixed, is called upon to handle an expose event,
it generates synthetic expose events for each of its children that
overlap the exposed area. You will need to replace the "expose
handler" for the large widget with a custom-written one that does what
you require it to. If you are custom-drawing the large widget, this
should be pretty easy -- you just have to avoid doing any drawing in
the part that lies within the small widget.
I expect you will find this explanation pretty confusing -- the main
thing I am trying to do here is to point you toward "expose" events as
the thing you need to read about.
Gimp-developer mailing list