From 8b6934bc2c6140df9094a582a4e5cbeb4f889d20 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Fri, 25 Jun 2004 15:21:43 +0000 Subject: [PATCH] reviewed by: Matthias Clasen 2004-06-25 Bastien Nocera reviewed by: Matthias Clasen * 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. --- ChangeLog | 8 ++++++++ ChangeLog.pre-2-10 | 8 ++++++++ ChangeLog.pre-2-6 | 8 ++++++++ ChangeLog.pre-2-8 | 8 ++++++++ gdk/x11/gdkkeys-x11.c | 26 ++++++++++++++++++++------ 5 files changed, 52 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index f0281b67c..3cdce4401 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2004-06-25 Bastien Nocera + + reviewed by: Matthias Clasen + + * 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. + 2004-06-25 Matthias Clasen * gtk/gtkfontbutton.c (gtk_font_button_update_font_info): Avoid diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index f0281b67c..3cdce4401 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,11 @@ +2004-06-25 Bastien Nocera + + reviewed by: Matthias Clasen + + * 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. + 2004-06-25 Matthias Clasen * gtk/gtkfontbutton.c (gtk_font_button_update_font_info): Avoid diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index f0281b67c..3cdce4401 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,11 @@ +2004-06-25 Bastien Nocera + + reviewed by: Matthias Clasen + + * 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. + 2004-06-25 Matthias Clasen * gtk/gtkfontbutton.c (gtk_font_button_update_font_info): Avoid diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index f0281b67c..3cdce4401 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,11 @@ +2004-06-25 Bastien Nocera + + reviewed by: Matthias Clasen + + * 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. + 2004-06-25 Matthias Clasen * gtk/gtkfontbutton.c (gtk_font_button_update_font_info): Avoid diff --git a/gdk/x11/gdkkeys-x11.c b/gdk/x11/gdkkeys-x11.c index 282e60df2..694477a5e 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; -- 2.43.2