Files
ppsspp/Windows/KeyboardDevice.cpp
Steven Cherry 409edfd5e7 Set 'F3' on keyboard to toggle, in addition to left thumb stick (for keyboard users)
Fix graphics screen 'Fps Limit' from being unable to close out, making options below it unreadable.
2013-05-14 19:00:43 -05:00

212 lines
4.3 KiB
C++

#include "input/input_state.h"
#include "Windows/WndMainWindow.h"
#include "KeyboardDevice.h"
#include "../Common/CommonTypes.h"
#include "../Core/HLE/sceCtrl.h"
#include "WinUser.h"
unsigned int key_pad_map[] = {
VK_TAB, PAD_BUTTON_UNTHROTTLE,
VK_SPACE, PAD_BUTTON_START,
'V', PAD_BUTTON_SELECT,
'A', PAD_BUTTON_X,
'S', PAD_BUTTON_Y,
'X', PAD_BUTTON_B,
'Z', PAD_BUTTON_A,
'Q', PAD_BUTTON_LBUMPER,
'W', PAD_BUTTON_RBUMPER,
VK_UP, PAD_BUTTON_UP,
VK_DOWN, PAD_BUTTON_DOWN,
VK_LEFT, PAD_BUTTON_LEFT,
VK_RIGHT, PAD_BUTTON_RIGHT,
VK_F3, PAD_BUTTON_LEFT_THUMB,
};
unsigned short analog_ctrl_map[] = {
'I', CTRL_UP,
'K', CTRL_DOWN,
'J', CTRL_LEFT,
'L', CTRL_RIGHT,
};
int KeyboardDevice::UpdateState(InputState &input_state) {
if (MainWindow::GetHWND() != GetForegroundWindow()) return -1;
bool alternate = GetAsyncKeyState(VK_SHIFT) != 0;
static u32 alternator = 0;
bool doAlternate = alternate && (alternator++ % 10) < 5;
for (int i = 0; i < sizeof(key_pad_map)/sizeof(key_pad_map[0]); i += 2) {
if (!GetAsyncKeyState(key_pad_map[i])) {
continue;
}
if (!doAlternate || key_pad_map[i + 1] > PAD_BUTTON_SELECT) {
input_state.pad_buttons |= key_pad_map[i+1];
}
}
float analogX = 0;
float analogY = 0;
for (int i = 0; i < sizeof(analog_ctrl_map)/sizeof(analog_ctrl_map[0]); i += 2) {
if (!GetAsyncKeyState(analog_ctrl_map[i])) {
continue;
}
switch (analog_ctrl_map[i + 1]) {
case CTRL_UP:
analogY += 1.0f;
break;
case CTRL_DOWN:
analogY -= 1.0f;
break;
case CTRL_LEFT:
analogX -= 1.0f;
break;
case CTRL_RIGHT:
analogX += 1.0f;
break;
}
}
input_state.pad_lstick_x += analogX;
input_state.pad_lstick_y += analogY;
return 0;
}
struct key_name {
unsigned char key;
char name[10];
};
const key_name key_name_map[] = {
{'A', "A"},
{'B', "B"},
{'C', "C"},
{'D', "D"},
{'E', "E"},
{'F', "F"},
{'G', "G"},
{'H', "H"},
{'I', "I"},
{'J', "J"},
{'K', "K"},
{'L', "L"},
{'M', "M"},
{'N', "N"},
{'O', "O"},
{'P', "P"},
{'Q', "Q"},
{'R', "R"},
{'S', "S"},
{'T', "T"},
{'U', "U"},
{'V', "V"},
{'W', "W"},
{'X', "X"},
{'Y', "Y"},
{'Z', "Z"},
{'1', "1"},
{'2', "2"},
{'3', "3"},
{'4', "4"},
{'5', "5"},
{'6', "6"},
{'7', "7"},
{'8', "8"},
{'9', "9"},
{'0', "0"},
{VK_BACK, "Backspace"},
{VK_TAB, "Tab"},
{VK_CLEAR, "Clear"},
{VK_RETURN, "Return"},
{VK_SHIFT, "Shift"},
{VK_CONTROL, "Ctrl"},
{VK_MENU, "Alt"},
{VK_PAUSE, "Pause"},
{VK_CAPITAL, "Caps"},
{VK_ESCAPE, "Esc"},
{VK_SPACE, "Space"},
{VK_PRIOR, "PgUp"},
{VK_NEXT, "PgDown"},
{VK_END, "End"},
{VK_HOME, "Home"},
{VK_LEFT, "Left"},
{VK_UP, "Up"},
{VK_RIGHT, "Right"},
{VK_DOWN, "Down"},
{VK_SELECT, "Select"},
{VK_INSERT, "Insert"},
{VK_DELETE, "Delete"},
{VK_HELP, "Help"},
{VK_NUMPAD0, "Num 0"},
{VK_NUMPAD1, "Num 1"},
{VK_NUMPAD2, "Num 2"},
{VK_NUMPAD3, "Num 3"},
{VK_NUMPAD4, "Num 4"},
{VK_NUMPAD5, "Num 5"},
{VK_NUMPAD6, "Num 6"},
{VK_NUMPAD7, "Num 7"},
{VK_NUMPAD8, "Num 8"},
{VK_NUMPAD9, "Num 9"},
{VK_MULTIPLY, "Num *"},
{VK_ADD, "Num +"},
{VK_SEPARATOR, "Num Sep"},
{VK_SUBTRACT, "Num -"},
{VK_DECIMAL, "Num ."},
{VK_DIVIDE, "Num /"},
{VK_F1, "F1"},
{VK_F2, "F2"},
{VK_F3, "F3"},
{VK_F4, "F4"},
{VK_F5, "F5"},
{VK_F6, "F6"},
{VK_F7, "F7"},
{VK_F8, "F8"},
{VK_F9, "F9"},
{VK_F10, "F10"},
{VK_F11, "F11"},
{VK_F12, "F12"},
{VK_OEM_NEC_EQUAL, "Num ="},
{VK_OEM_1, ";"},
{VK_OEM_PLUS, "+"},
{VK_OEM_COMMA, ","},
{VK_OEM_MINUS, "-"},
{VK_OEM_PERIOD, "."},
{VK_OEM_2, "?"},
{VK_OEM_3, "~"},
{VK_OEM_4, "["},
{VK_OEM_5, "|"},
{VK_OEM_6, "]"},
{VK_OEM_7, "'"}
};
const int key_name_map_size = sizeof(key_name_map) / sizeof(key_name);
const char * getVirtualKeyName(unsigned char key)
{
for (int i = 0; i < key_name_map_size; i++) {
if (key_name_map[i].key == key)
return key_name_map[i].name;
}
return 0;
}
bool saveControlsToFile() {
FILE *wfp = fopen("PPSSPPControls.dat", "wb");
if (!wfp)
return false;
fwrite(key_pad_map, 1, sizeof(key_pad_map), wfp);
fwrite(analog_ctrl_map, 1, sizeof(analog_ctrl_map), wfp);
fclose(wfp);
return true;
}
bool loadControlsFromFile() {
FILE *rfp = fopen("PPSSPPControls.dat", "rb");
if (!rfp)
return false;
fread(key_pad_map, 1, sizeof(key_pad_map), rfp);
fread(analog_ctrl_map, 1, sizeof(analog_ctrl_map), rfp);
fclose(rfp);
return true;
}