summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2002-02-21 17:14:10 +0000
committerOwen Taylor <otaylor@src.gnome.org>2002-02-21 17:14:10 +0000
commit708e1a95749ad61cb0167f729a77e951a30388cf (patch)
tree772eb9a2ff7cdfd6e94d79973a0a7645c9d41861 /gdk
parent3b94ae4be5e2efaae91446c365077e8f5f4ee90d (diff)
downloadgtk+-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.h2
-rw-r--r--gdk/linux-fb/gdkkeyboard-fb.c22
-rw-r--r--gdk/win32/gdkkeys-win32.c10
-rw-r--r--gdk/x11/gdkevents-x11.c2
-rw-r--r--gdk/x11/gdkkeys-x11.c52
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;
}