Implement "fuzzy" key binding lookups; allow matches on key and level but
Wed Feb 20 14:26:47 2002 Owen Taylor <otaylor@redhat.com> * gtk/gtkkeyhash.[ch]: Implement "fuzzy" key binding lookups; allow matches on key and level but not group. Also, implement ignoring "consumed modifiers correctly." * gtk/gtkaccelgroup.c gtk/gtkbindings.c: Convert to using GtkKeyHash. * gtk/gtkdebug.h gtk/gtkmain.c: Support GTK_DEBUG=keybindings * gdk/x11/gdkevents-x11.c (gdk_event_translate): Fill in the group for key release events as well as key press events. * gdk/gdkkeys.h gdk/x11/gdkkeys-x11.c (gdk_keymap_translate_keyboard_state): Rename unused_modifiers to consumed_modifiers, make the docs and non-Xkb implementation match the Xkb implementation. * gdk/linux-fb/gdkkeyboard-fb.c gdk/win32/gdkkeys-win32.c: Propagate doc and parameter name changes. * gdk/x11/gdkkeys-x11.c (gdk_keymap_translate_keyboard_state): XkbTranslateKeyCode doesn't handle LockMask, we need to handle it ourselves. * gdk/x11/gdkkeys-x11.c (gdk_keymap_translate_keyboard_state): Force <Shift>Tab to give GDK_ISO_Left_Tab, since we need consistency to allow dealing with ISO_Left_Tab. * gtk/gtkwindow.c gtk/gtktextview.c gtk/gtkscrolledwindow.c gtk/gtkpaned.c gtk/gtkcombo.c gtk/gtknotebook.c: Remove inappropriate uses of GDK_ISO_Left_Tab. (GDK_ISO_Left_Tab or <Shift>Tab both are equivalent as a binding specifier.) * gtk/gtkbutton.c (gtk_button_class_init): Make ::activate GTK_RUN_ACTION, so you can bind an accelerator to it. * gtk/gtklabel.c (gtk_label_set_uline_text_internal): Call gdk_unicode_to_keyval on the mnemonic character. * tests/testgtk.c: Add a test for the new fuzzy key binding matching.
This commit is contained in:
@ -735,13 +735,13 @@ MyEnhancedXkbTranslateKeyCode(register XkbDescPtr xkb,
|
||||
* @keyval: return location for keyval
|
||||
* @effective_group: return location for effective group
|
||||
* @level: return location for level
|
||||
* @unused_modifiers: return location for modifiers that didn't affect the group or level
|
||||
* @consumed_modifiers: return location for modifiers that were used to determine the group or level
|
||||
*
|
||||
*
|
||||
* Translates the contents of a #GdkEventKey into a keyval, effective
|
||||
* group, and level. Modifiers that didn't affect the translation and
|
||||
* are thus available for application use are returned in
|
||||
* @unused_modifiers. See gdk_keyval_get_keys() for an explanation of
|
||||
* group, and level. Modifiers that affected the translation and
|
||||
* are thus unavailable for application use are returned in
|
||||
* @consumed_modifiers. See gdk_keyval_get_keys() for an explanation of
|
||||
* groups and levels. The @effective_group is the group that was
|
||||
* actually used for the translation; some keys such as Enter are not
|
||||
* affected by the active keyboard group. The @level is derived from
|
||||
@ -758,9 +758,10 @@ gdk_keymap_translate_keyboard_state (GdkKeymap *keymap,
|
||||
guint *keyval,
|
||||
gint *effective_group,
|
||||
gint *level,
|
||||
GdkModifierType *unused_modifiers)
|
||||
GdkModifierType *consumed_modifiers)
|
||||
{
|
||||
KeySym tmp_keyval = NoSymbol;
|
||||
guint tmp_modifiers;
|
||||
|
||||
g_return_val_if_fail (keymap == NULL || GDK_IS_KEYMAP (keymap), FALSE);
|
||||
g_return_val_if_fail (group < 4, FALSE);
|
||||
@ -771,8 +772,8 @@ gdk_keymap_translate_keyboard_state (GdkKeymap *keymap,
|
||||
*effective_group = 0;
|
||||
if (level)
|
||||
*level = 0;
|
||||
if (unused_modifiers)
|
||||
*unused_modifiers = state;
|
||||
if (consumed_modifiers)
|
||||
*consumed_modifiers = 0;
|
||||
|
||||
update_keyrange ();
|
||||
|
||||
@ -792,13 +793,18 @@ gdk_keymap_translate_keyboard_state (GdkKeymap *keymap,
|
||||
MyEnhancedXkbTranslateKeyCode (xkb,
|
||||
hardware_keycode,
|
||||
state,
|
||||
unused_modifiers,
|
||||
&tmp_modifiers,
|
||||
&tmp_keyval,
|
||||
effective_group,
|
||||
level);
|
||||
|
||||
if (keyval)
|
||||
*keyval = tmp_keyval;
|
||||
if (state & ~tmp_modifiers & LockMask)
|
||||
tmp_keyval = gdk_keyval_to_upper (tmp_keyval);
|
||||
|
||||
/* We need to augment the consumed modifiers with LockMask, since
|
||||
* we handle that ourselves, and also with the group bits
|
||||
*/
|
||||
tmp_modifiers |= LockMask | 1 << 13 | 1 << 14;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
@ -819,14 +825,7 @@ gdk_keymap_translate_keyboard_state (GdkKeymap *keymap,
|
||||
tmp_keyval = XKeycodeToKeysym (gdk_display, hardware_keycode,
|
||||
group * keysyms_per_keycode + shift_level);
|
||||
|
||||
if (keyval)
|
||||
*keyval = tmp_keyval;
|
||||
|
||||
if (unused_modifiers)
|
||||
{
|
||||
*unused_modifiers = state;
|
||||
*unused_modifiers &= ~(GDK_SHIFT_MASK | GDK_LOCK_MASK | group_switch_mask);
|
||||
}
|
||||
tmp_modifiers = GDK_SHIFT_MASK | GDK_LOCK_MASK | group_switch_mask;
|
||||
|
||||
if (effective_group)
|
||||
*effective_group = (state & group_switch_mask) ? 1 : 0;
|
||||
@ -835,6 +834,23 @@ gdk_keymap_translate_keyboard_state (GdkKeymap *keymap,
|
||||
*level = shift_level;
|
||||
}
|
||||
|
||||
/* GDK_ISO_Left_Tab, as usually configured through XKB, really messes
|
||||
* up the whole idea of "consumed modifiers" because shift is consumed.
|
||||
* However, <shift>Tab is not _consistently_ GDK_ISO_Left_Tab, so people
|
||||
* can't bind to GDK_ISO_Left_Tab instead. So, we force consistency here.
|
||||
*/
|
||||
if (tmp_keyval == GDK_Tab && (tmp_modifiers & GDK_SHIFT_MASK == 0))
|
||||
{
|
||||
tmp_keyval = GDK_ISO_Left_Tab;
|
||||
tmp_modifiers |= GDK_SHIFT_MASK;
|
||||
}
|
||||
|
||||
if (consumed_modifiers)
|
||||
*consumed_modifiers = tmp_modifiers;
|
||||
|
||||
if (keyval)
|
||||
*keyval = tmp_keyval;
|
||||
|
||||
return tmp_keyval != NoSymbol;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user