Expose events are received when a previously-obscured
region of a window becomes visible. GdkWindow contents are not recorded;
that is, if you draw to a
GdkWindow, then the X server places another window
on top of it, the graphics in the bottom window will be
lost. When the top window is moved away, the bottom
window will receive an expose event indicating the region
that needs to be re-drawn. Expose events are also sent
when a window first appears on-screen. (Incidentally, you
should not draw into a
GdkWindow until you receive the first expose
event. The first expose event is your signal that the
window is actually on-screen.)
Expose events have a unique feature: GTK+ synthesizes
them for windowless widgets. This is the only kind of
event GTK_NO_WINDOW
widgets will receive.
Expose events are very simple:
typedef struct _GdkEventExpose GdkEventExpose;
struct _GdkEventExpose
{
GdkEventType type;
GdkWindow *window;
gint8 send_event;
GdkRectangle area;
gint count;
};
|
area is the area that has
been exposed and should be redrawn. count is the number of expose events
that follow this one; conceivably you might want to
compress successive events into a single redraw. However,
GDK already makes a reasonable effort to do this, so
adding another pass is unlikely to gain much. GdkRectangle is defined as
follows:
typedef struct _GdkRectangle GdkRectangle;
struct _GdkRectangle
{
gint16 x;
gint16 y;
guint16 width;
guint16 height;
};
|
There is one other time you will receive expose events.
If you call
gdk_window_copy_area() to copy part of one window
into another, the source window region may be partially
or completely obscured. If it is, X will be unable to
copy something sensible from the obscured region. By
default, expose events will be generated for the areas of
the destination window X was
unable to copy something to. Your program's standard
redraw routine can then refresh these areas of the
destination window by hand. You can turn this behavior
off by calling
gdk_gc_set_exposures() on the
graphics context passed to
gdk_window_copy_area(). (Graphics contexts are
discussed in the section called
Graphics Contexts.)
If the source window region is
not obscured,
gdk_window_copy_area() can successfully draw the
entire destination region. In this case, no expose events
are generated; a single "no expose" event is generated
instead. This event contains no information beyond the
standard event fields:
typedef struct _GdkEventNoExpose GdkEventNoExpose;
struct _GdkEventNoExpose
{
GdkEventType type;
GdkWindow *window;
gint8 send_event;
};
|