Completed GetKeyNameText for non-character keys.
This commit is contained in:
parent
49f7643fcb
commit
5bd551756b
|
@ -273,6 +273,9 @@ static unsigned kbd_layout=0; /* index into above table of layouts */
|
||||||
keypad / and keypad ENTER (SDK 3.1 Vol.3 p 138) */
|
keypad / and keypad ENTER (SDK 3.1 Vol.3 p 138) */
|
||||||
/* FIXME should we set extended bit for NumLock ? My
|
/* FIXME should we set extended bit for NumLock ? My
|
||||||
* Windows does ... DF */
|
* Windows does ... DF */
|
||||||
|
/* Yes, to distinguish based on scan codes, also
|
||||||
|
for PrtScn key ... GA */
|
||||||
|
|
||||||
static const int special_key_vkey[] =
|
static const int special_key_vkey[] =
|
||||||
{
|
{
|
||||||
VK_BACK, VK_TAB, 0, VK_CLEAR, 0, VK_RETURN, 0, 0, /* FF08 */
|
VK_BACK, VK_TAB, 0, VK_CLEAR, 0, VK_RETURN, 0, 0, /* FF08 */
|
||||||
|
@ -303,7 +306,7 @@ static const int misc_key_vkey[] =
|
||||||
};
|
};
|
||||||
static const int misc_key_scan[] =
|
static const int misc_key_scan[] =
|
||||||
{
|
{
|
||||||
/*?*/ 0, 0x37, /*?*/ 0, 0x152, 0, 0, 0, 0, /* FF60 */
|
/*?*/ 0, 0x137, /*?*/ 0, 0x152, 0, 0, 0, 0, /* FF60 */
|
||||||
/*?*/ 0, /*?*/ 0, 0x38 /* FF68 */
|
/*?*/ 0, /*?*/ 0, 0x38 /* FF68 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -324,7 +327,7 @@ static const int keypad_key_vkey[] =
|
||||||
};
|
};
|
||||||
static const int keypad_key_scan[] =
|
static const int keypad_key_scan[] =
|
||||||
{
|
{
|
||||||
0x138, 0x45, /* FF7E */
|
0x138, 0x145, /* FF7E */
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, /* FF80 */
|
0, 0, 0, 0, 0, 0, 0, 0, /* FF80 */
|
||||||
0, 0, 0, 0, 0, 0x11C, 0, 0, /* FF88 */
|
0, 0, 0, 0, 0, 0x11C, 0, 0, /* FF88 */
|
||||||
0, 0, 0, 0, 0, 0x47, 0x4B, 0x48, /* FF90 */
|
0, 0, 0, 0, 0, 0x47, 0x4B, 0x48, /* FF90 */
|
||||||
|
@ -1043,6 +1046,9 @@ UINT16 X11DRV_KEYBOARD_MapVirtualKey(UINT16 wCode, UINT16 wMapType)
|
||||||
INT16 X11DRV_KEYBOARD_GetKeyNameText(LONG lParam, LPSTR lpBuffer, INT16 nSize)
|
INT16 X11DRV_KEYBOARD_GetKeyNameText(LONG lParam, LPSTR lpBuffer, INT16 nSize)
|
||||||
{
|
{
|
||||||
int vkey, ansi, scanCode;
|
int vkey, ansi, scanCode;
|
||||||
|
KeyCode keyc;
|
||||||
|
KeySym keys;
|
||||||
|
char *name;
|
||||||
|
|
||||||
scanCode = lParam >> 16;
|
scanCode = lParam >> 16;
|
||||||
scanCode &= 0x1ff; /* keep "extended-key" flag with code */
|
scanCode &= 0x1ff; /* keep "extended-key" flag with code */
|
||||||
|
@ -1074,8 +1080,14 @@ INT16 X11DRV_KEYBOARD_GetKeyNameText(LONG lParam, LPSTR lpBuffer, INT16 nSize)
|
||||||
TRACE_(keyboard)("scan 0x%04x, vkey 0x%04x, ANSI 0x%04x\n",
|
TRACE_(keyboard)("scan 0x%04x, vkey 0x%04x, ANSI 0x%04x\n",
|
||||||
scanCode, vkey, ansi);
|
scanCode, vkey, ansi);
|
||||||
|
|
||||||
if ( ((vkey >= 0x30) && (vkey <= 0x39)) ||
|
/* first get the name of the "regular" keys which is the Upper case
|
||||||
( (vkey >= 0x41) && (vkey <= 0x5a)) ) /* Windows VK_* are ANSI codes */
|
value of the keycap imprint. */
|
||||||
|
if ( ((ansi >= 0x21) && (ansi <= 0x7e)) &&
|
||||||
|
(scanCode != 0x137) && /* PrtScn */
|
||||||
|
(scanCode != 0x135) && /* numpad / */
|
||||||
|
(scanCode != 0x37 ) && /* numpad * */
|
||||||
|
(scanCode != 0x4a ) && /* numpad - */
|
||||||
|
(scanCode != 0x4e ) ) /* numpad + */
|
||||||
{
|
{
|
||||||
if ((nSize >= 2) && lpBuffer)
|
if ((nSize >= 2) && lpBuffer)
|
||||||
{
|
{
|
||||||
|
@ -1087,10 +1099,37 @@ INT16 X11DRV_KEYBOARD_GetKeyNameText(LONG lParam, LPSTR lpBuffer, INT16 nSize)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* use vkey values to construct names */
|
/* FIXME: horrible hack to fix function keys. Windows reports scancode
|
||||||
|
without "extended-key" flag. However Wine generates scancode
|
||||||
|
*with* "extended-key" flag. Seems to occur *only* for the
|
||||||
|
function keys. Soooo.. We will leave the table alone and
|
||||||
|
fudge the lookup here till the other part is found and fixed!!! */
|
||||||
|
|
||||||
FIXME_(keyboard)("(%08lx,%p,%d): unsupported key\n",lParam,lpBuffer,nSize);
|
if ( ((scanCode >= 0x13b) && (scanCode <= 0x144)) ||
|
||||||
|
(scanCode == 0x157) || (scanCode == 0x158))
|
||||||
|
scanCode &= 0xff; /* remove "extended-key" flag for Fx keys */
|
||||||
|
|
||||||
|
/* let's do scancode -> keycode -> keysym -> String */
|
||||||
|
|
||||||
|
for (keyc=min_keycode; keyc<=max_keycode; keyc++)
|
||||||
|
if ((keyc2scan[keyc]) == scanCode)
|
||||||
|
break;
|
||||||
|
if (keyc <= max_keycode)
|
||||||
|
{
|
||||||
|
keys = TSXKeycodeToKeysym(display, keyc, 0);
|
||||||
|
name = TSXKeysymToString(keys);
|
||||||
|
TRACE_(keyboard)("found scan=%04x keyc=%04x keysym=%04x string=%s\n",
|
||||||
|
scanCode, keyc, (int)keys, name);
|
||||||
|
if (lpBuffer && nSize && name)
|
||||||
|
{
|
||||||
|
strncpy(lpBuffer, name, nSize);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finally issue FIXME for unknown keys */
|
||||||
|
|
||||||
|
FIXME_(keyboard)("(%08lx,%p,%d): unsupported key, vkey=%04x, ansi=%04x\n",lParam,lpBuffer,nSize,vkey,ansi);
|
||||||
if (lpBuffer && nSize)
|
if (lpBuffer && nSize)
|
||||||
*lpBuffer = 0;
|
*lpBuffer = 0;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue