summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2004-06-25 15:21:43 +0000
committerBastien Nocera <hadess@src.gnome.org>2004-06-25 15:21:43 +0000
commit8b6934bc2c6140df9094a582a4e5cbeb4f889d20 (patch)
treeeca5f1230ff9278fc2c0fa58565f6f2ddc17ab58 /gdk
parent1e052c424f2aa688ea33f609dff594aced4c2fd7 (diff)
downloadgtk+-8b6934bc2c6140df9094a582a4e5cbeb4f889d20.tar.gz
reviewed by: Matthias Clasen <maclas@gmx.de>
2004-06-25 Bastien Nocera <hadess@hadess.net> reviewed by: Matthias Clasen <maclas@gmx.de> * gdk/x11/gdkkeys-x11.c: (get_symbol), (update_keymaps), (gdk_keymap_lookup_key), (translate_keysym): fix keys parsing when the number of keysyms per keycode is odd. Fixes #144808.
Diffstat (limited to 'gdk')
-rw-r--r--gdk/x11/gdkkeys-x11.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/gdk/x11/gdkkeys-x11.c b/gdk/x11/gdkkeys-x11.c
index 282e60df2f..694477a5ef 100644
--- a/gdk/x11/gdkkeys-x11.c
+++ b/gdk/x11/gdkkeys-x11.c
@@ -206,12 +206,26 @@ gdk_keymap_get_for_display (GdkDisplay *display)
}
/* Find the index of the group/level pair within the keysyms for a key.
+ * We round up the number of keysyms per keycode to the next even number,
+ * otherwise we lose a whole group of keys
*/
#define KEYSYM_INDEX(keymap_impl, group, level) \
- (2 * ((group) % (keymap_impl->keysyms_per_keycode / 2)) + (level))
+ (2 * ((group) % (int)((keymap_impl->keysyms_per_keycode + 1) / 2)) + (level))
#define KEYSYM_IS_KEYPAD(s) (((s) >= 0xff80 && (s) <= 0xffbd) || \
((s) >= 0x11000000 && (s) <= 0x1100ffff))
+static int
+get_symbol (const KeySym *syms, GdkKeymapX11 *keymap_x11, int group, int level)
+{
+ int index;
+
+ index = KEYSYM_INDEX(keymap_x11, group, level);
+ if (index > keymap_x11->keysyms_per_keycode)
+ return NoSymbol;
+
+ return syms[index];
+}
+
static void
update_keymaps (GdkKeymapX11 *keymap_x11)
{
@@ -256,7 +270,7 @@ update_keymaps (GdkKeymapX11 *keymap_x11)
/* Check both groups */
for (i = 0 ; i < 2 ; i++)
{
- if (syms[KEYSYM_INDEX (keymap_x11, i, 0)] == GDK_Tab)
+ if (get_symbol (syms, keymap_x11, i, 0) == GDK_Tab)
syms[KEYSYM_INDEX (keymap_x11, i, 1)] = GDK_ISO_Left_Tab;
}
@@ -264,12 +278,12 @@ update_keymaps (GdkKeymapX11 *keymap_x11)
* If there is one keysym and the key symbol has upper and lower
* case variants fudge the keymap
*/
- if (syms[KEYSYM_INDEX (keymap_x11, 0, 1)] == 0)
+ if (get_symbol (syms, keymap_x11, 0, 1) == 0)
{
guint lower;
guint upper;
- gdk_keyval_convert_case (syms[KEYSYM_INDEX (keymap_x11, 0, 0)], &lower, &upper);
+ gdk_keyval_convert_case (get_symbol (syms, keymap_x11, 0, 0), &lower, &upper);
if (lower != upper)
{
syms[KEYSYM_INDEX (keymap_x11, 0, 0)] = lower;
@@ -845,7 +859,7 @@ gdk_keymap_lookup_key (GdkKeymap *keymap,
{
const KeySym *map = get_keymap (keymap_x11);
const KeySym *syms = map + (key->keycode - keymap_x11->min_keycode) * keymap_x11->keysyms_per_keycode;
- return syms [KEYSYM_INDEX (keymap_x11, key->group, key->level)];
+ return get_symbol (syms, keymap_x11, key->group, key->level);
}
}
@@ -995,7 +1009,7 @@ translate_keysym (GdkKeymapX11 *keymap_x11,
const KeySym *map = get_keymap (keymap_x11);
const KeySym *syms = map + (hardware_keycode - keymap_x11->min_keycode) * keymap_x11->keysyms_per_keycode;
-#define SYM(k,g,l) syms[KEYSYM_INDEX (k,g,l)]
+#define SYM(k,g,l) get_symbol (syms, k,g,l)
GdkModifierType shift_modifiers;
gint shift_level;