Fix some problems with OEM keys

This commit is contained in:
Alexander S. Aganichev 2002-06-13 06:56:44 +00:00
parent 23f8a9a89c
commit 9be8155cea

View File

@ -807,7 +807,7 @@ struct kbd {
{ VK_MULTIPLY, Key_Multi, Key_Multi, Key_Multi, Key_Multi }, { VK_MULTIPLY, Key_Multi, Key_Multi, Key_Multi, Key_Multi },
{ VK_ADD, Key_Plus, Key_Plus, Key_Plus, Key_Plus }, { VK_ADD, Key_Plus, Key_Plus, Key_Plus, Key_Plus },
{ VK_SUBTRACT, Key_Minus, Key_Minus, Key_Minus, Key_Minus }, { VK_SUBTRACT, Key_Minus, Key_Minus, Key_Minus, Key_Minus },
{ VK_DECIMAL, Key_Dot, Key_Dot, Key_C_Del, Key_A_Del }, { VK_DECIMAL, -1, -1, Key_C_Del, Key_A_Del },
{ VK_DIVIDE, Key_Sls, Key_Sls, Key_Sls, Key_Sls }, { VK_DIVIDE, Key_Sls, Key_Sls, Key_Sls, Key_Sls },
{ VK_F1, Key_F1, Key_S_F1, Key_C_F1, Key_A_F1 }, { VK_F1, Key_F1, Key_S_F1, Key_C_F1, Key_A_F1 },
{ VK_F2, Key_F2, Key_S_F2, Key_C_F2, Key_A_F2 }, { VK_F2, Key_F2, Key_S_F2, Key_C_F2, Key_A_F2 },
@ -826,6 +826,30 @@ struct kbd {
}; };
// ------------------------------------------------------------------
bool is_oem_key(int keycode)
{
switch(keycode)
{
// OEM specific keys
case 0x2a:
case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe:
case 0xbf: case 0xc0:
case 0xdb: case 0xdc: case 0xdd: case 0xde: case 0xdf:
case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4:
case 0xe6:
case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed:
case 0xef: case 0xf0: case 0xf1: case 0xf2: case 0xf3:
case 0xf4: case 0xf5:
return true;
default:
return false;
}
}
// ------------------------------------------------------------------ // ------------------------------------------------------------------
int gkbd_nt2bios(INPUT_RECORD& inp) { int gkbd_nt2bios(INPUT_RECORD& inp) {
@ -840,8 +864,7 @@ int gkbd_nt2bios(INPUT_RECORD& inp) {
while((keycode != k->keycode) and (k->keycode != -1)) while((keycode != k->keycode) and (k->keycode != -1))
k++; k++;
if(k->keycode == -1) { // value not in table if(k->keycode == -1) { // value not in table
int c = ascii; return ascii ? ascii : -1;
return c ? c : -1;
} }
// Check the state of the shift keys. ALT has highest // Check the state of the shift keys. ALT has highest
@ -853,12 +876,16 @@ int gkbd_nt2bios(INPUT_RECORD& inp) {
c = k->alt; c = k->alt;
else if(state & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED)) else if(state & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
c = k->ctrl; c = k->ctrl;
else if(state & SHIFT_PRESSED) else if(state & SHIFT_PRESSED) {
c = k->shift; if(k->shift == -1)
c = ascii;
else
c = k->shift;
}
else { else {
// If it is a letter key, use the ASCII value supplied // If it is a letter key, use the ASCII value supplied
// by NT to take into account the CapsLock state. // by NT to take into account the CapsLock state.
if(isupper(keycode)) if(isupper(keycode) || (k->normal == -1))
c = ascii; c = ascii;
else else
c = k->normal; c = k->normal;
@ -866,7 +893,7 @@ int gkbd_nt2bios(INPUT_RECORD& inp) {
if(c != -1) if(c != -1)
if(ascii and not (right_alt_same_as_left ? (state & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) : (state & LEFT_ALT_PRESSED))) if(ascii and not (right_alt_same_as_left ? (state & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) : (state & LEFT_ALT_PRESSED)))
if(!iscntrl(keycode)) if(isalnum(keycode))
return ascii; return ascii;
if(ISEXT(c)) if(ISEXT(c))
return EXTVAL(c) << 8; return EXTVAL(c) << 8;
@ -1159,7 +1186,7 @@ gkey kbxget_raw(int mode) {
if(nread) { if(nread) {
if((inp.EventType == KEY_EVENT) and inp.Event.KeyEvent.bKeyDown) { if((inp.EventType == KEY_EVENT) and inp.Event.KeyEvent.bKeyDown) {
int kc = gkbd_nt2bios(inp); int kc = gkbd_nt2bios(inp);
if((kc != -1) or (inp.Event.KeyEvent.wVirtualKeyCode == 0xBA)) { if((kc != -1) or is_oem_key(inp.Event.KeyEvent.wVirtualKeyCode)) {
k = (gkey)kc; k = (gkey)kc;
return k; return k;
} }
@ -1201,8 +1228,14 @@ gkey kbxget_raw(int mode) {
break; break;
} }
} }
else else {
ReadConsoleInput(gkbd_hin, &inp, 1, &nread); ReadConsoleInput(gkbd_hin, &inp, 1, &nread);
// if(is_oem_key(VKC) and (ascii == '\0')) {
// do {
// PeekConsoleInput(gkbd_hin, &inp, 1, &nread);
// } while(nread and (inp.EventType != KEY_EVENT));
// }
}
switch(VKC) { switch(VKC) {
// Not meanful keys // Not meanful keys
@ -1245,28 +1278,12 @@ gkey kbxget_raw(int mode) {
} }
// fall through // fall through
default: default:
if((ascii == '\x2e') or (alt_pressed and ctrl_pressed)) { {
k = (gkey)ascii;
}
else {
int kc = gkbd_nt2bios(inp); int kc = gkbd_nt2bios(inp);
if(kc != -1) if(kc != -1)
k = (gkey)kc; k = (gkey)kc;
} }
break; break;
// OEM specific keys
case 0x2a:
case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe:
case 0xbf: case 0xc0:
case 0xdb: case 0xdc: case 0xdd: case 0xde: case 0xdf:
case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4:
case 0xe6:
case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed:
case 0xef: case 0xf0: case 0xf1: case 0xf2: case 0xf3:
case 0xf4: case 0xf5:
k = (gkey)ascii;
break;
} }
if(k != 0) if(k != 0)
break; break;