Module: wine Branch: master Commit: 89bdf03989ba10db0c9cfb6218fe3a2859359fb3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=89bdf03989ba10db0c9cfb6218...
Author: Ken Thomases ken@codeweavers.com Date: Fri Nov 17 14:47:16 2006 -0600
winex11.drv: Enable code for picking layout-independent vkey as second pass.
---
dlls/winex11.drv/keyboard.c | 63 ++++++++++++++++++++++++++++--------------- 1 files changed, 41 insertions(+), 22 deletions(-)
diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c index dc355a5..bca2c21 100644 --- a/dlls/winex11.drv/keyboard.c +++ b/dlls/winex11.drv/keyboard.c @@ -1673,9 +1673,18 @@ void X11DRV_InitKeyboard(void) vkey_used[(vkey & 0xff)] = 1; } /* for */
-#if 0 /* this breaks VK_OEM_x VKeys in some layout tables by inserting - * a VK code into a not appropriate place. - */ +#define VKEY_IF_NOT_USED(vkey) (vkey_used[(vkey)] ? 0 : (vkey_used[(vkey)] = 1, (vkey))) + for (keyc = min_keycode; keyc <= max_keycode; keyc++) + { + vkey = keyc2vkey[keyc] & 0xff; + if (vkey) + continue; + + e2.keycode = (KeyCode)keyc; + keysym = XLookupKeysym(&e2, 0); + if (!keysym) + continue; + /* find a suitable layout-dependent VK code */ /* (most Winelib apps ought to be able to work without layout tables!) */ for (i = 0; (i < keysyms_per_keycode) && (!vkey); i++) @@ -1683,7 +1692,7 @@ void X11DRV_InitKeyboard(void) keysym = XLookupKeysym(&e2, i); if ((keysym >= XK_0 && keysym <= XK_9) || (keysym >= XK_A && keysym <= XK_Z)) { - vkey = keysym; + vkey = VKEY_IF_NOT_USED(keysym); } }
@@ -1692,17 +1701,17 @@ void X11DRV_InitKeyboard(void) keysym = XLookupKeysym(&e2, i); switch (keysym) { - case ';': vkey = VK_OEM_1; break; - case '/': vkey = VK_OEM_2; break; - case '`': vkey = VK_OEM_3; break; - case '[': vkey = VK_OEM_4; break; - case '\': vkey = VK_OEM_5; break; - case ']': vkey = VK_OEM_6; break; - case ''': vkey = VK_OEM_7; break; - case ',': vkey = VK_OEM_COMMA; break; - case '.': vkey = VK_OEM_PERIOD; break; - case '-': vkey = VK_OEM_MINUS; break; - case '+': vkey = VK_OEM_PLUS; break; + case ';': vkey = VKEY_IF_NOT_USED(VK_OEM_1); break; + case '/': vkey = VKEY_IF_NOT_USED(VK_OEM_2); break; + case '`': vkey = VKEY_IF_NOT_USED(VK_OEM_3); break; + case '[': vkey = VKEY_IF_NOT_USED(VK_OEM_4); break; + case '\': vkey = VKEY_IF_NOT_USED(VK_OEM_5); break; + case ']': vkey = VKEY_IF_NOT_USED(VK_OEM_6); break; + case ''': vkey = VKEY_IF_NOT_USED(VK_OEM_7); break; + case ',': vkey = VKEY_IF_NOT_USED(VK_OEM_COMMA); break; + case '.': vkey = VKEY_IF_NOT_USED(VK_OEM_PERIOD); break; + case '-': vkey = VKEY_IF_NOT_USED(VK_OEM_MINUS); break; + case '+': vkey = VKEY_IF_NOT_USED(VK_OEM_PLUS); break; } }
@@ -1710,14 +1719,17 @@ void X11DRV_InitKeyboard(void) { /* 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]) */ - switch (++OEMvkey) + do { - case 0xc1 : OEMvkey=0xdb; break; - case 0xe5 : OEMvkey=0xe9; break; - case 0xf6 : OEMvkey=0xf5; WARN("No more OEM vkey available!\n"); - } + switch (++OEMvkey) + { + case 0xc1 : OEMvkey=0xdb; break; + case 0xe5 : OEMvkey=0xe9; break; + case 0xf6 : OEMvkey=0xf5; WARN("No more OEM vkey available!\n"); + } + } while (OEMvkey < 0xf5 && vkey_used[OEMvkey]);
- vkey = OEMvkey; + vkey = VKEY_IF_NOT_USED(OEMvkey);
if (TRACE_ON(keyboard)) { @@ -1737,7 +1749,14 @@ void X11DRV_InitKeyboard(void) TRACE(")\n"); } } -#endif + + if (vkey) + { + TRACE("keycode %04x => vkey %04x\n", e2.keycode, vkey); + keyc2vkey[e2.keycode] = vkey; + } + } /* for */ +#undef VKEY_IF_NOT_USED
/* If some keys still lack scancodes, assign some arbitrary ones to them now */ for (scan = 0x60, keyc = min_keycode; keyc <= max_keycode; keyc++)