diff options
author | Owen Taylor <otaylor@redhat.com> | 2002-02-21 17:14:10 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2002-02-21 17:14:10 +0000 |
commit | 708e1a95749ad61cb0167f729a77e951a30388cf (patch) | |
tree | 772eb9a2ff7cdfd6e94d79973a0a7645c9d41861 /gdk | |
parent | 3b94ae4be5e2efaae91446c365077e8f5f4ee90d (diff) | |
download | gtk+-708e1a95749ad61cb0167f729a77e951a30388cf.tar.gz |
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.
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/gdkkeys.h | 2 | ||||
-rw-r--r-- | gdk/linux-fb/gdkkeyboard-fb.c | 22 | ||||
-rw-r--r-- | gdk/win32/gdkkeys-win32.c | 10 | ||||
-rw-r--r-- | gdk/x11/gdkevents-x11.c | 2 | ||||
-rw-r--r-- | gdk/x11/gdkkeys-x11.c | 52 |
5 files changed, 53 insertions, 35 deletions
diff --git a/gdk/gdkkeys.h b/gdk/gdkkeys.h index e08af315f8..c884b964f3 100644 --- a/gdk/gdkkeys.h +++ b/gdk/gdkkeys.h @@ -88,7 +88,7 @@ gboolean gdk_keymap_translate_keyboard_state (GdkKeymap *keymap, guint *keyval, gint *effective_group, gint *level, - GdkModifierType *unused_modifiers); + GdkModifierType *consumed_modifiers); gboolean gdk_keymap_get_entries_for_keyval (GdkKeymap *keymap, guint keyval, GdkKeymapKey **keys, diff --git a/gdk/linux-fb/gdkkeyboard-fb.c b/gdk/linux-fb/gdkkeyboard-fb.c index 1f7d75dcbd..625d516c9c 100644 --- a/gdk/linux-fb/gdkkeyboard-fb.c +++ b/gdk/linux-fb/gdkkeyboard-fb.c @@ -61,7 +61,7 @@ struct _GdkFBKeyboardDevice { guint *keyval, gint *effective_group, gint *level, - GdkModifierType *unused_modifiers); + GdkModifierType *consumed_modifiers); gboolean (*get_entries_for_keyval) (GdkFBKeyboard *kb, guint keyval, GdkKeymapKey **keys, @@ -89,7 +89,7 @@ static gboolean xlate_translate (GdkFBKeyboard *kb, guint *keyval, gint *effective_group, gint *level, - GdkModifierType *unused_modifiers); + GdkModifierType *consumed_modifiers); static gboolean xlate_get_for_keyval (GdkFBKeyboard *kb, guint keyval, GdkKeymapKey **keys, @@ -111,7 +111,7 @@ static gboolean raw_translate (GdkFBKeyboard *kb, guint *keyval, gint *effective_group, gint *level, - GdkModifierType *unused_modifiers); + GdkModifierType *consumed_modifiers); static gboolean raw_get_for_keyval (GdkFBKeyboard *kb, guint keyval, GdkKeymapKey **keys, @@ -335,13 +335,13 @@ gdk_keymap_lookup_key (GdkKeymap *keymap, * @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 @@ -358,7 +358,7 @@ gdk_keymap_translate_keyboard_state (GdkKeymap *keymap, guint *keyval, gint *effective_group, gint *level, - GdkModifierType *unused_modifiers) + GdkModifierType *consumed_modifiers) { g_return_val_if_fail (keymap == NULL || GDK_IS_KEYMAP (keymap), FALSE); g_return_val_if_fail (group < 4, FALSE); @@ -370,7 +370,7 @@ gdk_keymap_translate_keyboard_state (GdkKeymap *keymap, keyval, effective_group, level, - unused_modifiers); + consumed_modifiers); } static void @@ -934,7 +934,7 @@ xlate_translate (GdkFBKeyboard *kb, guint *keyval, gint *effective_group, gint *level, - GdkModifierType *unused_modifiers) + GdkModifierType *consumed_modifiers) { g_warning ("xlate_translate() NIY"); return FALSE; @@ -1445,7 +1445,7 @@ raw_translate (GdkFBKeyboard *kb, guint *keyval, gint *effective_group, gint *level, - GdkModifierType *unused_modifiers) + GdkModifierType *consumed_modifiers) { g_warning ("raw_translate() NIY"); return FALSE; diff --git a/gdk/win32/gdkkeys-win32.c b/gdk/win32/gdkkeys-win32.c index 91f73770b3..b28bd7b22b 100644 --- a/gdk/win32/gdkkeys-win32.c +++ b/gdk/win32/gdkkeys-win32.c @@ -261,13 +261,13 @@ gdk_keymap_lookup_key (GdkKeymap *keymap, * @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 @@ -284,7 +284,7 @@ gdk_keymap_translate_keyboard_state (GdkKeymap *keymap, guint *keyval, gint *effective_group, gint *level, - GdkModifierType *unused_modifiers) + GdkModifierType *consumed_modifiers) { g_return_val_if_fail (keymap == NULL || GDK_IS_KEYMAP (keymap), FALSE); g_return_val_if_fail (group < 4, FALSE); diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c index d72b98b5c5..2c66046207 100644 --- a/gdk/x11/gdkevents-x11.c +++ b/gdk/x11/gdkevents-x11.c @@ -679,6 +679,8 @@ gdk_event_translate (GdkEvent *event, event->key.length = 0; event->key.string = NULL; + event->key.group = (xevent->xkey.state & KEYBOARD_GROUP_MASK) >> KEYBOARD_GROUP_SHIFT; + break; case ButtonPress: diff --git a/gdk/x11/gdkkeys-x11.c b/gdk/x11/gdkkeys-x11.c index 139ab9fb7f..e6eb7e125c 100644 --- a/gdk/x11/gdkkeys-x11.c +++ b/gdk/x11/gdkkeys-x11.c @@ -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; } |