[6/7] winex11.drv: Enable code for picking layout-independent vkey
as second pass.
Ken Thomases
ken at codeweavers.com
Fri Nov 17 14:47:16 CST 2006
Don't reassign already used vkeys. That was the source of the problems with
this code in the past, which is why it was disabled.
---
dlls/winex11.drv/keyboard.c | 63
++++++++++++++++++++++++++++---------------
1 files changed, 41 insertions(+), 22 deletions(-)
-------------- next part --------------
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 @@ #endif
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 @@ #if 0 /* this breaks VK_OEM_x VKeys in s
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 @@ #if 0 /* this breaks VK_OEM_x VKeys in s
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 @@ #if 0 /* this breaks VK_OEM_x VKeys in s
{
/* 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 @@ #if 0 /* this breaks VK_OEM_x VKeys in s
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++)
More information about the wine-patches
mailing list