Update Windows' keyboard input in preparation for eventual key remapping. Might need a bit more work, but for now, all keyboard functionality should be restored.

This commit is contained in:
The Dax 2013-07-04 02:11:39 -04:00
parent 8b27f4ebd4
commit 72b33a5f5c

View File

@ -1,4 +1,6 @@
#include "input/input_state.h"
#include "util/const_map.h"
#include "KeyMap.h"
#include "ControlMapping.h"
#include "Windows/WndMainWindow.h"
#include "KeyboardDevice.h"
@ -32,11 +34,96 @@ unsigned short analog_ctrl_map[] = {
'J', CTRL_LEFT,
'L', CTRL_RIGHT,
};
// TODO: More keys need to be added, but this is more than
// a fair start.
std::map<int, int> windowsTransTable = InitConstMap<int, int>
('A', KEYCODE_A)
('B', KEYCODE_B)
('C', KEYCODE_C)
('D', KEYCODE_D)
('E', KEYCODE_E)
('F', KEYCODE_F)
('G', KEYCODE_G)
('H', KEYCODE_H)
('I', KEYCODE_I)
('J', KEYCODE_J)
('K', KEYCODE_K)
('L', KEYCODE_L)
('M', KEYCODE_M)
('N', KEYCODE_N)
('O', KEYCODE_O)
('P', KEYCODE_P)
('Q', KEYCODE_Q)
('R', KEYCODE_R)
('S', KEYCODE_S)
('T', KEYCODE_T)
('U', KEYCODE_U)
('V', KEYCODE_V)
('W', KEYCODE_W)
('X', KEYCODE_X)
('Y', KEYCODE_Y)
('Z', KEYCODE_Z)
('0', KEYCODE_0)
('1', KEYCODE_1)
('2', KEYCODE_2)
('3', KEYCODE_3)
('4', KEYCODE_4)
('5', KEYCODE_5)
('6', KEYCODE_6)
('7', KEYCODE_7)
('8', KEYCODE_8)
('9', KEYCODE_9)
(VK_NUMPAD0, KEYCODE_NUMPAD_0)
(VK_NUMPAD1, KEYCODE_NUMPAD_1)
(VK_NUMPAD2, KEYCODE_NUMPAD_2)
(VK_NUMPAD3, KEYCODE_NUMPAD_3)
(VK_NUMPAD4, KEYCODE_NUMPAD_4)
(VK_NUMPAD5, KEYCODE_NUMPAD_5)
(VK_NUMPAD6, KEYCODE_NUMPAD_6)
(VK_NUMPAD7, KEYCODE_NUMPAD_7)
(VK_NUMPAD8, KEYCODE_NUMPAD_8)
(VK_NUMPAD9, KEYCODE_NUMPAD_9)
(VK_DIVIDE, KEYCODE_NUMPAD_DIVIDE)
(VK_MULTIPLY, KEYCODE_NUMPAD_MULTIPLY)
(VK_SUBTRACT, KEYCODE_NUMPAD_SUBTRACT)
(VK_ADD, KEYCODE_NUMPAD_ADD)
(VK_SEPARATOR, KEYCODE_NUMPAD_COMMA)
(VK_OEM_MINUS, KEYCODE_MINUS)
(VK_OEM_PLUS, KEYCODE_PLUS)
(VK_LCONTROL, KEYCODE_CTRL_LEFT)
(VK_RCONTROL, KEYCODE_CTRL_RIGHT)
(VK_BACK, KEYCODE_BACK)
(VK_SPACE, KEYCODE_SPACE)
(VK_ESCAPE, KEYCODE_ESCAPE)
(VK_UP, KEYCODE_DPAD_UP)
(VK_INSERT, KEYCODE_INSERT)
(VK_HOME, KEYCODE_HOME)
(VK_PRIOR, KEYCODE_PAGE_UP)
(VK_NEXT, KEYCODE_PAGE_DOWN)
(VK_DELETE, KEYCODE_DEL)
(VK_END, KEYCODE_MOVE_END)
(VK_TAB, KEYCODE_TAB)
(VK_DOWN, KEYCODE_DPAD_DOWN)
(VK_LEFT, KEYCODE_DPAD_LEFT)
(VK_RIGHT, KEYCODE_DPAD_RIGHT)
(VK_CAPITAL, KEYCODE_CAPS_LOCK)
(VK_TAB, KEYCODE_TAB)
(VK_CLEAR, KEYCODE_CLEAR)
(VK_PRINT, KEYCODE_SYSRQ)
(VK_SCROLL, KEYCODE_SCROLL_LOCK)
(VK_OEM_1, KEYCODE_SEMICOLON)
(VK_OEM_2, KEYCODE_SLASH)
(VK_OEM_4, KEYCODE_LEFT_BRACKET)
(VK_OEM_6, KEYCODE_RIGHT_BRACKET)
(VK_MENU, KEYCODE_MENU);
const unsigned int analog_ctrl_map_size = sizeof(analog_ctrl_map);
int KeyboardDevice::UpdateState(InputState &input_state) {
if (MainWindow::GetHWND() != GetForegroundWindow()) return -1;
bool alternate = GetAsyncKeyState(VK_SHIFT) != 0;
KeyQueueBlank(input_state.key_queue);
static u32 alternator = 0;
bool doAlternate = alternate && (alternator++ % 10) < 5;
@ -49,8 +136,13 @@ int KeyboardDevice::UpdateState(InputState &input_state) {
if (!GetAsyncKeyState(key_pad_map[i])) {
continue;
}
// TODO: Escape should eventually work with KeyQueueAttemptTranslatedAdd, but it doesn't
// right now.
if (!doAlternate || key_pad_map[i + 1] > PAD_BUTTON_SELECT) {
input_state.pad_buttons |= key_pad_map[i+1];
if(key_pad_map[i] == VK_ESCAPE)
input_state.pad_buttons |= key_pad_map[i + 1];
KeyQueueAttemptTranslatedAdd(input_state.key_queue, windowsTransTable, key_pad_map[i]);
}
}
@ -200,4 +292,3 @@ const char * getVirtualKeyName(unsigned char key)
}
return 0;
}