GTK+ Reference Manual |
---|
Why.
With
gtk_accelerator_get_default_mod_mask()
you can test for modifier keys reliably; this way your key
event handlers will work correctly even if
NumLock or CapsLock are
activated.
In a GdkEventKey, the
state
field is a bit mask which
indicates the modifier state at the time the key was pressed.
Modifiers are keys like Control and
NumLock. When implementing a GtkWidget::key_press_event
handler, you should use gtk_accelerator_get_default_mod_mask()
to
test against modifier keys. This function returns a bit mask
which encompasses all the modifiers which the user may be
actively pressing, such as Control,
Shift, and Alt, but ignores
"inocuous" modifiers such as NumLock and
CapsLock.
Say you want to see if
Control-F10
was pressed. Doing a simple test like
event->keysym == GDK_F10 &&
event->state == GDK_CONTROL_MASK
is not
enough. If CapsLock is pressed, then
event->state
will be equal to
GDK_CONTROL_MASK | GDK_LOCK_MASK
, and the
simple test will fail. By taking the logical-and of
event->state
and
gtk_accelerator_get_default_mod_mask()
, you
can ignore the modifiers which are not actively pressed by the
user at the same time as the base key.
The following example correctly tests for Control-F10 being pressed.
static gboolean my_widget_key_press_event_handler (GtkWidget *widget, GdkEventKey *event) { guint modifiers; modifiers = gtk_accelerator_get_default_mod_mask (); if (event->keysym == GDK_F10 && (event->state & modifiers) == GDK_CONTROL_MASK) { g_print ("Control-F10 was pressed\n"); return TRUE; } return FALSE; }