The previous section explained the difference between
GTK+'s concept of keyboard focus and the X/GDK concept.
This makes focus events a little bit confusing. There is
only one type of focus event,
GDK_FOCUS_CHANGE, which is received whenever a
window gains or loses the keyboard focus. As we just
said, only toplevel GtkWindow
widgets ever gain or lose the focus from GDK's point of
view; so this event may not seem useful. However, each
GtkWindow maintains a current
"focus widget" and forwards key events to that widget. It
also synthesizes GDK-style focus events as the focus
widget changes. Thus, even though GDK-style focus is not
being used, widgets receive events in the same way they
would if it were being used. There are subtle
differences: for example, widgets receive focus events
whether or not their
GdkWindow's event mask includes GDK_FOCUS_CHANGE_MASK. Only toplevel
widgets need to specify this mask.
Focus events themselves are very simple. When a widget
gains the keyboard focus, it receives a focus event with
its in member set to
TRUE (a "focus in event")
and when a widget loses the focus it receives a focus
event with the in member
set to FALSE (a "focus
out event"). Otherwise, focus events contain only the
three standard fields from
GdkEventAny:
typedef struct _GdkEventFocus GdkEventFocus;
struct _GdkEventFocus
{
GdkEventType type;
GdkWindow *window;
gint8 send_event;
gint16 in;
};
|