diff --git a/Windows/KeyboardDevice.cpp b/Windows/KeyboardDevice.cpp index c8e2811016..807c346614 100644 --- a/Windows/KeyboardDevice.cpp +++ b/Windows/KeyboardDevice.cpp @@ -67,4 +67,142 @@ int KeyboardDevice::UpdateState(InputState &input_state) { input_state.pad_lstick_x += analogX; input_state.pad_lstick_y += analogY; return 0; -} \ No newline at end of file +} + +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; +} diff --git a/Windows/WndMainWindow.cpp b/Windows/WndMainWindow.cpp index 81881d958a..886ab7bb84 100644 --- a/Windows/WndMainWindow.cpp +++ b/Windows/WndMainWindow.cpp @@ -2,6 +2,7 @@ #include #include +#include #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; } diff --git a/Windows/ppsspp.rc b/Windows/ppsspp.rc index dff741a5fb..3d428ef5aa 100644 --- a/Windows/ppsspp.rc +++ b/Windows/ppsspp.rc @@ -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" ///////////////////////////////////////////////////////////////////////////// // diff --git a/Windows/psp.jpg b/Windows/psp.jpg new file mode 100644 index 0000000000..d96900753d Binary files /dev/null and b/Windows/psp.jpg differ diff --git a/Windows/resource.h b/Windows/resource.h index c460f728f4..7a9c57097f 100644 --- a/Windows/resource.h +++ b/Windows/resource.h @@ -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