winex11.drv: Enable code for picking layout-independent vkey as second pass.

This commit is contained in:
Ken Thomases 2006-11-17 14:47:16 -06:00 committed by Alexandre Julliard
parent c7ffd04be7
commit 89bdf03989
1 changed files with 41 additions and 22 deletions

View File

@ -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++)