Add an UI for modifying controls for PC

This commit is contained in:
oioitff 2013-04-18 17:13:00 +08:00
parent 32f344d6bd
commit 7ff4f34a48
5 changed files with 330 additions and 68 deletions

View file

@ -67,4 +67,142 @@ int KeyboardDevice::UpdateState(InputState &input_state) {
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;
}

View file

@ -2,6 +2,7 @@
#include <windows.h>
#include <tchar.h>
#include <atlimage.h>
#include "base/NativeApp.h"
#include "Globals.h"
@ -45,6 +46,12 @@ static RECT g_normalRC = {0};
extern InputState input_state;
extern unsigned short analog_ctrl_map[];
extern unsigned int key_pad_map[];
extern const char * getVirtualKeyName(unsigned char key);
extern bool saveControlsToFile();
extern bool loadControlsFromFile();
namespace MainWindow
{
HWND hwndMain;
@ -358,6 +365,7 @@ namespace MainWindow
switch (message)
{
case WM_CREATE:
loadControlsFromFile();
break;
case WM_MOVE:
@ -822,47 +830,144 @@ namespace MainWindow
"Rapid Fire\tShift",
};
// Message handler for controls box.
static HHOOK pKeydownHook;
static const int control_map_size = IDC_EDIT_KEY_ANALOG_RIGHT - IDC_EDIT_KEY_TURBO + 1;
static u8 control_map[control_map_size];
RECT getRedrawRect(HWND hWnd) {
RECT rc;
HWND hDlg = GetParent(hWnd);
GetWindowRect(hWnd, &rc);
POINT pt = {0, 0};
ScreenToClient(hDlg, &pt);
rc.left += pt.x;
rc.right += pt.x;
rc.top += pt.y;
rc.bottom += pt.y;
return rc;
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
HWND hEdit = GetFocus();
UINT nCtrlID = GetDlgCtrlID(hEdit);
if (nCtrlID < IDC_EDIT_KEY_TURBO || nCtrlID > IDC_EDIT_KEY_ANALOG_RIGHT) {
return CallNextHookEx(pKeydownHook, nCode, wParam, lParam);
}
if (!(lParam&(1<<31))) {
// key down
HWND hDlg = GetParent(hEdit);
const char *str = getVirtualKeyName(wParam);
if (str) {
control_map[nCtrlID - IDC_EDIT_KEY_TURBO] = wParam;
SetWindowTextA(hEdit, str);
RECT rc = getRedrawRect(hEdit);
InvalidateRect(hDlg, &rc, false);
}
else
MessageBoxA(hDlg, "Not supported!", "controller", MB_OK);
}
return 1;
}
BOOL LoadImageFromResource(CImage *image, HINSTANCE hInstance, LPCTSTR pszResourceName, LPCTSTR lpType)
{
HRSRC hrsrc = FindResource(hInstance, pszResourceName, lpType);
if (!hrsrc)
return FALSE;
DWORD dwlen = SizeofResource(hInstance, hrsrc);
BYTE *lpRsrc = (BYTE*)LoadResource(hInstance, hrsrc);
if (!lpRsrc)
return FALSE;
HGLOBAL hMem = GlobalAlloc(GMEM_FIXED, dwlen);
BYTE* pmem = (BYTE*)GlobalLock(hMem);
memcpy(pmem, lpRsrc, dwlen);
GlobalUnlock(hMem);
IStream* pstm;
CreateStreamOnHGlobal(hMem, FALSE, &pstm);
BOOL bResult = (image->Load(pstm) == S_OK);
pstm->Release();
GlobalFree(hMem);
FreeResource(lpRsrc);
return bResult;
}
// Message handler for control box.
LRESULT CALLBACK Controls(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static CImage image;
switch (message)
{
case WM_INITDIALOG:
W32Util::CenterWindow(hDlg);
{
// TODO: connect to keyboard device instead
HWND list = GetDlgItem(hDlg, IDC_LISTCONTROLS);
int stops[1] = {80};
SendMessage(list, LB_SETTABSTOPS, 1, (LPARAM)stops);
for (int i = 0; i < sizeof(controllist)/sizeof(controllist[0]); i++) {
SendMessage(list, LB_INSERTSTRING, -1, (LPARAM)controllist[i]);
}
ComboBox_AddString(GetDlgItem(hDlg, IDC_FORCE_INPUT_DEVICE), "None");
ComboBox_AddString(GetDlgItem(hDlg, IDC_FORCE_INPUT_DEVICE), "XInput");
ComboBox_AddString(GetDlgItem(hDlg, IDC_FORCE_INPUT_DEVICE), "DirectInput");
if ((g_Config.iForceInputDevice < 0) || (g_Config.iForceInputDevice > 1))
{
ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_FORCE_INPUT_DEVICE), 0);
}
else
{
ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_FORCE_INPUT_DEVICE), (g_Config.iForceInputDevice + 1));
if (image.IsNull())
LoadImageFromResource(&image, hInst, MAKEINTRESOURCE(IDB_IMAGE_PSP), "JPG");
int key_pad_size = (IDC_EDIT_KEYRIGHT - IDC_EDIT_KEY_TURBO + 1);
for (u32 i = 0; i <= IDC_EDIT_KEY_ANALOG_RIGHT - IDC_EDIT_KEY_TURBO; i++) {
HWND hEdit = GetDlgItem(hDlg, IDC_EDIT_KEY_TURBO + i);
if (IDC_EDIT_KEY_TURBO + i <= IDC_EDIT_KEYRIGHT)
control_map[i] = key_pad_map[i * 2];
else
control_map[i] = analog_ctrl_map[(i - key_pad_size) * 2];
SetWindowTextA(hEdit, getVirtualKeyName(control_map[i]));
}
DWORD dwThreadID = GetWindowThreadProcessId(hDlg,NULL);
pKeydownHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc, NULL, dwThreadID);
}
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
case WM_PAINT:
{
case IDOK:
g_Config.iForceInputDevice = (ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_FORCE_INPUT_DEVICE)) - 1);
EndDialog(hDlg, IDOK);
return TRUE;
case IDCANCEL:
EndDialog(hDlg, IDCANCEL);
return TRUE;
PAINTSTRUCT pst;
HDC hdc = BeginPaint(hDlg, &pst);
int width = image.GetWidth();
int height = image.GetHeight();
image.BitBlt(hdc, 0, 0, width, height, 0 , 100);
EndPaint(hDlg, &pst);
return TRUE;
}
case WM_CTLCOLORSTATIC:
{
HDC hdc=(HDC)wParam;
SetBkMode(hdc, TRANSPARENT);
return (LRESULT)GetStockObject(NULL_BRUSH);
}
case WM_CTLCOLOREDIT:
{
HDC hdc = (HDC)wParam;
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(255, 0, 0));
HWND hEdit = (HWND)lParam;
RECT rc = getRedrawRect(hEdit);
RECT clientrc;
GetClientRect(hEdit, &clientrc);
image.BitBlt(hdc, 0, 0, rc.right - rc.left, rc.bottom - rc.top, rc.left, rc.top + 100);
char str[11];
clientrc.left += 1;
clientrc.right += 1;
clientrc.top += 1;
clientrc.bottom += 1;
GetWindowTextA(hEdit, str, 10);
DrawTextA(hdc, str, strlen(str), &clientrc, DT_CENTER|DT_SINGLELINE);
return (LRESULT)GetStockObject(NULL_BRUSH);
}
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
if (LOWORD(wParam) == IDOK) {
int key_pad_size = (IDC_EDIT_KEYRIGHT - IDC_EDIT_KEY_TURBO + 1);
for (u32 i = 0; i <= IDC_EDIT_KEY_ANALOG_RIGHT - IDC_EDIT_KEY_TURBO; i++) {
if (IDC_EDIT_KEY_TURBO + i <= IDC_EDIT_KEYRIGHT)
key_pad_map[i * 2] = control_map[i];
else
analog_ctrl_map[(i - key_pad_size) * 2] = control_map[i];
}
saveControlsToFile();
}
UnhookWindowsHookEx(pKeydownHook);
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}

View file

@ -94,6 +94,33 @@ BEGIN
CONTROL "",IDC_TABDATATYPE,"SysTabControl32",TCS_BUTTONS,0,1,205,15
END
IDD_CONTROLS DIALOGEX 0, 0, 443, 234
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Controls"
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,176,217,50,14
PUSHBUTTON "Cancel",IDCANCEL,230,217,50,14
LTEXT "Xbox 360 controllers are supported! Just plug one in and use it!",IDC_STATIC,14,6,201,8
LTEXT "Turbo Mode:",IDC_STATIC,339,203,42,8
EDITTEXT IDC_EDIT_KEYUP,52,73,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEYLEFT,30,91,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEYRIGHT,72,91,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEYDOWN,52,112,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEY_TRIANGLE,362,67,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEY_RECTANGLE,339,91,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEY_CIRCLE,386,91,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEY_CROSS,364,114,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEY_LEFT_THUMB,49,26,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEY_RIGHT_THUMB,361,25,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEY_SELECT,289,161,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEY_START,323,161,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEY_ANALOG_UP,54,130,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEY_ANALOG_LEFT,38,145,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEY_ANALOG_RIGHT,71,145,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEY_ANALOG_DOWN,54,159,33,14,ES_CENTER | ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_KEY_TURBO,382,200,33,14,ES_CENTER | ES_AUTOHSCROLL
END
/////////////////////////////////////////////////////////////////////////////
//
@ -143,6 +170,12 @@ BEGIN
RIGHTMARGIN, 247
BOTTOMMARGIN, 413
END
IDD_CONTROLS, DIALOG
BEGIN
MOCKUP, 1, 100, 0, -100, ".\psp.jpg"
RIGHTMARGIN, 440
END
END
#endif // APSTUDIO_INVOKED
@ -158,44 +191,6 @@ IDI_PPSSPP ICON "ppsspp.ico"
IDI_STOP ICON "icon1.ico"
IDI_STOPDISABLE ICON "stop1.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_CONTROLS DIALOGEX 0, 0, 287, 238
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Controls"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,176,217,50,14
PUSHBUTTON "Cancel",IDCANCEL,230,217,50,14
LTEXT "NOTE: Currently controls are NOT configurable.\nHowever: Xbox 360 controllers are supported! Just plug one in and use it!",IDC_STATIC,7,7,188,30
LISTBOX IDC_LISTCONTROLS,7,39,273,176,LBS_SORT | LBS_USETABSTOPS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
LTEXT "Force device:",IDC_STATIC,10,220,45,11
COMBOBOX IDC_FORCE_INPUT_DEVICE,59,219,84,140,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_CONTROLS, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 280
TOPMARGIN, 7
BOTTOMMARGIN, 231
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Menu
@ -353,6 +348,12 @@ END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// JPG
//
IDB_IMAGE_PSP JPG "psp.jpg"
/////////////////////////////////////////////////////////////////////////////
//

BIN
Windows/psp.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View file

@ -224,6 +224,24 @@
#define ID_FILE_LOAD_MEMSTICK 40143
#define ID_EMULATION_SOUND 40144
#define ID_OPTIONS_MIPMAP 40145
#define IDB_IMAGE_PSP 40146
#define IDC_EDIT_KEY_TURBO 40147
#define IDC_EDIT_KEY_START 40148
#define IDC_EDIT_KEY_SELECT 40149
#define IDC_EDIT_KEY_RECTANGLE 40150
#define IDC_EDIT_KEY_TRIANGLE 40151
#define IDC_EDIT_KEY_CIRCLE 40152
#define IDC_EDIT_KEY_CROSS 40153
#define IDC_EDIT_KEY_LEFT_THUMB 40154
#define IDC_EDIT_KEY_RIGHT_THUMB 40155
#define IDC_EDIT_KEYUP 40156
#define IDC_EDIT_KEYDOWN 40157
#define IDC_EDIT_KEYLEFT 40158
#define IDC_EDIT_KEYRIGHT 40159
#define IDC_EDIT_KEY_ANALOG_UP 40160
#define IDC_EDIT_KEY_ANALOG_DOWN 40161
#define IDC_EDIT_KEY_ANALOG_LEFT 40162
#define IDC_EDIT_KEY_ANALOG_RIGHT 40163
#define IDC_STATIC -1
// Next default values for new objects