Updated the key translation logic for Win32.

This commit is contained in:
Marcus 2011-01-10 21:19:27 +01:00
parent 2c169997f5
commit 62e4ff1e91

View File

@ -440,11 +440,11 @@ static int translateKey(WPARAM wParam, LPARAM lParam)
DWORD msg_time; DWORD msg_time;
DWORD scan_code; DWORD scan_code;
// Check for numeric keypad keys // Check for numeric keypad keys.
// Note: This way we always force "NumLock = ON", which at least // Note: This way we always force "NumLock = ON", which is intentional
// enables GLFW users to detect numeric keypad keys // since the returned key code should correspond to a physical
// location.
int hiFlags = HIWORD(lParam); int hiFlags = HIWORD(lParam);
if (!(hiFlags & 0x100)) if (!(hiFlags & 0x100))
{ {
switch (MapVirtualKey(hiFlags & 0xFF, 1)) switch (MapVirtualKey(hiFlags & 0xFF, 1))
@ -464,6 +464,7 @@ static int translateKey(WPARAM wParam, LPARAM lParam)
case VK_SUBTRACT: return GLFW_KEY_KP_SUBTRACT; case VK_SUBTRACT: return GLFW_KEY_KP_SUBTRACT;
case VK_ADD: return GLFW_KEY_KP_ADD; case VK_ADD: return GLFW_KEY_KP_ADD;
case VK_DELETE: return GLFW_KEY_KP_DECIMAL; case VK_DELETE: return GLFW_KEY_KP_DECIMAL;
default: break;
} }
} }
@ -478,9 +479,9 @@ static int translateKey(WPARAM wParam, LPARAM lParam)
// right) // right)
scan_code = MapVirtualKey(VK_RSHIFT, 0); scan_code = MapVirtualKey(VK_RSHIFT, 0);
if (((lParam & 0x01ff0000) >> 16) == scan_code) if (((lParam & 0x01ff0000) >> 16) == scan_code)
return GLFW_KEY_RSHIFT; return GLFW_KEY_RIGHT_SHIFT;
return GLFW_KEY_LSHIFT; return GLFW_KEY_LEFT_SHIFT;
} }
// The CTRL keys require special handling // The CTRL keys require special handling
@ -488,7 +489,7 @@ static int translateKey(WPARAM wParam, LPARAM lParam)
{ {
// Is this an extended key (i.e. right key)? // Is this an extended key (i.e. right key)?
if (lParam & 0x01000000) if (lParam & 0x01000000)
return GLFW_KEY_RCTRL; return GLFW_KEY_RIGHT_CTRL;
// Here is a trick: "Alt Gr" sends LCTRL, then RALT. We only // Here is a trick: "Alt Gr" sends LCTRL, then RALT. We only
// want the RALT message, so we try to see if the next message // want the RALT message, so we try to see if the next message
@ -505,12 +506,12 @@ static int translateKey(WPARAM wParam, LPARAM lParam)
{ {
// Next message is a RALT down message, which // Next message is a RALT down message, which
// means that this is NOT a proper LCTRL message! // means that this is NOT a proper LCTRL message!
return GLFW_KEY_UNKNOWN; return -1;
} }
} }
} }
return GLFW_KEY_LCTRL; return GLFW_KEY_LEFT_CTRL;
} }
// The ALT keys require special handling // The ALT keys require special handling
@ -518,9 +519,9 @@ static int translateKey(WPARAM wParam, LPARAM lParam)
{ {
// Is this an extended key (i.e. right key)? // Is this an extended key (i.e. right key)?
if (lParam & 0x01000000) if (lParam & 0x01000000)
return GLFW_KEY_RALT; return GLFW_KEY_RIGHT_ALT;
return GLFW_KEY_LALT; return GLFW_KEY_LEFT_ALT;
} }
// The ENTER keys require special handling // The ENTER keys require special handling
@ -533,16 +534,16 @@ static int translateKey(WPARAM wParam, LPARAM lParam)
return GLFW_KEY_ENTER; return GLFW_KEY_ENTER;
} }
// Special keys (non character keys) // Funcion keys (non-printable keys)
case VK_ESCAPE: return GLFW_KEY_ESC; case VK_ESCAPE: return GLFW_KEY_ESCAPE;
case VK_TAB: return GLFW_KEY_TAB; case VK_TAB: return GLFW_KEY_TAB;
case VK_BACK: return GLFW_KEY_BACKSPACE; case VK_BACK: return GLFW_KEY_BACKSPACE;
case VK_HOME: return GLFW_KEY_HOME; case VK_HOME: return GLFW_KEY_HOME;
case VK_END: return GLFW_KEY_END; case VK_END: return GLFW_KEY_END;
case VK_PRIOR: return GLFW_KEY_PAGEUP; case VK_PRIOR: return GLFW_KEY_PAGE_UP;
case VK_NEXT: return GLFW_KEY_PAGEDOWN; case VK_NEXT: return GLFW_KEY_PAGE_DOWN;
case VK_INSERT: return GLFW_KEY_INSERT; case VK_INSERT: return GLFW_KEY_INSERT;
case VK_DELETE: return GLFW_KEY_DEL; case VK_DELETE: return GLFW_KEY_DELETE;
case VK_LEFT: return GLFW_KEY_LEFT; case VK_LEFT: return GLFW_KEY_LEFT;
case VK_UP: return GLFW_KEY_UP; case VK_UP: return GLFW_KEY_UP;
case VK_RIGHT: return GLFW_KEY_RIGHT; case VK_RIGHT: return GLFW_KEY_RIGHT;
@ -571,7 +572,13 @@ static int translateKey(WPARAM wParam, LPARAM lParam)
case VK_F22: return GLFW_KEY_F22; case VK_F22: return GLFW_KEY_F22;
case VK_F23: return GLFW_KEY_F23; case VK_F23: return GLFW_KEY_F23;
case VK_F24: return GLFW_KEY_F24; case VK_F24: return GLFW_KEY_F24;
case VK_SPACE: return GLFW_KEY_SPACE; case VK_NUMLOCK: return GLFW_KEY_NUM_LOCK;
case VK_CAPITAL: return GLFW_KEY_CAPS_LOCK;
case VK_SCROLL: return GLFW_KEY_SCROLL_LOCK;
case VK_PAUSE: return GLFW_KEY_PAUSE;
case VK_LWIN: return GLFW_KEY_LEFT_SUPER;
case VK_RWIN: return GLFW_KEY_RIGHT_SUPER;
case VK_APPS: return GLFW_KEY_MENU;
// Numeric keypad // Numeric keypad
case VK_NUMPAD0: return GLFW_KEY_KP_0; case VK_NUMPAD0: return GLFW_KEY_KP_0;
@ -589,35 +596,63 @@ static int translateKey(WPARAM wParam, LPARAM lParam)
case VK_SUBTRACT: return GLFW_KEY_KP_SUBTRACT; case VK_SUBTRACT: return GLFW_KEY_KP_SUBTRACT;
case VK_ADD: return GLFW_KEY_KP_ADD; case VK_ADD: return GLFW_KEY_KP_ADD;
case VK_DECIMAL: return GLFW_KEY_KP_DECIMAL; case VK_DECIMAL: return GLFW_KEY_KP_DECIMAL;
case VK_NUMLOCK: return GLFW_KEY_KP_NUM_LOCK;
case VK_CAPITAL: return GLFW_KEY_CAPS_LOCK; // Printable keys are mapped according to US layout
case VK_SCROLL: return GLFW_KEY_SCROLL_LOCK; case VK_SPACE: return GLFW_KEY_SPACE;
case VK_PAUSE: return GLFW_KEY_PAUSE; case 0x30: return GLFW_KEY_0;
case 0x31: return GLFW_KEY_1;
case VK_LWIN: return GLFW_KEY_LSUPER; case 0x32: return GLFW_KEY_2;
case VK_RWIN: return GLFW_KEY_RSUPER; case 0x33: return GLFW_KEY_3;
case VK_APPS: return GLFW_KEY_MENU; case 0x34: return GLFW_KEY_4;
case 0x35: return GLFW_KEY_5;
// The rest (should be printable keys) case 0x36: return GLFW_KEY_6;
default: case 0x37: return GLFW_KEY_7;
{ case 0x38: return GLFW_KEY_8;
// Convert to printable character (ISO-8859-1 or Unicode) case 0x39: return GLFW_KEY_9;
wParam = MapVirtualKey((UINT) wParam, 2) & 0x0000FFFF; case 0x41: return GLFW_KEY_A;
case 0x42: return GLFW_KEY_B;
// Make sure that the character is uppercase case 0x43: return GLFW_KEY_C;
wParam = (WPARAM) CharUpperW((LPWSTR) wParam); case 0x44: return GLFW_KEY_D;
case 0x45: return GLFW_KEY_E;
// Valid ISO-8859-1 character? case 0x46: return GLFW_KEY_F;
if ((wParam >= 32 && wParam <= 126) || case 0x47: return GLFW_KEY_G;
(wParam >= 160 && wParam <= 255)) case 0x48: return GLFW_KEY_H;
{ case 0x49: return GLFW_KEY_I;
return (int) wParam; case 0x4A: return GLFW_KEY_J;
} case 0x4B: return GLFW_KEY_K;
case 0x4C: return GLFW_KEY_L;
return GLFW_KEY_UNKNOWN; case 0x4D: return GLFW_KEY_M;
} case 0x4E: return GLFW_KEY_N;
case 0x4F: return GLFW_KEY_O;
case 0x50: return GLFW_KEY_P;
case 0x51: return GLFW_KEY_Q;
case 0x52: return GLFW_KEY_R;
case 0x53: return GLFW_KEY_S;
case 0x54: return GLFW_KEY_T;
case 0x55: return GLFW_KEY_U;
case 0x56: return GLFW_KEY_V;
case 0x57: return GLFW_KEY_W;
case 0x58: return GLFW_KEY_X;
case 0x59: return GLFW_KEY_Y;
case 0x5A: return GLFW_KEY_Z;
case 0xBD: return GLFW_KEY_MINUS;
case 0xBB: return GLFW_KEY_EQUAL;
case 0xDB: return GLFW_KEY_LEFT_BRACKET;
case 0xDD: return GLFW_KEY_RIGHT_BRACKET;
case 0xDC: return GLFW_KEY_BACKSLASH;
case 0xBA: return GLFW_KEY_SEMICOLON;
case 0xDE: return GLFW_KEY_APOSTROPHE;
case 0xC0: return GLFW_KEY_GRAVE_ACCENT;
case 0xBC: return GLFW_KEY_COMMA;
case 0xBE: return GLFW_KEY_PERIOD;
case 0xBF: return GLFW_KEY_SLASH;
case 0xDF: return GLFW_KEY_WORLD_1;
case 0xE2: return GLFW_KEY_WORLD_2;
default: break;
} }
// No matching translation was found, so return -1
return -1;
} }
@ -791,8 +826,8 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
// Special trick: release both shift keys on SHIFT up event // Special trick: release both shift keys on SHIFT up event
if (wParam == VK_SHIFT) if (wParam == VK_SHIFT)
{ {
_glfwInputKey(window, GLFW_KEY_LSHIFT, GLFW_RELEASE); _glfwInputKey(window, GLFW_KEY_LEFT_SHIFT, GLFW_RELEASE);
_glfwInputKey(window, GLFW_KEY_RSHIFT, GLFW_RELEASE); _glfwInputKey(window, GLFW_KEY_RIGHT_SHIFT, GLFW_RELEASE);
} }
else else
_glfwInputKey(window, translateKey(wParam, lParam), GLFW_RELEASE); _glfwInputKey(window, translateKey(wParam, lParam), GLFW_RELEASE);