From 58156740f914ebbcee1d54ac6dae872241dcdd11 Mon Sep 17 00:00:00 2001 From: Ken Thomases Date: Mon, 26 Oct 2009 22:29:26 -0500 Subject: [PATCH] winex11: Use a table of available OEM virtual key codes. Restore availability of vkeys prior to VK_OEM_8. That's safe now that OEM vkeys are assigned in a separate loop after standard OEM vkey assignments have been made. --- dlls/winex11.drv/keyboard.c | 46 +++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c index 97d4be62885..63d8f5551d6 100644 --- a/dlls/winex11.drv/keyboard.c +++ b/dlls/winex11.drv/keyboard.c @@ -1683,11 +1683,21 @@ void X11DRV_InitKeyboard( Display *display ) KeySym keysym; KeyCode *kcp; XKeyEvent e2; - WORD scan, vkey, OEMvkey; + WORD scan, vkey; int keyc, i, keyn, syms; char ckey[4]={0,0,0,0}; const char (*lkey)[MAIN_LEN][4]; char vkey_used[256] = { 0 }; + static const struct { + WORD first, last; + } vkey_ranges[] = { + { VK_OEM_1, VK_OEM_3 }, + { VK_OEM_4, VK_ICO_00 }, + { 0xe6, 0xe6 }, + { 0xe9, 0xf5 }, + { 0, 0 } + }; + int vkey_range; set_kbd_layout_preload_key(); @@ -1861,8 +1871,9 @@ void X11DRV_InitKeyboard( Display *display ) } /* for */ /* Others keys: let's assign OEM virtual key codes in the allowed range, - * that is ([0xba,0xc0], [0xdb,0xe4], 0xe6 (given up) et [0xe9,0xf5]) */ - OEMvkey = VK_OEM_8; /* next is available. */ + * that is ([0xba,0xc0], [0xdb,0xe4], 0xe6, and [0xe9,0xf5]) */ + vkey_range = 0; + vkey = vkey_ranges[vkey_range].first; for (keyc = min_keycode; keyc <= max_keycode; keyc++) { if (keyc2vkey[keyc] & 0xff) @@ -1873,22 +1884,27 @@ void X11DRV_InitKeyboard( Display *display ) if (!keysym) continue; - do + while (vkey && vkey_used[vkey]) { - switch (++OEMvkey) + if (vkey == vkey_ranges[vkey_range].last) { - case 0xc1 : OEMvkey=0xdb; break; - case 0xe5 : OEMvkey=0xe9; break; - case 0xf6 : OEMvkey=0xf5; WARN("No more OEM vkey available!\n"); + vkey_range++; + vkey = vkey_ranges[vkey_range].first; } - } while (OEMvkey < 0xf5 && vkey_used[OEMvkey]); + else + vkey++; + } - vkey = VKEY_IF_NOT_USED(OEMvkey); + if (!vkey) + { + WARN("No more vkeys available!\n"); + break; + } if (TRACE_ON(keyboard)) { TRACE("OEM specific virtual key %X assigned to keycode %X:\n", - OEMvkey, e2.keycode); + vkey, e2.keycode); TRACE("("); for (i = 0; i < keysyms_per_keycode; i += 1) { @@ -1903,11 +1919,9 @@ void X11DRV_InitKeyboard( Display *display ) TRACE(")\n"); } - if (vkey) - { - TRACE("keycode %04x => vkey %04x\n", e2.keycode, vkey); - keyc2vkey[e2.keycode] = vkey; - } + TRACE("keycode %04x => vkey %04x\n", e2.keycode, vkey); + keyc2vkey[e2.keycode] = vkey; + vkey_used[vkey] = 1; } /* for */ #undef VKEY_IF_NOT_USED -- 2.11.4.GIT