diff --git a/plugins/LilyPad/Config.cpp b/plugins/LilyPad/Config.cpp index 2b531201c..0e425a853 100644 --- a/plugins/LilyPad/Config.cpp +++ b/plugins/LilyPad/Config.cpp @@ -1,5 +1,5 @@ /* LilyPad - Pad plugin for PS2 Emulator - * Copyright (C) 2002-2014 PCSX2 Dev Team/ChickenLiver + * Copyright (C) 2002-2017 PCSX2 Dev Team/ChickenLiver * * PCSX2 is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free @@ -39,7 +39,8 @@ const wchar_t *padTypes[] = { L"Dualshock 2", L"Guitar", L"Pop'n Music controller", - L"PS1 Mouse"}; + L"PS1 Mouse", + L"neGcon"}; // Hacks or configurations which PCSX2 needs with a specific value void PCSX2_overrideConfig(GeneralConfig &config_in_out) @@ -47,7 +48,7 @@ void PCSX2_overrideConfig(GeneralConfig &config_in_out) config_in_out.disableScreenSaver = 0; // Not required - handled internally by PCSX2 config_in_out.escapeFullscreenHack = 0; // Not required - handled internally by PCSX2 config_in_out.saveStateTitle = 0; // Not required - handled internally by PCSX2 - config_in_out.closeHacks = 0; // Cannot function when used by PCSX2 + config_in_out.closeHack = 0; // Cannot function when used by PCSX2 } // Dialog widgets which should be disabled - mostly matching PCSX2_overrideConfig @@ -58,8 +59,7 @@ const UINT *PCSX2_disabledWidgets() IDC_ESCAPE_FULLSCREEN_HACK, IDC_SAVE_STATE_TITLE, IDC_ANALOG_START1, // start in analog mode - only useful for PS1 - IDC_CLOSE_HACK1, - IDC_CLOSE_HACK2, + IDC_CLOSE_HACK, 0}; return disabledWidgets; } @@ -112,7 +112,6 @@ const GeneralSettingsBool BoolOptionsInfo[] = { {L"Save State in Title", IDC_SAVE_STATE_TITLE, 0}, // Not required for PCSX2 {L"GH2", IDC_GH2_HACK, 0}, - {L"Turbo Key Hack", IDC_TURBO_KEY_HACK, 0}, }; void Populate(int port, int slot, int padtype); @@ -287,47 +286,47 @@ wchar_t *GetCommandStringW(u8 command, int port, int slot) return temp; } /* Get text from the buttons. */ - if (command >= 0x0C && command <= 0x28) { + if (command >= 0x0C && command <= 0x2A) { HWND hWnd = GetDlgItem(hWnds[port][slot][padtype], 0x10F0 + command); if (!hWnd) { wchar_t *strings[] = { - L"Lock Buttons", - L"Lock Input", - L"Lock Direction", - L"Mouse", - L"Select", - L"L3", - L"R3", - L"Start", - L"Up", - L"Right", - L"Down", - L"Left", - L"L2", - L"R2", - L"L1", - L"R1", - L"Triangle", - L"Circle", - L"Square", - L"Cross", - L"L-Stick Up", - L"L-Stick Right", - L"L-Stick Down", - L"L-Stick Left", - L"R-Stick Up", - L"R-Stick Right", - L"R-Stick Down", - L"R-Stick Left", - L"Analog", + L"Lock Buttons", // 0x0C (12) + L"Lock Input", // 0x0D (13) + L"Lock Direction", // 0x0E (14) + L"Mouse", // 0x0F (15) + L"Select", // 0x10 (16) + L"L3", // 0x11 (17) + L"R3", // 0x12 (18) + L"Start", // 0x13 (19) + L"Up", // 0x14 (20) + L"Right", // 0x15 (21) + L"Down", // 0x16 (22) + L"Left", // 0x17 (23) + L"L2", // 0x18 (24) + L"R2", // 0x19 (25) + L"L1", // 0x1A (26) + L"R1", // 0x1B (27) + L"Triangle", // 0x1C (28) + L"Circle", // 0x1D (29) + L"Square", // 0x1E (30) + L"Cross", // 0x1F (31) + L"L-Stick Up", // 0x20 (32) + L"L-Stick Right", // 0x21 (33) + L"L-Stick Down", // 0x22 (34) + L"L-Stick Left", // 0x23 (35) + L"R-Stick Up", // 0x24 (36) + L"R-Stick Right", // 0x25 (37) + L"R-Stick Down", // 0x26 (38) + L"R-Stick Left", // 0x27 (39) + L"Analog", // 0x28 (40) + L"Excluded Input", // 0x29 (41) + L"Turbo", // 0x2A (42) }; return strings[command - 0xC]; } int res = GetWindowTextW(hWnd, temp, 20); if ((unsigned int)res - 1 <= 18) return temp; - } else if (command == 0x7F) { - return L"Ignore Key"; } return L""; } @@ -366,7 +365,7 @@ void CALLBACK PADsetSettingsDir(const char *dir) } int GetBinding(int port, int slot, int index, Device *&dev, Binding *&b, ForceFeedbackBinding *&ffb); -int BindCommand(Device *dev, unsigned int uid, unsigned int port, unsigned int slot, unsigned int padtype, int command, int sensitivity, int turbo, int deadZone, int skipDeadZone); +int BindCommand(Device *dev, unsigned int uid, unsigned int port, unsigned int slot, unsigned int padtype, int command, int sensitivity, int rapidFire, int deadZone, int skipDeadZone); int CreateEffectBinding(Device *dev, wchar_t *effectName, unsigned int port, unsigned int slot, unsigned int padtype, unsigned int motor, ForceFeedbackBinding **binding); @@ -381,8 +380,8 @@ void SelChanged(int port, int slot) wchar_t *devName = L"N/A"; wchar_t *key = L"N/A"; wchar_t *command = L"N/A"; - // Second value is now turbo. - int turbo = -1; + // Second value is now rapidFire. + int rapidFire = -1; int sensitivity = 0; int deadZone = 0; int skipDeadZone = 0; @@ -448,26 +447,22 @@ void SelChanged(int port, int slot) if (b) { bFound++; VirtualControl *control = &dev->virtualControls[b->controlIndex]; - // Ignore - if (b->command != 0x7F) { - // Only relative axes can't have negative sensitivity. - if (((control->uid >> 16) & 0xFF) == RELAXIS) { - disableFlip = 1; - } - turbo += b->turbo; - if (b->sensitivity < 0) { - flipped++; - sensitivity -= b->sensitivity; - } else { - sensitivity += b->sensitivity; - } - if (((control->uid >> 16) & 0xFF) != PSHBTN && ((control->uid >> 16) & 0xFF) != TGLBTN) { - deadZone += b->deadZone; - skipDeadZone += b->skipDeadZone; - nonButtons++; - } - } else + // Only relative axes can't have negative sensitivity. + if (((control->uid >> 16) & 0xFF) == RELAXIS) { disableFlip = 1; + } + rapidFire += b->rapidFire; + if (b->sensitivity < 0) { + flipped++; + sensitivity -= b->sensitivity; + } else { + sensitivity += b->sensitivity; + } + if (((control->uid >> 16) & 0xFF) != PSHBTN && ((control->uid >> 16) & 0xFF) != TGLBTN) { + deadZone += b->deadZone; + skipDeadZone += b->skipDeadZone; + nonButtons++; + } } else ffbFound++; } @@ -475,14 +470,14 @@ void SelChanged(int port, int slot) } if ((bFound && ffbFound) || ffbFound > 1) { ffb = 0; - turbo = -1; + rapidFire = -1; deadZone = 0; skipDeadZone = 0; sensitivity = 0; disableFlip = 1; bFound = ffbFound = 0; } else if (bFound) { - turbo++; + rapidFire++; sensitivity /= bFound; if (nonButtons) { deadZone /= nonButtons; @@ -496,7 +491,7 @@ void SelChanged(int port, int slot) } } - for (i = IDC_DPAD; i <= IDC_DEVICE_SELECT; i++) { + for (i = IDC_DPAD; i <= IDC_FACE_ANALOG; i++) { hWndTemp = GetDlgItem(hWnd, i); if (hWndTemp) ShowWindow(hWndTemp, !ffb && !b); @@ -556,13 +551,13 @@ void SelChanged(int port, int slot) if (disableFlip) EnableWindow(GetDlgItem(hWnd, IDC_FLIP), 0); - EnableWindow(GetDlgItem(hWnd, IDC_TURBO), turbo >= 0); - if (turbo > 0 && turbo < bFound) { - SendMessage(GetDlgItem(hWnd, IDC_TURBO), BM_SETSTYLE, BS_AUTO3STATE, 0); - CheckDlgButton(hWnd, IDC_TURBO, BST_INDETERMINATE); + EnableWindow(GetDlgItem(hWnd, IDC_RAPID_FIRE), rapidFire >= 0); + if (rapidFire > 0 && rapidFire < bFound) { + SendMessage(GetDlgItem(hWnd, IDC_RAPID_FIRE), BM_SETSTYLE, BS_AUTO3STATE, 0); + CheckDlgButton(hWnd, IDC_RAPID_FIRE, BST_INDETERMINATE); } else { - SendMessage(GetDlgItem(hWnd, IDC_TURBO), BM_SETSTYLE, BS_AUTOCHECKBOX, 0); - CheckDlgButton(hWnd, IDC_TURBO, BST_CHECKED * (bFound && turbo == bFound)); + SendMessage(GetDlgItem(hWnd, IDC_RAPID_FIRE), BM_SETSTYLE, BS_AUTOCHECKBOX, 0); + CheckDlgButton(hWnd, IDC_RAPID_FIRE, BST_CHECKED * (bFound && rapidFire == bFound)); } HWND hWndCombo = GetDlgItem(hWnd, IDC_AXIS_DIRECTION); int enableCombo = 0; @@ -717,7 +712,7 @@ int ListBoundEffect(int port, int slot, Device *dev, ForceFeedbackBinding *b) } // Only for use with control bindings. Affects all highlighted bindings. -void ChangeValue(int port, int slot, int *newSensitivity, int *newTurbo, int *newDeadZone, int *newSkipDeadZone) +void ChangeValue(int port, int slot, int *newSensitivity, int *newRapidFire, int *newDeadZone, int *newSkipDeadZone) { int padtype = config.padConfigs[port][slot].type; if (!hWnds[port][slot][padtype]) @@ -753,8 +748,8 @@ void ChangeValue(int port, int slot, int *newSensitivity, int *newTurbo, int *ne b->skipDeadZone = *newSkipDeadZone; } } - if (newTurbo) { - b->turbo = *newTurbo; + if (newRapidFire) { + b->rapidFire = *newRapidFire; } } PropSheet_Changed(hWndProp, hWnds[port][slot][padtype]); @@ -821,19 +816,24 @@ void Populate(int port, int slot, int padtype) hWnd = GetDlgItem(hWnds[port][slot][padtype], IDC_FORCEFEEDBACK); SendMessage(hWnd, CB_RESETCONTENT, 0, 0); int added = 0; + bool enable = false; for (int i = 0; i < dm->numDevices; i++) { Device *dev = dm->devices[i]; if (dev->enabled && dev->numFFAxes && dev->numFFEffectTypes) { SendMessage(hWnd, CB_INSERTSTRING, added, (LPARAM)dev->displayName); SendMessage(hWnd, CB_SETITEMDATA, added, i); added++; + + int selectedDevice = config.deviceSelect[port][slot]; + if (selectedDevice == -1 || dm->devices[selectedDevice] == dev) { + enable = true; + } } } SendMessage(hWnd, CB_SETCURSEL, 0, 0); - EnableWindow(hWnd, added != 0); - EnableWindow(GetDlgItem(hWnds[port][slot][padtype], ID_BIG_MOTOR), added != 0); - EnableWindow(GetDlgItem(hWnds[port][slot][padtype], ID_SMALL_MOTOR), added != 0); - + EnableWindow(hWnd, added != 0 && enable); + EnableWindow(GetDlgItem(hWnds[port][slot][padtype], ID_BIG_MOTOR), added != 0 && enable); + EnableWindow(GetDlgItem(hWnds[port][slot][padtype], ID_SMALL_MOTOR), added != 0 && enable); SelChanged(port, slot); } @@ -871,7 +871,7 @@ int SaveSettings(wchar_t *file = 0) for (int i = 0; i < sizeof(BoolOptionsInfo) / sizeof(BoolOptionsInfo[0]); i++) { noError &= WritePrivateProfileInt(L"General Settings", BoolOptionsInfo[i].name, config.bools[i], file); } - WritePrivateProfileInt(L"General Settings", L"Close Hacks", config.closeHacks, file); + WritePrivateProfileInt(L"General Settings", L"Close Hack", config.closeHack, file); WritePrivateProfileInt(L"General Settings", L"Keyboard Mode", config.keyboardApi, file); WritePrivateProfileInt(L"General Settings", L"Mouse Mode", config.mouseApi, file); @@ -917,7 +917,7 @@ int SaveSettings(wchar_t *file = 0) Binding *b = dev->pads[port][slot][padtype].bindings + j; VirtualControl *c = &dev->virtualControls[b->controlIndex]; wsprintfW(temp, L"Binding %i", bindingCount++); - wsprintfW(temp2, L"0x%08X, %i, %i, %i, %i, %i, %i, %i, %i", c->uid, port, b->command, b->sensitivity, b->turbo, slot, b->deadZone, b->skipDeadZone, padtype); + wsprintfW(temp2, L"0x%08X, %i, %i, %i, %i, %i, %i, %i, %i", c->uid, port, b->command, b->sensitivity, b->rapidFire, slot, b->deadZone, b->skipDeadZone, padtype); noError &= WritePrivateProfileStringW(id, temp, temp2, file); } for (int j = 0; j < dev->pads[port][slot][padtype].numFFBindings; j++) { @@ -953,7 +953,7 @@ int LoadSettings(int force, wchar_t *file) return 0; if (createIniDir) { - CreateDirectory(L"inis", 0); + PADsetSettingsDir("inis"); createIniDir = false; } @@ -981,9 +981,7 @@ int LoadSettings(int force, wchar_t *file) for (int i = 0; i < sizeof(BoolOptionsInfo) / sizeof(BoolOptionsInfo[0]); i++) { config.bools[i] = GetPrivateProfileBool(L"General Settings", BoolOptionsInfo[i].name, BoolOptionsInfo[i].defaultValue, file); } - config.closeHacks = (u8)GetPrivateProfileIntW(L"General Settings", L"Close Hacks", 0, file); - if (config.closeHacks & 1) - config.closeHacks &= ~2; + config.closeHack = (u8)GetPrivateProfileIntW(L"General Settings", L"Close Hack", 0, file); config.keyboardApi = (DeviceAPI)GetPrivateProfileIntW(L"General Settings", L"Keyboard Mode", WM, file); if (!config.keyboardApi) @@ -1046,7 +1044,7 @@ int LoadSettings(int force, wchar_t *file) } last = 1; unsigned int uid; - int port, command, sensitivity, turbo, slot = 0, deadZone = 0, skipDeadZone = 0, padtype = 0; + int port, command, sensitivity, rapidFire, slot = 0, deadZone = 0, skipDeadZone = 0, padtype = 0; int w = 0; char string[1000]; while (temp2[w]) { @@ -1054,7 +1052,7 @@ int LoadSettings(int force, wchar_t *file) w++; } string[w] = 0; - int len = sscanf(string, " %i , %i , %i , %i , %i , %i , %i , %i , %i", &uid, &port, &command, &sensitivity, &turbo, &slot, &deadZone, &skipDeadZone, &padtype); + int len = sscanf(string, " %i , %i , %i , %i , %i , %i , %i , %i , %i", &uid, &port, &command, &sensitivity, &rapidFire, &slot, &deadZone, &skipDeadZone, &padtype); if (len >= 5 && type) { VirtualControl *c = dev->GetVirtualControl(uid); if (!c) @@ -1071,7 +1069,7 @@ int LoadSettings(int force, wchar_t *file) padtype = skipDeadZone; skipDeadZone = 0; } - BindCommand(dev, uid, port, slot, padtype, command, sensitivity, turbo, deadZone, skipDeadZone); + BindCommand(dev, uid, port, slot, padtype, command, sensitivity, rapidFire, deadZone, skipDeadZone); } } } @@ -1098,7 +1096,7 @@ int LoadSettings(int force, wchar_t *file) string[w] = 0; // wcstok not in ntdll. More effore than its worth to shave off // whitespace without it. - if (sscanf(string, " %20s %i , %i , %i , %i", effect, &port, &motor, &slot, &padtype) == 5) { + if (sscanf(string, " %100s %i , %i , %i , %i", effect, &port, &motor, &slot, &padtype) == 5) { char *s; if (oldIni) { // Make sure bindings aren't applied to "Unplugged" padtype and FF settings are read from old location. if (config.padConfigs[port][slot].type != 0) { @@ -1296,7 +1294,7 @@ void DeleteBinding(int port, int slot, int padtype, Device *dev, Binding *b) dev->pads[port][slot][padtype].numBindings--; } -void DeleteBinding(int port, int slot, Device *dev, ForceFeedbackBinding *b) +void DeleteFFBinding(int port, int slot, Device *dev, ForceFeedbackBinding *b) { int padtype = config.padConfigs[port][slot].type; if (dev->enabled && hWnds[port][slot][padtype]) { @@ -1324,7 +1322,7 @@ int DeleteByIndex(int port, int slot, int index) if (b) { DeleteBinding(port, slot, padtype, dev, b); } else { - DeleteBinding(port, slot, dev, ffb); + DeleteFFBinding(port, slot, dev, ffb); } return 1; } @@ -1383,7 +1381,7 @@ int CreateEffectBinding(Device *dev, wchar_t *effectID, unsigned int port, unsig return ListBoundEffect(port, slot, dev, b); } -int BindCommand(Device *dev, unsigned int uid, unsigned int port, unsigned int slot, unsigned int padtype, int command, int sensitivity, int turbo, int deadZone, int skipDeadZone) +int BindCommand(Device *dev, unsigned int uid, unsigned int port, unsigned int slot, unsigned int padtype, int command, int sensitivity, int rapidFire, int deadZone, int skipDeadZone) { // Checks needed because I use this directly when loading bindings. if (port > 1 || slot > 3 || padtype >= numPadTypes) @@ -1425,7 +1423,7 @@ int BindCommand(Device *dev, unsigned int uid, unsigned int port, unsigned int s p->numBindings++; b->command = command; b->controlIndex = controlIndex; - b->turbo = turbo; + b->rapidFire = rapidFire; b->sensitivity = sensitivity; b->deadZone = deadZone; b->skipDeadZone = skipDeadZone; @@ -1526,13 +1524,12 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l ListView_SetExtendedListViewStyleEx(hWndList, LVS_EX_DOUBLEBUFFER, LVS_EX_DOUBLEBUFFER); LVCOLUMN c; c.mask = LVCF_TEXT | LVCF_WIDTH; - c.cx = 100; + c.cx = 90; c.pszText = L"Device"; ListView_InsertColumn(hWndList, 0, &c); c.cx = 70; c.pszText = L"PC Control"; ListView_InsertColumn(hWndList, 1, &c); - c.cx = 84; c.pszText = L"PS2 Control"; ListView_InsertColumn(hWndList, 2, &c); selected = 0; @@ -1544,8 +1541,6 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l SetupLogSlider(GetDlgItem(hWnd, IDC_SLIDER_SENSITIVITY)); SetupLogSlider(GetDlgItem(hWnd, IDC_SLIDER_DEADZONE)); SetupLogSlider(GetDlgItem(hWnd, IDC_SLIDER_SKIP_DEADZONE)); - if (port || slot) - EnableWindow(GetDlgItem(hWnd, ID_IGNORE), 0); CheckDlgButton(hWnd, IDC_CONFIGURE_ON_BIND, BST_CHECKED * config.configureOnBind); AddTooltip(IDC_BINDINGS_LIST, hWnd); @@ -1553,11 +1548,11 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l AddTooltip(IDC_CONFIGURE_ON_BIND, hWnd); AddTooltip(ID_MOUSE, hWnd); AddTooltip(ID_ANALOG, hWnd); - AddTooltip(ID_IGNORE, hWnd); AddTooltip(ID_LOCK_ALL_INPUT, hWnd); AddTooltip(ID_LOCK_DIRECTION, hWnd); AddTooltip(ID_LOCK_BUTTONS, hWnd); - AddTooltip(IDC_TURBO, hWnd); + AddTooltip(ID_TURBO_KEY, hWnd); + AddTooltip(IDC_RAPID_FIRE, hWnd); AddTooltip(IDC_FLIP, hWnd); AddTooltip(IDC_SLIDER_DEADZONE, hWnd); AddTooltip(IDC_SLIDER_SKIP_DEADZONE, hWnd); @@ -1583,6 +1578,7 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l EnableWindow(hWndDS, added != 0); Populate(port, slot, padtype); + ListView_SetColumnWidth(hWndList, 2, LVSCW_AUTOSIZE_USEHEADER); } break; case WM_DEVICECHANGE: if (wParam == DBT_DEVNODES_CHANGED) { @@ -1613,25 +1609,36 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l InitInfo info = {selected == 0x7F, 1, hWndProp, &hWndButtonProc}; Device *dev = dm->GetActiveDevice(&info, &uid, &index, &value); int selectedDevice = config.deviceSelect[port][slot]; - if (dev && (selectedDevice == -1 || dm->devices[selectedDevice] == dev)) { - int command = selected; - // Good idea to do this first, as BindCommand modifies the ListView, which will - // call it anyways, which is a bit funky. - EndBinding(hWnd); - UnselectAll(hWndList); - int index = -1; - if (command == 0x7F && dev->api == IGNORE_KEYBOARD) { - index = BindCommand(dev, uid, 0, 0, 0, command, BASE_SENSITIVITY, 0, 0, 0); - } else if (command < 0x30) { - index = BindCommand(dev, uid, port, slot, padtype, command, BASE_SENSITIVITY, 0, 0, 0); - } - if (index >= 0) { - PropSheet_Changed(hWndProp, hWnds[port][slot][padtype]); - ListView_SetItemState(hWndList, index, LVIS_SELECTED, LVIS_SELECTED); - ListView_EnsureVisible(hWndList, index, 0); - config.bind = true; + + if (dev == nullptr || (selectedDevice != -1 && dm->devices[selectedDevice] != dev)) + return 0; + + //Check the bindings for an excluded input, and ignore it if found. + PadBindings *p_c = dev->pads[port][slot] + padtype; + for (int i = 0; i < p_c->numBindings; i++) { + Binding *b2 = p_c->bindings + i; + int uid2 = dev->virtualControls[b2->controlIndex].uid; + if (b2->command == 0x29 && uid == uid2) { + return 0; } } + + int command = selected; + // Good idea to do this first, as BindCommand modifies the ListView, which will + // call it anyways, which is a bit funky. + EndBinding(hWnd); + UnselectAll(hWndList); + int index = -1; + if (command < 0x30) { + index = BindCommand(dev, uid, port, slot, padtype, command, BASE_SENSITIVITY, 0, 0, 0); + } + if (index >= 0) { + PropSheet_Changed(hWndProp, hWnds[port][slot][padtype]); + ListView_SetItemState(hWndList, index, LVIS_SELECTED, LVIS_SELECTED); + ListView_EnsureVisible(hWndList, index, 0); + config.bind = true; + ListView_SetColumnWidth(hWndList, 2, LVSCW_AUTOSIZE_USEHEADER); + } } break; case WM_SYSKEYDOWN: @@ -1666,8 +1673,10 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l if (key->wVKey == VK_DELETE || key->wVKey == VK_BACK) { - if (DeleteSelected(port, slot)) + if (DeleteSelected(port, slot)) { PropSheet_Changed(hWndProp, hWnds[0]); + ListView_SetColumnWidth(hWndList, 2, LVSCW_AUTOSIZE_USEHEADER); + } } } // Update sensitivity and motor/binding display on redraw @@ -1739,7 +1748,7 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l uid = (uid & 0x00FFFFFF) | axisUIDs[cbsel]; Binding backup = *b; DeleteSelected(port, slot); - int index = BindCommand(dev, uid, port, slot, padtype, backup.command, backup.sensitivity, backup.turbo, backup.deadZone, backup.skipDeadZone); + int index = BindCommand(dev, uid, port, slot, padtype, backup.command, backup.sensitivity, backup.rapidFire, backup.deadZone, backup.skipDeadZone); ListView_SetItemState(hWndList, index, LVIS_SELECTED, LVIS_SELECTED); PropSheet_Changed(hWndProp, hWnd); } @@ -1749,6 +1758,7 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l int selectedDev = SendMessage(GetDlgItem(hWnd, IDC_DEVICE_SELECT), CB_GETCURSEL, 0, 0); config.deviceSelect[port][slot] = SendMessage(GetDlgItem(hWnd, IDC_DEVICE_SELECT), CB_GETITEMDATA, selectedDev, 0); RefreshEnabledDevicesAndDisplay(1, hWndGeneral, 1); + ListView_SetColumnWidth(hWndList, 2, LVSCW_AUTOSIZE_USEHEADER); } else if (HIWORD(wParam) == CBN_SELCHANGE && LOWORD(wParam) == IDC_FF_EFFECT) { int typeIndex = SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0); if (typeIndex >= 0) @@ -1850,24 +1860,13 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l SetTimer(hWnd, 1, 3000, 0); } } - } else if ((cmd >= ID_LOCK_BUTTONS && cmd <= ID_ANALOG) || cmd == ID_IGNORE) { // || cmd == ID_FORCE_FEEDBACK) { + } else if (cmd >= ID_LOCK_BUTTONS && cmd <= ID_TURBO_KEY) { // || cmd == ID_FORCE_FEEDBACK) { // Messes up things, unfortunately. // End binding on a bunch of notification messages, and // this will send a bunch. // UnselectAll(hWndList); EndBinding(hWnd); - if (cmd != ID_IGNORE) { - selected = cmd - (ID_SELECT - 0x10); - } else { - selected = 0x7F; - for (int i = 0; i < dm->numDevices; i++) { - if (dm->devices[i]->api != IGNORE_KEYBOARD) { - dm->DisableDevice(i); - } else { - dm->EnableDevice(i); - } - } - } + selected = cmd - (ID_SELECT - 0x10); hWndButtonProc.SetWndHandle(GetDlgItem(hWnd, cmd)); hWndButtonProc.Eat(DoNothingWndProc, 0); @@ -1883,11 +1882,11 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l } else if (cmd == IDC_CONFIGURE_ON_BIND) { config.configureOnBind = IsDlgButtonChecked(hWnd, IDC_CONFIGURE_ON_BIND); } - if (cmd == IDC_TURBO) { + if (cmd == IDC_RAPID_FIRE) { // Don't allow setting it back to indeterminate. - SendMessage(GetDlgItem(hWnd, IDC_TURBO), BM_SETSTYLE, BS_AUTOCHECKBOX, 0); - int turbo = (IsDlgButtonChecked(hWnd, IDC_TURBO) == BST_CHECKED); - ChangeValue(port, slot, 0, &turbo, 0, 0); + SendMessage(GetDlgItem(hWnd, IDC_RAPID_FIRE), BM_SETSTYLE, BS_AUTOCHECKBOX, 0); + int rapidFire = (IsDlgButtonChecked(hWnd, IDC_RAPID_FIRE) == BST_CHECKED); + ChangeValue(port, slot, 0, &rapidFire, 0, 0); } else if (cmd == IDC_FLIP) { int val = GetLogSliderVal(hWnd, IDC_SLIDER_SENSITIVITY); ChangeValue(port, slot, &val, 0, 0, 0); @@ -1994,7 +1993,6 @@ void UpdatePadPages() HPROPSHEETPAGE pages[10]; int count = 0; memset(hWnds, 0, sizeof(hWnds)); - int slot = 0; for (int port = 0; port < 2; port++) { for (int slot = 0; slot < 4; slot++) { if (config.padConfigs[port][slot].type == DisabledPad) @@ -2017,6 +2015,8 @@ void UpdatePadPages() psp.pszTemplate = MAKEINTRESOURCE(IDD_CONFIG_POPN); else if (config.padConfigs[port][slot].type == MousePad) psp.pszTemplate = MAKEINTRESOURCE(IDD_CONFIG_PS1_MOUSE); + else if (config.padConfigs[port][slot].type == neGconPad) + psp.pszTemplate = MAKEINTRESOURCE(IDD_CONFIG_NEGCON); else psp.pszTemplate = MAKEINTRESOURCE(IDD_CONFIG); @@ -2119,7 +2119,7 @@ void UpdatePadList(HWND hWnd) CheckDlgButton(hWnd, IDC_ANALOG_START1, BST_CHECKED * config.padConfigs[port][slot].autoAnalog); } EnableWindow(hWndCombo, enable); - EnableWindow(hWndAnalog, enable); + EnableWindow(hWndAnalog, config.padConfigs[port][slot].type == Dualshock2Pad ? enable : 0); //ListView_SetExtendedListViewStyleEx(hWndList, LVS_EX_DOUBLEBUFFER|LVS_EX_ONECLICKACTIVATE, LVS_EX_DOUBLEBUFFER|LVS_EX_ONECLICKACTIVATE); recurse = 0; } @@ -2140,20 +2140,15 @@ INT_PTR CALLBACK GeneralDialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, L c.cx = 120; c.pszText = L"Type"; ListView_InsertColumn(hWndList, 1, &c); - if (config.multitap[0] || config.multitap[1]) { - c.cx = 84; - } else { - c.cx = 101; - } c.pszText = L"Bindings"; ListView_InsertColumn(hWndList, 2, &c); + ListView_SetColumnWidth(hWndList, 2, LVSCW_AUTOSIZE_USEHEADER); selected = 0; ListView_SetExtendedListViewStyleEx(hWndList, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER); SendMessage(hWndList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); for (int i = 0; i < numPadTypes; i++) SendMessage(hWndCombo, CB_ADDSTRING, 0, (LPARAM)padTypes[i]); - if (ps2e) { // This disabled some widgets which are not required for PCSX2. // Currently the trigger is that it's in PS2 emulation mode @@ -2178,8 +2173,7 @@ INT_PTR CALLBACK GeneralDialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, L for (int j = 0; j < sizeof(BoolOptionsInfo) / sizeof(BoolOptionsInfo[0]); j++) { CheckDlgButton(hWnd, BoolOptionsInfo[j].ControlId, BST_CHECKED * config.bools[j]); } - CheckDlgButton(hWnd, IDC_CLOSE_HACK1, BST_CHECKED * (config.closeHacks & 1)); - CheckDlgButton(hWnd, IDC_CLOSE_HACK2, BST_CHECKED * ((config.closeHacks & 2) >> 1)); + CheckDlgButton(hWnd, IDC_CLOSE_HACK, BST_CHECKED * config.closeHack); AddTooltip(IDC_M_WM, hWnd); AddTooltip(IDC_M_RAW, hWnd); @@ -2189,6 +2183,7 @@ INT_PTR CALLBACK GeneralDialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, L AddTooltip(IDC_PAD_LIST, hWnd); AddTooltip(IDC_PAD_TYPE, hWnd); AddTooltip(IDC_DIAG_LIST, hWnd); + AddTooltip(IDC_G_XI, hWnd); AddTooltip(IDC_ANALOG_START1, hWnd); if (config.keyboardApi < 0 || config.keyboardApi > 3) @@ -2263,21 +2258,13 @@ INT_PTR CALLBACK GeneralDialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, L config.padConfigs[port][slot].autoAnalog = (IsDlgButtonChecked(hWnd, IDC_ANALOG_START1) == BST_CHECKED); PropSheet_Changed(hWndProp, hWnd); } else { - int t = IDC_CLOSE_HACK1; - int test = LOWORD(wParam); - if (test == IDC_CLOSE_HACK1) { - CheckDlgButton(hWnd, IDC_CLOSE_HACK2, BST_UNCHECKED); - } else if (test == IDC_CLOSE_HACK2) { - CheckDlgButton(hWnd, IDC_CLOSE_HACK1, BST_UNCHECKED); - } int mtap = config.multitap[0] + 2 * config.multitap[1]; for (int j = 0; j < sizeof(BoolOptionsInfo) / sizeof(BoolOptionsInfo[0]); j++) { config.bools[j] = (IsDlgButtonChecked(hWnd, BoolOptionsInfo[j].ControlId) == BST_CHECKED); } - config.closeHacks = (IsDlgButtonChecked(hWnd, IDC_CLOSE_HACK1) == BST_CHECKED) | - ((IsDlgButtonChecked(hWnd, IDC_CLOSE_HACK2) == BST_CHECKED) << 1); + config.closeHack = IsDlgButtonChecked(hWnd, IDC_CLOSE_HACK) == BST_CHECKED; for (i = 0; i < 4; i++) { if (i && IsDlgButtonChecked(hWnd, IDC_KB_DISABLE + i) == BST_CHECKED) { @@ -2290,16 +2277,15 @@ INT_PTR CALLBACK GeneralDialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, L if (mtap != config.multitap[0] + 2 * config.multitap[1]) { UpdatePadPages(); - if (config.multitap[0] || config.multitap[1]) { - ListView_SetColumnWidth(hWndList, 2, 84); - } else { - ListView_SetColumnWidth(hWndList, 2, 101); - } } RefreshEnabledDevicesAndDisplay(0, hWnd, 1); UpdatePadList(hWnd); PropSheet_Changed(hWndProp, hWnd); + + if (mtap != config.multitap[0] + 2 * config.multitap[1]) { + ListView_SetColumnWidth(hWndList, 2, LVSCW_AUTOSIZE_USEHEADER); + } } break; case WM_NOTIFY: { diff --git a/plugins/LilyPad/Config.h b/plugins/LilyPad/Config.h index a348704e5..e285076e5 100644 --- a/plugins/LilyPad/Config.h +++ b/plugins/LilyPad/Config.h @@ -1,5 +1,5 @@ /* LilyPad - Pad plugin for PS2 Emulator - * Copyright (C) 2002-2014 PCSX2 Dev Team/ChickenLiver + * Copyright (C) 2002-2017 PCSX2 Dev Team/ChickenLiver * * PCSX2 is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free @@ -35,13 +35,12 @@ public: int deviceSelect[2][4]; - u8 closeHacks; + u8 closeHack; DeviceAPI keyboardApi; DeviceAPI mouseApi; // Derived value, calculated by GetInput(). - u8 ignoreKeys; u8 configureOnBind; bool bind; @@ -69,7 +68,6 @@ public: u8 saveStateTitle; u8 GH2; - u8 turboKeyHack; }; u8 bools[15]; }; diff --git a/plugins/LilyPad/Default.ini b/plugins/LilyPad/Default.ini index bcbd379c9..e2dc304e6 100644 --- a/plugins/LilyPad/Default.ini +++ b/plugins/LilyPad/Default.ini @@ -15,8 +15,7 @@ Disable Screen Saver=0 Logging=0 Save State in Title=0 GH2=0 -Turbo Key Hack=0 -Close Hacks=0 +Close Hack=0 Keyboard Mode=2 Mouse Mode=0 [Pad Settings] @@ -103,6 +102,19 @@ Binding 49=0x01020013, 0, 33, 3000, 0, 0, 13172, 4 Binding 50=0x02020013, 0, 35, 3000, 0, 0, 13172, 4 Binding 51=0x01020014, 0, 32, 3000, 0, 0, 13172, 4 Binding 52=0x02020014, 0, 34, 3000, 0, 0, 13172, 4 +Binding 53=0x00200000, 0, 20, 65536, 0, 0, 1, 5 +Binding 54=0x00200001, 0, 22, 65536, 0, 0, 1, 5 +Binding 55=0x00200002, 0, 23, 65536, 0, 0, 1, 5 +Binding 56=0x00200003, 0, 21, 65536, 0, 0, 1, 5 +Binding 57=0x00200004, 0, 19, 65536, 0, 0, 1, 5 +Binding 58=0x00200008, 0, 26, 65536, 0, 0, 1, 5 +Binding 59=0x00200009, 0, 27, 65536, 0, 0, 1, 5 +Binding 60=0x0020000C, 0, 30, 65536, 0, 0, 1, 5 +Binding 61=0x0020000D, 0, 29, 65536, 0, 0, 1, 5 +Binding 62=0x0020000E, 0, 31, 65536, 0, 0, 1, 5 +Binding 63=0x0020000F, 0, 28, 65536, 0, 0, 1, 5 +Binding 64=0x01020013, 0, 33, 87183, 0, 0, 13172, 5 +Binding 65=0x02020013, 0, 35, 87183, 0, 0, 13172, 5 FF Binding 0=Constant 0, 0, 0, 1, 0, 65536, 1, 0 FF Binding 1=Constant 0, 1, 0, 1, 0, 0, 1, 65536 [Device 1] @@ -163,6 +175,19 @@ Binding 49=0x01020013, 1, 33, 3000, 0, 0, 13172, 4 Binding 50=0x02020013, 1, 35, 3000, 0, 0, 13172, 4 Binding 51=0x01020014, 1, 32, 3000, 0, 0, 13172, 4 Binding 52=0x02020014, 1, 34, 3000, 0, 0, 13172, 4 +Binding 53=0x00200000, 1, 20, 65536, 0, 0, 1, 5 +Binding 54=0x00200001, 1, 22, 65536, 0, 0, 1, 5 +Binding 55=0x00200002, 1, 23, 65536, 0, 0, 1, 5 +Binding 56=0x00200003, 1, 21, 65536, 0, 0, 1, 5 +Binding 57=0x00200004, 1, 19, 65536, 0, 0, 1, 5 +Binding 58=0x00200008, 1, 26, 65536, 0, 0, 1, 5 +Binding 59=0x00200009, 1, 27, 65536, 0, 0, 1, 5 +Binding 60=0x0020000C, 1, 30, 65536, 0, 0, 1, 5 +Binding 61=0x0020000D, 1, 29, 65536, 0, 0, 1, 5 +Binding 62=0x0020000E, 1, 31, 65536, 0, 0, 1, 5 +Binding 63=0x0020000F, 1, 28, 65536, 0, 0, 1, 5 +Binding 64=0x01020013, 1, 33, 87183, 0, 0, 13172, 5 +Binding 65=0x02020013, 1, 35, 87183, 0, 0, 13172, 5 FF Binding 0=Constant 1, 0, 0, 1, 0, 65536, 1, 0 FF Binding 1=Constant 1, 1, 0, 1, 0, 0, 1, 65536 [Device 12] diff --git a/plugins/LilyPad/InputManager.h b/plugins/LilyPad/InputManager.h index 5504d51c2..22b0084bd 100644 --- a/plugins/LilyPad/InputManager.h +++ b/plugins/LilyPad/InputManager.h @@ -1,5 +1,5 @@ /* LilyPad - Pad plugin for PS2 Emulator - * Copyright (C) 2002-2014 PCSX2 Dev Team/ChickenLiver + * Copyright (C) 2002-2017 PCSX2 Dev Team/ChickenLiver * * PCSX2 is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free @@ -38,6 +38,7 @@ enum PadType { GuitarPad, PopnPad, MousePad, + neGconPad, numPadTypes // total number of PadTypes. Add new PadType above this line. }; @@ -81,7 +82,7 @@ struct Binding int sensitivity; int deadZone; int skipDeadZone; - unsigned char turbo; + unsigned char rapidFire; }; #define UID_AXIS (1U << 31) diff --git a/plugins/LilyPad/LilyPad.cpp b/plugins/LilyPad/LilyPad.cpp index ecfe20542..43a449842 100644 --- a/plugins/LilyPad/LilyPad.cpp +++ b/plugins/LilyPad/LilyPad.cpp @@ -1,5 +1,5 @@ /* LilyPad - Pad plugin for PS2 Emulator - * Copyright (C) 2002-2014 PCSX2 Dev Team/ChickenLiver + * Copyright (C) 2002-2017 PCSX2 Dev Team/ChickenLiver * * PCSX2 is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free @@ -87,6 +87,7 @@ unsigned char inBuf[50]; // windowThreadId = GetWindowThreadProcessId(hWnd, 0); #define MODE_PS1_MOUSE 0x12 +#define MODE_NEGCON 0x23 #define MODE_DIGITAL 0x41 #define MODE_ANALOG 0x73 #define MODE_DS2_NATIVE 0x79 @@ -391,16 +392,13 @@ void ProcessButtonBinding(Binding *b, ButtonSum *sum, int value) value = std::min((int)(((__int64)value * (FULLY_DOWN - (__int64)b->skipDeadZone)) / FULLY_DOWN) + b->skipDeadZone, FULLY_DOWN); } - if (config.turboKeyHack == 1) { // send a tabulator keypress to emulator - //printf("%x\n", b->command); - if (b->command == 0x11) { // L3 button - static unsigned int LastCheck = 0; - unsigned int t = timeGetTime(); - if (t - LastCheck < 300) - return; - QueueKeyEvent(VK_TAB, KEYPRESS); - LastCheck = t; - } + if (b->command == 0x2A) { // Turbo key + static unsigned int LastCheck = 0; + unsigned int t = timeGetTime(); + if (t - LastCheck < 300) + return; + QueueKeyEvent(VK_TAB, KEYPRESS); + LastCheck = t; } int sensitivity = b->sensitivity; @@ -529,8 +527,8 @@ void Update(unsigned int port, unsigned int slot) 0, 0, hWndTop, &hWndGSProc}; #endif dm->Update(&info); - static int turbo = 0; - turbo++; + static int rapidFire = 0; + rapidFire++; for (i = 0; i < dm->numDevices; i++) { Device *dev = dm->devices[i]; // Skip both disabled devices and inactive enabled devices. @@ -546,7 +544,7 @@ void Update(unsigned int port, unsigned int slot) Binding *b = dev->pads[port][slot][padtype].bindings + j; int cmd = b->command; int state = dev->virtualControlState[b->controlIndex]; - if (!(turbo & b->turbo)) { + if (!(rapidFire & b->rapidFire)) { if (cmd > 0x0F && cmd != 0x28) { ProcessButtonBinding(b, &s[port][slot], state); } else if ((state >> 15) && !(dev->oldVirtualControlState[b->controlIndex] >> 15)) { @@ -631,7 +629,7 @@ void Update(unsigned int port, unsigned int slot) } } - if (pads[port][slot].mode == 0x41) { + if (pads[port][slot].mode == MODE_DIGITAL) { for (int i = 0; i <= 1; i++) { if (s[port][slot].sticks[i].horiz >= 100) s[port][slot].buttons[13] += s[port][slot].sticks[i].horiz; @@ -792,6 +790,8 @@ void ResetPad(int port, int slot) memset(&pads[port][slot], 0, sizeof(pads[0][0])); if (config.padConfigs[port][slot].type == MousePad) pads[port][slot].mode = MODE_PS1_MOUSE; + else if (config.padConfigs[port][slot].type == neGconPad) + pads[port][slot].mode = MODE_NEGCON; else pads[port][slot].mode = MODE_DIGITAL; pads[port][slot].umask[0] = pads[port][slot].umask[1] = 0xFF; @@ -967,10 +967,7 @@ ExtraWndProcResult StatusWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPa PrepareActivityState(LOWORD(wParam) != WA_INACTIVE); break; case WM_CLOSE: - if (config.closeHacks & 1) { - QueueKeyEvent(VK_ESCAPE, KEYPRESS); - return NO_WND_PROC; - } else if (config.closeHacks & 2) { + if (config.closeHack) { ExitProcess(0); return NO_WND_PROC; } @@ -1209,6 +1206,14 @@ u8 CALLBACK PADpoll(u8 value) if (query.lastByte == 0) { query.lastByte++; query.currentCommand = value; + + // Only the 0x42(read input and vibration) and 0x43(enter or exit config mode) command cases work outside of config mode, the other cases will be avoided. + if (!pad->config && value != 0x42 && value != 0x43) { + query.numBytes = 0; + query.queryDone = 1; + DEBUG_OUT(0xF3); + return 0xF3; + } switch (value) { // CONFIG_MODE case 0x43: @@ -1228,7 +1233,8 @@ u8 CALLBACK PADpoll(u8 value) Update(query.port, query.slot); ButtonSum *sum = &pad->sum; - if (config.padConfigs[query.port][query.slot].type == MousePad) { + int padtype = config.padConfigs[query.port][query.slot].type; + if (padtype == MousePad) { u8 b1 = 0xFC; if (sum->buttons[9] > 0) // Left button b1 -= 8; @@ -1241,8 +1247,31 @@ u8 CALLBACK PADpoll(u8 value) query.response[6] = sum->sticks[1].vert / 2; query.numBytes = 7; query.lastByte = 1; - DEBUG_OUT(pad->mode); - return pad->mode; + DEBUG_OUT(MODE_PS1_MOUSE); + return MODE_PS1_MOUSE; + } + if (padtype == neGconPad) { + u8 b1 = 0xFF, b2 = 0xFF; + b1 -= (sum->buttons[3] > 0) << 3; // Start + + for (int i = 3; i < 6; i++) { + b2 -= (sum->buttons[i + 4] > 0) << i; // R, A, B + } + for (int i = 4; i < 8; i++) { + b1 -= (sum->buttons[i + 8] > 0) << i; // D-pad Up, Right, Down, Left + } + + query.response[3] = b1; + query.response[4] = b2; + query.response[5] = Cap((sum->sticks[1].horiz + 255) / 2); // Swivel + query.response[6] = (unsigned char)sum->buttons[10]; // I + query.response[7] = (unsigned char)sum->buttons[11]; // II + query.response[8] = (unsigned char)sum->buttons[6]; // L + + query.numBytes = 9; + query.lastByte = 1; + DEBUG_OUT(MODE_NEGCON); + return MODE_NEGCON; } u8 b1 = 0xFF, b2 = 0xFF; @@ -1253,7 +1282,7 @@ u8 CALLBACK PADpoll(u8 value) b2 -= (sum->buttons[i + 4] > 0) << i; } - if (config.padConfigs[query.port][query.slot].type == GuitarPad && !config.GH2) { + if (padtype == GuitarPad && !config.GH2) { sum->buttons[15] = 255; // Not sure about this. Forces wammy to be from 0 to 0x7F. // if (sum->sticks[2].vert > 0) sum->sticks[2].vert = 0; @@ -1264,7 +1293,7 @@ u8 CALLBACK PADpoll(u8 value) } //Left, Right and Down are always pressed on Pop'n Music controller. - if (config.padConfigs[query.port][query.slot].type == PopnPad) + if (padtype == PopnPad) b1 = b1 & 0x1f; query.response[3] = b1; @@ -1272,10 +1301,10 @@ u8 CALLBACK PADpoll(u8 value) query.numBytes = 5; if (pad->mode != MODE_DIGITAL) { - query.response[5] = Cap((sum->sticks[0].horiz + 255) / 2); - query.response[6] = Cap((sum->sticks[0].vert + 255) / 2); - query.response[7] = Cap((sum->sticks[1].horiz + 255) / 2); - query.response[8] = Cap((sum->sticks[1].vert + 255) / 2); + query.response[5] = Cap((sum->sticks[0].horiz + 255) / 2); // Right stick: left & right + query.response[6] = Cap((sum->sticks[0].vert + 255) / 2); // Right stick: up & down + query.response[7] = Cap((sum->sticks[1].horiz + 255) / 2); // Left stick: left & right + query.response[8] = Cap((sum->sticks[1].vert + 255) / 2); // Left stick: up & down query.numBytes = 9; if (pad->mode != MODE_ANALOG) { @@ -1289,14 +1318,15 @@ u8 CALLBACK PADpoll(u8 value) query.response[11] = (unsigned char)sum->buttons[12]; //D-pad up query.response[12] = (unsigned char)sum->buttons[14]; //D-pad down - query.response[13] = (unsigned char)sum->buttons[8]; - query.response[14] = (unsigned char)sum->buttons[9]; - query.response[15] = (unsigned char)sum->buttons[10]; - query.response[16] = (unsigned char)sum->buttons[11]; - query.response[17] = (unsigned char)sum->buttons[6]; - query.response[18] = (unsigned char)sum->buttons[7]; - query.response[19] = (unsigned char)sum->buttons[4]; - query.response[20] = (unsigned char)sum->buttons[5]; + query.response[13] = (unsigned char)sum->buttons[8]; // Triangle + query.response[14] = (unsigned char)sum->buttons[9]; // Circle + query.response[15] = (unsigned char)sum->buttons[10]; // Cross + query.response[16] = (unsigned char)sum->buttons[11]; // Square + + query.response[17] = (unsigned char)sum->buttons[6]; // L1 + query.response[18] = (unsigned char)sum->buttons[7]; // R1 + query.response[19] = (unsigned char)sum->buttons[4]; // L2 + query.response[20] = (unsigned char)sum->buttons[5]; // R2 query.numBytes = 21; } } @@ -1375,6 +1405,12 @@ u8 CALLBACK PADpoll(u8 value) return 0xF3; } else { query.lastByte++; + + // Only the 0x42(read input and vibration) and 0x43(enter or exit config mode) command cases work outside of config mode, the other cases will be avoided. + if (!pad->config && query.currentCommand != 0x42 && query.currentCommand != 0x43) { + DEBUG_OUT(query.response[query.lastByte]); + return query.response[query.lastByte]; + } switch (query.currentCommand) { // READ_DATA_AND_VIBRATE case 0x42: @@ -1388,14 +1424,22 @@ u8 CALLBACK PADpoll(u8 value) case 0x43: if (query.lastByte == 3) { query.queryDone = 1; - pad->config = value; + int padtype = config.padConfigs[query.port][query.slot].type; + if (padtype != neGconPad && padtype != MousePad) { + pad->config = value; + } else if (pad->config != 0) { + pad->config = 0; + } } break; // SET_MODE_AND_LOCK case 0x44: if (query.lastByte == 3 && value < 2) { - if (value == 0 && config.padConfigs[query.port][query.slot].type == MousePad) { + int padtype = config.padConfigs[query.port][query.slot].type; + if (padtype == MousePad) { pad->mode = MODE_PS1_MOUSE; + } else if (padtype == neGconPad) { + pad->mode = MODE_NEGCON; } else { static const u8 modes[2] = {MODE_DIGITAL, MODE_ANALOG}; pad->mode = modes[value]; @@ -1621,7 +1665,7 @@ s32 CALLBACK PADfreeze(int mode, freezeData *data) for (int slot = 0; slot < 4; slot++) { u8 mode = pdata.padData[port][slot].mode; - if (mode != MODE_DIGITAL && mode != MODE_ANALOG && mode != MODE_DS2_NATIVE && mode != MODE_PS1_MOUSE) { + if (mode != MODE_DIGITAL && mode != MODE_ANALOG && mode != MODE_DS2_NATIVE && mode != MODE_PS1_MOUSE && mode != MODE_NEGCON) { break; } diff --git a/plugins/LilyPad/LilyPad.rc b/plugins/LilyPad/LilyPad.rc index 44d346a22..7d42cf657 100644 --- a/plugins/LilyPad/LilyPad.rc +++ b/plugins/LilyPad/LilyPad.rc @@ -65,40 +65,41 @@ BEGIN PUSHBUTTON "R1",ID_R1,254,13,34,15 PUSHBUTTON "L2",ID_L2,210,30,34,15 PUSHBUTTON "R2",ID_R2,254,30,34,15 - GROUPBOX "D-Pad",IDC_DPAD,196,48,108,70 - PUSHBUTTON "Up",ID_DPAD_UP,233,59,34,15 - PUSHBUTTON "Left",ID_DPAD_LEFT,214,78,34,15 - PUSHBUTTON "Right",ID_DPAD_RIGHT,252,78,34,15 + GROUPBOX "D-Pad",IDC_DPAD,196,49,108,70 + PUSHBUTTON "Up",ID_DPAD_UP,233,60,34,15 + PUSHBUTTON "Left",ID_DPAD_LEFT,214,79,34,15 + PUSHBUTTON "Right",ID_DPAD_RIGHT,252,79,34,15 PUSHBUTTON "Down",ID_DPAD_DOWN,233,97,34,15 - GROUPBOX "Face buttons",IDC_FACE,310,48,108,70 - PUSHBUTTON "Triangle",ID_TRIANGLE,347,59,34,15 - PUSHBUTTON "Square",ID_SQUARE,328,78,34,15 - PUSHBUTTON "Circle",ID_CIRCLE,366,78,34,15 - PUSHBUTTON "Cross",ID_CROSS,347,97,34,15 - GROUPBOX "Left Analog Stick",IDC_LSTICK,196,119,108,70 - PUSHBUTTON "Up",ID_LSTICK_UP,234,130,30,15 - PUSHBUTTON "Left",ID_LSTICK_LEFT,202,149,30,15 - PUSHBUTTON "L3",ID_L3,234,149,30,15 - PUSHBUTTON "Right",ID_LSTICK_RIGHT,266,149,30,15 - PUSHBUTTON "Down",ID_LSTICK_DOWN,234,169,30,15 - GROUPBOX "Right Analog Stick",IDC_RSTICK,310,119,108,70 - PUSHBUTTON "Up",ID_RSTICK_UP,348,130,30,15 - PUSHBUTTON "Left",ID_RSTICK_LEFT,316,149,30,15 - PUSHBUTTON "R3",ID_R3,348,149,30,15 - PUSHBUTTON "Right",ID_RSTICK_RIGHT,380,149,30,15 - PUSHBUTTON "Down",ID_RSTICK_DOWN,348,169,30,15 + GROUPBOX "Face buttons",IDC_FACE,310,49,108,70 + PUSHBUTTON "Triangle",ID_TRIANGLE,347,60,34,15 + PUSHBUTTON "Square",ID_SQUARE,328,79,34,15 + PUSHBUTTON "Circle",ID_CIRCLE,366,79,34,15 + PUSHBUTTON "Cross",ID_CROSS,347,98,34,15 + GROUPBOX "Left Analog Stick",IDC_LSTICK,196,120,108,70 + PUSHBUTTON "Up",ID_LSTICK_UP,234,131,30,15 + PUSHBUTTON "Left",ID_LSTICK_LEFT,202,150,30,15 + PUSHBUTTON "L3",ID_L3,234,150,30,15 + PUSHBUTTON "Right",ID_LSTICK_RIGHT,266,150,30,15 + PUSHBUTTON "Down",ID_LSTICK_DOWN,234,170,30,15 + GROUPBOX "Right Analog Stick",IDC_RSTICK,310,120,108,70 + PUSHBUTTON "Up",ID_RSTICK_UP,348,131,30,15 + PUSHBUTTON "Left",ID_RSTICK_LEFT,316,150,30,15 + PUSHBUTTON "R3",ID_R3,348,150,30,15 + PUSHBUTTON "Right",ID_RSTICK_RIGHT,380,150,30,15 + PUSHBUTTON "Down",ID_RSTICK_DOWN,348,170,30,15 // Force Feedback bindings: - GROUPBOX "Add Force Feedback Effect",ID_FORCEFEEDBACK_BOX,262,195,155,51 - COMBOBOX IDC_FORCEFEEDBACK,269,208,142,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Big Motor",ID_BIG_MOTOR,269,226,64,14 - PUSHBUTTON "Small Motor",ID_SMALL_MOTOR,347,226,64,14 + GROUPBOX "Add Force Feedback Effect",ID_FORCEFEEDBACK_BOX,262,194,155,51 + COMBOBOX IDC_FORCEFEEDBACK,269,207,142,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Big Motor",ID_BIG_MOTOR,269,225,64,14 + PUSHBUTTON "Small Motor",ID_SMALL_MOTOR,347,225,64,14 // Special bindings and options: - CONTROL "Configure on bind",IDC_CONFIGURE_ON_BIND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,335,250,70,15 - COMBOBOX IDC_DEVICE_SELECT,259,250,72,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Lock Input",ID_LOCK_ALL_INPUT,196,196,59,15 - PUSHBUTTON "Lock Direction",ID_LOCK_DIRECTION,196,214,59,15 - PUSHBUTTON "Lock Buttons",ID_LOCK_BUTTONS,196,232,59,15 - PUSHBUTTON "Ignore Key",ID_IGNORE,196,250,59,15 + PUSHBUTTON "Lock Input",ID_LOCK_ALL_INPUT,196,195,59,15 + PUSHBUTTON "Lock Direction",ID_LOCK_DIRECTION,196,213,59,15 + PUSHBUTTON "Lock Buttons",ID_LOCK_BUTTONS,196,231,59,15 + PUSHBUTTON "Turbo",ID_TURBO_KEY,196,249,59,15 + PUSHBUTTON "Exclude Input",ID_EXCLUDE,261,249,59,15 + COMBOBOX IDC_DEVICE_SELECT,326,250,91,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Configure on bind",IDC_CONFIGURE_ON_BIND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,347,265,70,15 // Force Feedback configuration: GROUPBOX "",ID_FF,195,9,222,248 COMBOBOX IDC_FF_EFFECT,203,23,206,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP @@ -129,22 +130,22 @@ BEGIN PUSHBUTTON "Back to Controls",ID_CONTROLS,196,261,59,15 PUSHBUTTON "Test",ID_TEST,257,261,59,15 // Input configuration: - GROUPBOX "Configure Binding",ID_SENSITIVITY,195,9,222,98 + GROUPBOX "Configure Binding",ID_SENSITIVITY,195,9,222,110 EDITTEXT IDC_AXIS_DEVICE,202,22,74,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP COMBOBOX IDC_AXIS_DIRECTION,276,20,70,47,CBS_DROPDOWNLIST | WS_TABSTOP EDITTEXT IDC_AXIS_CONTROL,349,22,65,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "Sensitivity",IDC_LABEL_SENSITIVITY,202,38,42,8 - CONTROL "Turbo",IDC_TURBO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,50,34,10 - CONTROL "",IDC_SLIDER_SENSITIVITY,"msctls_trackbar32",WS_TABSTOP,240,38,131,17 - EDITTEXT IDC_AXIS_SENSITIVITY,377,36,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING - CONTROL "Flip",IDC_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,385,50,27,10 - LTEXT "Dead Zone",IDC_LABEL_DEADZONE,202,63,42,8 - CONTROL "",IDC_SLIDER_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,59,131,17 - EDITTEXT IDC_AXIS_DEADZONE,377,62,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING - LTEXT "Skip Dead Zone",IDC_LABEL_SKIP_DEADZONE,202,80,42,16 - CONTROL "",IDC_SLIDER_SKIP_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,80,131,17 - EDITTEXT IDC_AXIS_SKIP_DEADZONE,377,83,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING - LTEXT "Off",IDC_SKIP_DEADZONE_OFF,390,83,20,12 + CONTROL "Flip",IDC_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,37,27,10 + CONTROL "Rapid Fire",IDC_RAPID_FIRE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,232,37,44,10 + LTEXT "Sensitivity",IDC_LABEL_SENSITIVITY,202,51,42,8 + CONTROL "",IDC_SLIDER_SENSITIVITY,"msctls_trackbar32",WS_TABSTOP,240,51,131,17 + EDITTEXT IDC_AXIS_SENSITIVITY,372,53,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Dead Zone",IDC_LABEL_DEADZONE,202,71,42,8 + CONTROL "",IDC_SLIDER_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,71,131,17 + EDITTEXT IDC_AXIS_DEADZONE,372,73,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Skip Dead Zone",IDC_LABEL_SKIP_DEADZONE,202,92,42,16 + CONTROL "",IDC_SLIDER_SKIP_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,92,131,17 + EDITTEXT IDC_AXIS_SKIP_DEADZONE,372,94,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Off",IDC_SKIP_DEADZONE_OFF,390,94,20,12 END IDD_CONFIG_POPN DIALOGEX 0, 0, 424, 283 @@ -165,17 +166,18 @@ BEGIN PUSHBUTTON "Yellow R",ID_DPAD_UP,350,48,43,15 PUSHBUTTON "White R",ID_L2,372,66,43,15 // Force Feedback bindings: - GROUPBOX "Add Force Feedback Effect",ID_FORCEFEEDBACK_BOX,262,195,155,51 - COMBOBOX IDC_FORCEFEEDBACK,269,208,142,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Big Motor",ID_BIG_MOTOR,269,226,64,14 - PUSHBUTTON "Small Motor",ID_SMALL_MOTOR,347,226,64,14 + GROUPBOX "Add Force Feedback Effect",ID_FORCEFEEDBACK_BOX,262,194,155,51 + COMBOBOX IDC_FORCEFEEDBACK,269,207,142,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Big Motor",ID_BIG_MOTOR,269,225,64,14 + PUSHBUTTON "Small Motor",ID_SMALL_MOTOR,347,225,64,14 // Special bindings and options: - CONTROL "Configure on bind",IDC_CONFIGURE_ON_BIND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,335,250,70,15 - COMBOBOX IDC_DEVICE_SELECT,259,250,72,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Lock Input",ID_LOCK_ALL_INPUT,196,196,59,15 - PUSHBUTTON "Lock Direction",ID_LOCK_DIRECTION,196,214,59,15 - PUSHBUTTON "Lock Buttons",ID_LOCK_BUTTONS,196,232,59,15 - PUSHBUTTON "Ignore Key",ID_IGNORE,196,250,59,15 + PUSHBUTTON "Lock Input",ID_LOCK_ALL_INPUT,196,195,59,15 + PUSHBUTTON "Lock Direction",ID_LOCK_DIRECTION,196,213,59,15 + PUSHBUTTON "Lock Buttons",ID_LOCK_BUTTONS,196,231,59,15 + PUSHBUTTON "Turbo",ID_TURBO_KEY,196,249,59,15 + PUSHBUTTON "Exclude Input",ID_EXCLUDE,261,249,59,15 + COMBOBOX IDC_DEVICE_SELECT,326,250,91,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Configure on bind",IDC_CONFIGURE_ON_BIND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,347,265,70,15 // Force Feedback configuration: GROUPBOX "",ID_FF,195,9,222,248 COMBOBOX IDC_FF_EFFECT,203,23,206,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP @@ -206,22 +208,22 @@ BEGIN PUSHBUTTON "Back to Controls",ID_CONTROLS,196,261,59,15 PUSHBUTTON "Test",ID_TEST,257,261,59,15 // Input configuration: - GROUPBOX "Configure Binding",ID_SENSITIVITY,195,9,222,98 + GROUPBOX "Configure Binding",ID_SENSITIVITY,195,9,222,110 EDITTEXT IDC_AXIS_DEVICE,202,22,74,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP COMBOBOX IDC_AXIS_DIRECTION,276,20,70,47,CBS_DROPDOWNLIST | WS_TABSTOP EDITTEXT IDC_AXIS_CONTROL,349,22,65,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "Sensitivity",IDC_LABEL_SENSITIVITY,202,38,42,8 - CONTROL "Turbo",IDC_TURBO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,50,34,10 - CONTROL "",IDC_SLIDER_SENSITIVITY,"msctls_trackbar32",WS_TABSTOP,240,38,131,17 - EDITTEXT IDC_AXIS_SENSITIVITY,377,36,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING - CONTROL "Flip",IDC_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,385,50,27,10 - LTEXT "Dead Zone",IDC_LABEL_DEADZONE,202,63,42,8 - CONTROL "",IDC_SLIDER_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,59,131,17 - EDITTEXT IDC_AXIS_DEADZONE,377,62,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING - LTEXT "Skip Dead Zone",IDC_LABEL_SKIP_DEADZONE,202,80,42,16 - CONTROL "",IDC_SLIDER_SKIP_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,80,131,17 - EDITTEXT IDC_AXIS_SKIP_DEADZONE,377,83,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING - LTEXT "Off",IDC_SKIP_DEADZONE_OFF,390,83,20,12 + CONTROL "Flip",IDC_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,37,27,10 + CONTROL "Rapid Fire",IDC_RAPID_FIRE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,232,37,44,10 + LTEXT "Sensitivity",IDC_LABEL_SENSITIVITY,202,51,42,8 + CONTROL "",IDC_SLIDER_SENSITIVITY,"msctls_trackbar32",WS_TABSTOP,240,51,131,17 + EDITTEXT IDC_AXIS_SENSITIVITY,372,53,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Dead Zone",IDC_LABEL_DEADZONE,202,71,42,8 + CONTROL "",IDC_SLIDER_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,71,131,17 + EDITTEXT IDC_AXIS_DEADZONE,372,73,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Skip Dead Zone",IDC_LABEL_SKIP_DEADZONE,202,92,42,16 + CONTROL "",IDC_SLIDER_SKIP_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,92,131,17 + EDITTEXT IDC_AXIS_SKIP_DEADZONE,372,94,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Off",IDC_SKIP_DEADZONE_OFF,390,94,20,12 END IDD_CONFIG_GUITAR DIALOGEX 0, 0, 424, 283 @@ -242,17 +244,18 @@ BEGIN PUSHBUTTON "Strum Bar Up",ID_DPAD_UP,336,146,58,15 PUSHBUTTON "Strum Bar Down",ID_DPAD_DOWN,336,164,58,15 // Force Feedback bindings: - GROUPBOX "Add Force Feedback Effect",ID_FORCEFEEDBACK_BOX,262,195,155,51 - COMBOBOX IDC_FORCEFEEDBACK,269,208,142,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Big Motor",ID_BIG_MOTOR,269,226,64,14 - PUSHBUTTON "Small Motor",ID_SMALL_MOTOR,347,226,64,14 + GROUPBOX "Add Force Feedback Effect",ID_FORCEFEEDBACK_BOX,262,194,155,51 + COMBOBOX IDC_FORCEFEEDBACK,269,207,142,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Big Motor",ID_BIG_MOTOR,269,225,64,14 + PUSHBUTTON "Small Motor",ID_SMALL_MOTOR,347,225,64,14 // Special bindings and options: - CONTROL "Configure on bind",IDC_CONFIGURE_ON_BIND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,335,250,70,15 - COMBOBOX IDC_DEVICE_SELECT,259,250,72,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Lock Input",ID_LOCK_ALL_INPUT,196,196,59,15 - PUSHBUTTON "Lock Direction",ID_LOCK_DIRECTION,196,214,59,15 - PUSHBUTTON "Lock Buttons",ID_LOCK_BUTTONS,196,232,59,15 - PUSHBUTTON "Ignore Key",ID_IGNORE,196,250,59,15 + PUSHBUTTON "Lock Input",ID_LOCK_ALL_INPUT,196,195,59,15 + PUSHBUTTON "Lock Direction",ID_LOCK_DIRECTION,196,213,59,15 + PUSHBUTTON "Lock Buttons",ID_LOCK_BUTTONS,196,231,59,15 + PUSHBUTTON "Turbo",ID_TURBO_KEY,196,249,59,15 + PUSHBUTTON "Exclude Input",ID_EXCLUDE,261,249,59,15 + COMBOBOX IDC_DEVICE_SELECT,326,250,91,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Configure on bind",IDC_CONFIGURE_ON_BIND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,347,265,70,15 // Force Feedback configuration: GROUPBOX "",ID_FF,195,9,222,248 COMBOBOX IDC_FF_EFFECT,203,23,206,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP @@ -283,22 +286,22 @@ BEGIN PUSHBUTTON "Back to Controls",ID_CONTROLS,196,261,59,15 PUSHBUTTON "Test",ID_TEST,257,261,59,15 // Input configuration: - GROUPBOX "Configure Binding",ID_SENSITIVITY,195,9,222,98 + GROUPBOX "Configure Binding",ID_SENSITIVITY,195,9,222,110 EDITTEXT IDC_AXIS_DEVICE,202,22,74,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP COMBOBOX IDC_AXIS_DIRECTION,276,20,70,47,CBS_DROPDOWNLIST | WS_TABSTOP EDITTEXT IDC_AXIS_CONTROL,349,22,65,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "Sensitivity",IDC_LABEL_SENSITIVITY,202,38,42,8 - CONTROL "Turbo",IDC_TURBO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,50,34,10 - CONTROL "",IDC_SLIDER_SENSITIVITY,"msctls_trackbar32",WS_TABSTOP,240,38,131,17 - EDITTEXT IDC_AXIS_SENSITIVITY,377,36,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING - CONTROL "Flip",IDC_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,385,50,27,10 - LTEXT "Dead Zone",IDC_LABEL_DEADZONE,202,63,42,8 - CONTROL "",IDC_SLIDER_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,59,131,17 - EDITTEXT IDC_AXIS_DEADZONE,377,62,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING - LTEXT "Skip Dead Zone",IDC_LABEL_SKIP_DEADZONE,202,80,42,16 - CONTROL "",IDC_SLIDER_SKIP_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,80,131,17 - EDITTEXT IDC_AXIS_SKIP_DEADZONE,377,83,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING - LTEXT "Off",IDC_SKIP_DEADZONE_OFF,390,83,20,12 + CONTROL "Flip",IDC_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,37,27,10 + CONTROL "Rapid Fire",IDC_RAPID_FIRE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,232,37,44,10 + LTEXT "Sensitivity",IDC_LABEL_SENSITIVITY,202,51,42,8 + CONTROL "",IDC_SLIDER_SENSITIVITY,"msctls_trackbar32",WS_TABSTOP,240,51,131,17 + EDITTEXT IDC_AXIS_SENSITIVITY,372,53,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Dead Zone",IDC_LABEL_DEADZONE,202,71,42,8 + CONTROL "",IDC_SLIDER_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,71,131,17 + EDITTEXT IDC_AXIS_DEADZONE,372,73,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Skip Dead Zone",IDC_LABEL_SKIP_DEADZONE,202,92,42,16 + CONTROL "",IDC_SLIDER_SKIP_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,92,131,17 + EDITTEXT IDC_AXIS_SKIP_DEADZONE,372,94,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Off",IDC_SKIP_DEADZONE_OFF,390,94,20,12 END IDD_CONFIG_PS1_MOUSE DIALOGEX 0, 0, 424, 283 @@ -307,25 +310,28 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CONTROL "",IDC_BINDINGS_LIST,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_VSCROLL | WS_TABSTOP,7,7,183,285,WS_EX_CLIENTEDGE // Input bindings: - PUSHBUTTON "Mouse",ID_MOUSE,366,30,34,15 + PUSHBUTTON "Mouse",ID_MOUSE,379,28,34,15 + GROUPBOX "Mouse buttons",IDC_FACE,242,46,124,34 + PUSHBUTTON "Left-click",ID_CIRCLE,256,57,45,15 + PUSHBUTTON "Right-click",ID_CROSS,307,57,45,15 + GROUPBOX "Mouse Axis",IDC_LSTICK,242,81,124,74 PUSHBUTTON "X-axis Left",ID_LSTICK_LEFT,256,112,45,15 PUSHBUTTON "X-axis Right",ID_LSTICK_RIGHT,307,112,45,15 PUSHBUTTON "Y-axis Up",ID_LSTICK_UP,283,92,45,15 PUSHBUTTON "Y-axis Down",ID_LSTICK_DOWN,283,132,45,15 - PUSHBUTTON "Left-click",ID_CIRCLE,256,56,45,15 - PUSHBUTTON "Right-click",ID_CROSS,307,56,45,15 // Force Feedback bindings: - GROUPBOX "Add Force Feedback Effect",ID_FORCEFEEDBACK_BOX,262,195,155,51 - COMBOBOX IDC_FORCEFEEDBACK,269,208,142,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Big Motor",ID_BIG_MOTOR,269,226,64,14 - PUSHBUTTON "Small Motor",ID_SMALL_MOTOR,347,226,64,14 + GROUPBOX "Add Force Feedback Effect",ID_FORCEFEEDBACK_BOX,262,194,155,51 + COMBOBOX IDC_FORCEFEEDBACK,269,207,142,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Big Motor",ID_BIG_MOTOR,269,225,64,14 + PUSHBUTTON "Small Motor",ID_SMALL_MOTOR,347,225,64,14 // Special bindings and options: - CONTROL "Configure on bind",IDC_CONFIGURE_ON_BIND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,335,250,70,15 - COMBOBOX IDC_DEVICE_SELECT,259,250,72,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Lock Input",ID_LOCK_ALL_INPUT,196,196,59,15 - PUSHBUTTON "Lock Direction",ID_LOCK_DIRECTION,196,214,59,15 - PUSHBUTTON "Lock Buttons",ID_LOCK_BUTTONS,196,232,59,15 - PUSHBUTTON "Ignore Key",ID_IGNORE,196,250,59,15 + PUSHBUTTON "Lock Input",ID_LOCK_ALL_INPUT,196,195,59,15 + PUSHBUTTON "Lock Direction",ID_LOCK_DIRECTION,196,213,59,15 + PUSHBUTTON "Lock Buttons",ID_LOCK_BUTTONS,196,231,59,15 + PUSHBUTTON "Turbo",ID_TURBO_KEY,196,249,59,15 + PUSHBUTTON "Exclude Input",ID_EXCLUDE,261,249,59,15 + COMBOBOX IDC_DEVICE_SELECT,326,250,91,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Configure on bind",IDC_CONFIGURE_ON_BIND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,347,265,70,15 // Force Feedback configuration: GROUPBOX "",ID_FF,195,9,222,248 COMBOBOX IDC_FF_EFFECT,203,23,206,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP @@ -356,22 +362,108 @@ BEGIN PUSHBUTTON "Back to Controls",ID_CONTROLS,196,261,59,15 PUSHBUTTON "Test",ID_TEST,257,261,59,15 // Input configuration: - GROUPBOX "Configure Binding",ID_SENSITIVITY,195,9,222,98 + GROUPBOX "Configure Binding",ID_SENSITIVITY,195,9,222,110 EDITTEXT IDC_AXIS_DEVICE,202,22,74,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP COMBOBOX IDC_AXIS_DIRECTION,276,20,70,47,CBS_DROPDOWNLIST | WS_TABSTOP EDITTEXT IDC_AXIS_CONTROL,349,22,65,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "Sensitivity",IDC_LABEL_SENSITIVITY,202,38,42,8 - CONTROL "Turbo",IDC_TURBO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,50,34,10 - CONTROL "",IDC_SLIDER_SENSITIVITY,"msctls_trackbar32",WS_TABSTOP,240,38,131,17 - EDITTEXT IDC_AXIS_SENSITIVITY,377,36,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING - CONTROL "Flip",IDC_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,385,50,27,10 - LTEXT "Dead Zone",IDC_LABEL_DEADZONE,202,63,42,8 - CONTROL "",IDC_SLIDER_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,59,131,17 - EDITTEXT IDC_AXIS_DEADZONE,377,62,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING - LTEXT "Skip Dead Zone",IDC_LABEL_SKIP_DEADZONE,202,80,42,16 - CONTROL "",IDC_SLIDER_SKIP_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,80,131,17 - EDITTEXT IDC_AXIS_SKIP_DEADZONE,377,83,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING - LTEXT "Off",IDC_SKIP_DEADZONE_OFF,390,83,20,12 + CONTROL "Flip",IDC_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,37,27,10 + CONTROL "Rapid Fire",IDC_RAPID_FIRE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,232,37,44,10 + LTEXT "Sensitivity",IDC_LABEL_SENSITIVITY,202,51,42,8 + CONTROL "",IDC_SLIDER_SENSITIVITY,"msctls_trackbar32",WS_TABSTOP,240,51,131,17 + EDITTEXT IDC_AXIS_SENSITIVITY,372,53,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Dead Zone",IDC_LABEL_DEADZONE,202,71,42,8 + CONTROL "",IDC_SLIDER_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,71,131,17 + EDITTEXT IDC_AXIS_DEADZONE,372,73,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Skip Dead Zone",IDC_LABEL_SKIP_DEADZONE,202,92,42,16 + CONTROL "",IDC_SLIDER_SKIP_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,92,131,17 + EDITTEXT IDC_AXIS_SKIP_DEADZONE,372,94,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Off",IDC_SKIP_DEADZONE_OFF,390,94,20,12 +END + +IDD_CONFIG_NEGCON DIALOGEX 0, 0, 424, 283 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "",IDC_BINDINGS_LIST,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_VSCROLL | WS_TABSTOP,7,7,183,285,WS_EX_CLIENTEDGE + // Input bindings: + GROUPBOX "Shoulder buttons",IDC_SHOULDER,220,30,173,34 + PUSHBUTTON "Analog L",ID_L1,233,41,34,15 + PUSHBUTTON "Digital R",ID_R1,346,41,34,15 + GROUPBOX "D-Pad",IDC_DPAD,196,65,108,70 + PUSHBUTTON "Up",ID_DPAD_UP,233,76,34,15 + PUSHBUTTON "Left",ID_DPAD_LEFT,214,95,34,15 + PUSHBUTTON "Right",ID_DPAD_RIGHT,252,95,34,15 + PUSHBUTTON "Down",ID_DPAD_DOWN,233,114,34,15 + GROUPBOX "Digital Face buttons",IDC_FACE,310,65,108,34 + PUSHBUTTON "B",ID_TRIANGLE,327,76,34,15 + PUSHBUTTON "A",ID_CIRCLE,367,76,34,15 + GROUPBOX "Analog Face buttons",IDC_FACE_ANALOG,310,101,108,34 + PUSHBUTTON "II",ID_SQUARE,327,112,34,15 + PUSHBUTTON "I",ID_CROSS,367,112,34,15 + GROUPBOX "Analog Rotating Section",IDC_LSTICK,247,136,124,34 + PUSHBUTTON "Left",ID_LSTICK_LEFT,261,147,30,15 + PUSHBUTTON "Right",ID_LSTICK_RIGHT,327,147,30,15 + PUSHBUTTON "Start",ID_START,207,139,34,15 + PUSHBUTTON "Mouse",ID_MOUSE,207,158,34,15 + // Force Feedback bindings: + GROUPBOX "Add Force Feedback Effect",ID_FORCEFEEDBACK_BOX,262,194,155,51 + COMBOBOX IDC_FORCEFEEDBACK,269,207,142,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Big Motor",ID_BIG_MOTOR,269,225,64,14 + PUSHBUTTON "Small Motor",ID_SMALL_MOTOR,347,225,64,14 + // Special bindings and options: + PUSHBUTTON "Lock Input",ID_LOCK_ALL_INPUT,196,195,59,15 + PUSHBUTTON "Lock Direction",ID_LOCK_DIRECTION,196,213,59,15 + PUSHBUTTON "Lock Buttons",ID_LOCK_BUTTONS,196,231,59,15 + PUSHBUTTON "Turbo",ID_TURBO_KEY,196,249,59,15 + PUSHBUTTON "Exclude Input",ID_EXCLUDE,261,249,59,15 + COMBOBOX IDC_DEVICE_SELECT,326,250,91,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Configure on bind",IDC_CONFIGURE_ON_BIND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,347,265,70,15 + // Force Feedback configuration: + GROUPBOX "",ID_FF,195,9,222,248 + COMBOBOX IDC_FF_EFFECT,203,23,206,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "",IDC_FF_AXIS1,"msctls_trackbar32",WS_TABSTOP,199,43,214,17 + CONTROL "Axis 1",IDC_FF_AXIS1_ENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,205,63,91,10 + CONTROL "Flip",IDC_FF_AXIS1_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,302,63,35,10 + EDITTEXT IDC_FF_AXIS1_SCALE,375,63,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + CONTROL "",IDC_FF_AXIS2,"msctls_trackbar32",WS_TABSTOP,199,79,214,17 + CONTROL "Axis 2",IDC_FF_AXIS2_ENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,205,99,91,10 + CONTROL "Flip",IDC_FF_AXIS2_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,302,99,35,10 + EDITTEXT IDC_FF_AXIS2_SCALE,375,92,40,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + CONTROL "",IDC_FF_AXIS3,"msctls_trackbar32",WS_TABSTOP,199,115,214,17 + CONTROL "Axis 3",IDC_FF_AXIS3_ENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,205,135,91,10 + CONTROL "Flip",IDC_FF_AXIS3_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,302,135,35,10 + EDITTEXT IDC_FF_AXIS3_SCALE,375,135,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + CONTROL "",IDC_FF_AXIS4,"msctls_trackbar32",WS_TABSTOP,199,151,214,17 + CONTROL "Axis 4",IDC_FF_AXIS4_ENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,205,171,91,10 + CONTROL "Flip",IDC_FF_AXIS4_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,302,171,35,10 + EDITTEXT IDC_FF_AXIS4_SCALE,375,171,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + CONTROL "",IDC_FF_AXIS5,"msctls_trackbar32",WS_TABSTOP,199,187,214,17 + CONTROL "Axis 5",IDC_FF_AXIS5_ENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,205,207,91,10 + CONTROL "Flip",IDC_FF_AXIS5_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,302,207,35,10 + EDITTEXT IDC_FF_AXIS5_SCALE,375,207,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + CONTROL "",IDC_FF_AXIS6,"msctls_trackbar32",WS_TABSTOP,199,223,214,17 + CONTROL "Axis 6",IDC_FF_AXIS6_ENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,205,243,91,10 + CONTROL "Flip",IDC_FF_AXIS6_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,302,243,35,10 + EDITTEXT IDC_FF_AXIS6_SCALE,375,243,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + PUSHBUTTON "Back to Controls",ID_CONTROLS,196,261,59,15 + PUSHBUTTON "Test",ID_TEST,257,261,59,15 + // Input configuration: + GROUPBOX "Configure Binding",ID_SENSITIVITY,195,9,222,110 + EDITTEXT IDC_AXIS_DEVICE,202,22,74,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP + COMBOBOX IDC_AXIS_DIRECTION,276,20,70,47,CBS_DROPDOWNLIST | WS_TABSTOP + EDITTEXT IDC_AXIS_CONTROL,349,22,65,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP + CONTROL "Flip",IDC_FLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,37,27,10 + CONTROL "Rapid Fire",IDC_RAPID_FIRE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,232,37,44,10 + LTEXT "Sensitivity",IDC_LABEL_SENSITIVITY,202,51,42,8 + CONTROL "",IDC_SLIDER_SENSITIVITY,"msctls_trackbar32",WS_TABSTOP,240,51,131,17 + EDITTEXT IDC_AXIS_SENSITIVITY,372,53,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Dead Zone",IDC_LABEL_DEADZONE,202,71,42,8 + CONTROL "",IDC_SLIDER_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,71,131,17 + EDITTEXT IDC_AXIS_DEADZONE,372,73,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Skip Dead Zone",IDC_LABEL_SKIP_DEADZONE,202,92,42,16 + CONTROL "",IDC_SLIDER_SKIP_DEADZONE,"msctls_trackbar32",WS_TABSTOP,240,92,131,17 + EDITTEXT IDC_AXIS_SKIP_DEADZONE,372,94,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING + LTEXT "Off",IDC_SKIP_DEADZONE_OFF,390,94,20,12 END IDD_GENERAL DIALOGEX 0, 0, 424, 283 @@ -381,43 +473,40 @@ BEGIN GROUPBOX "Input APIs",IDC_STATIC,7,6,410,133 GROUPBOX "Keyboard API",IDC_STATIC,16,16,192,51 CONTROL "Windows messaging (Recommended)",IDC_KB_WM,"Button",BS_AUTORADIOBUTTON | WS_GROUP,22,28,134,10 - CONTROL "Raw input (XP and later only)",IDC_KB_RAW,"Button",BS_AUTORADIOBUTTON,22,40,112,10 + CONTROL "Raw input",IDC_KB_RAW,"Button",BS_AUTORADIOBUTTON,22,40,112,10 CONTROL "DirectInput",IDC_KB_DI,"Button",BS_AUTORADIOBUTTON,22,52,112,10 GROUPBOX "Game Device APIs",IDC_STATIC,16,70,191,62 CONTROL "DirectInput",IDC_G_DI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,82,65,10 - CONTROL "XInput (Xbox 360 controllers only)",IDC_G_XI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,94,125,10 + CONTROL "XInput",IDC_G_XI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,94,125,10 CONTROL "DualShock 3 native mode (Requires libusb)",IDC_G_DS3, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,106,151,10 CONTROL "Monitor when in background",IDC_BACKGROUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,118,106,10 - GROUPBOX "Mouse API",IDC_STATIC,216,16,192,74 + GROUPBOX "Mouse API",IDC_STATIC,216,16,192,85 CONTROL "Windows messaging (Recommended)",IDC_M_WM,"Button",BS_AUTORADIOBUTTON | WS_GROUP,223,27,134,10 - CONTROL "Raw input (XP and later only)",IDC_M_RAW,"Button",BS_AUTORADIOBUTTON,223,39,112,10 + CONTROL "Raw input",IDC_M_RAW,"Button",BS_AUTORADIOBUTTON,223,39,112,10 CONTROL "DirectInput",IDC_M_DI,"Button",BS_AUTORADIOBUTTON,223,51,112,10 CONTROL "Disable",IDC_M_DISABLE,"Button",BS_AUTORADIOBUTTON,223,63,39,10 CONTROL "Start without mouse focus",IDC_MOUSE_UNFOCUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,75,97,10 - CONTROL "Always hide cursor",IDC_FORCE_HIDE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,323,75,71,10 - GROUPBOX "Advanced",IDC_STATIC,215,93,192,37 - CONTROL "Allow binding multiple PS2 controls to one PC control",IDC_MULTIPLE_BINDING, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,221,102,182,10 - CONTROL "Disable screensaver",IDC_DISABLE_SCREENSAVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,286,115,80,10 - CONTROL "Enable logging",IDC_DEBUG_FILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,221,115,62,10 + CONTROL "Always hide cursor",IDC_FORCE_HIDE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,87,71,10 GROUPBOX "Pads",IDC_STATIC,7,142,410,62 CONTROL "Port 1 Multitap",IDC_MULTITAP1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,152,63,10 CONTROL "Port 2 Multitap",IDC_MULTITAP2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,164,63,10 + CONTROL "Multiple bindings",IDC_MULTIPLE_BINDING, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,176,63,10 CONTROL "",IDC_PAD_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_TABSTOP,81,151,183,48,WS_EX_CLIENTEDGE COMBOBOX IDC_PAD_TYPE,270,151,140,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Use analog mode if possible - PS1 only",IDC_ANALOG_START1, + CONTROL "Use analog mode if possible",IDC_ANALOG_START1, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,270,168,137,10 GROUPBOX "Device Diagnostics",IDC_STATIC,7,207,201,72 CONTROL "",IDC_DIAG_LIST,"SysListView32",LVS_LIST | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_VSCROLL | WS_TABSTOP,14,217,187,57,WS_EX_CLIENTEDGE - GROUPBOX "Hacks",IDC_STATIC,216,207,201,46 - CONTROL "Send escape on window close",IDC_CLOSE_HACK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,217,113,10 - CONTROL "Exit emulator on window close",IDC_CLOSE_HACK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,228,112,10 + GROUPBOX "Hacks and advanced features",IDC_STATIC,216,207,201,46 + CONTROL "Exit emulator on window close",IDC_CLOSE_HACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,217,112,10 CONTROL "Safe fullscreen exit on escape",IDC_ESCAPE_FULLSCREEN_HACK, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,239,112,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,228,112,10 + CONTROL "Disable screensaver",IDC_DISABLE_SCREENSAVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,239,112,10 CONTROL "Save state # in title",IDC_SAVE_STATE_TITLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,336,217,79,10 - CONTROL "Guitar Hero 2 Hack",IDC_GH2_HACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,336,228,76,10 - CONTROL "L3 Toggles Turbo",IDC_TURBO_KEY_HACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,336,239,70,10 + CONTROL "Guitar Hero 2 Hack",IDC_GH2_HACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,336,228,79,10 + CONTROL "Enable logging",IDC_DEBUG_FILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,336,239,79,10 PUSHBUTTON "Load Bindings",ID_LOAD,283,259,62,15 PUSHBUTTON "Save Bindings",ID_SAVE,355,259,62,15 END @@ -481,6 +570,14 @@ BEGIN BOTTOMMARGIN, 311 END + IDD_CONFIG_NEGCON, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 417 + TOPMARGIN, 7 + BOTTOMMARGIN, 311 + END + IDD_GENERAL, DIALOG BEGIN LEFTMARGIN, 7 diff --git a/plugins/LilyPad/Linux/Config.cpp b/plugins/LilyPad/Linux/Config.cpp index 50f1c83cb..77723d8cd 100644 --- a/plugins/LilyPad/Linux/Config.cpp +++ b/plugins/LilyPad/Linux/Config.cpp @@ -1,5 +1,5 @@ /* LilyPad - Pad plugin for PS2 Emulator - * Copyright (C) 2002-2014 PCSX2 Dev Team/ChickenLiver + * Copyright (C) 2002-2017 PCSX2 Dev Team/ChickenLiver * * PCSX2 is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free @@ -99,7 +99,7 @@ void DeleteBinding(int port, int slot, Device *dev, ForceFeedbackBinding *b) dev->pads[port][slot][padtype].numFFBindings--; } -int BindCommand(Device *dev, unsigned int uid, unsigned int port, unsigned int slot, unsigned int padtype, int command, int sensitivity, int turbo, int deadZone) +int BindCommand(Device *dev, unsigned int uid, unsigned int port, unsigned int slot, unsigned int padtype, int command, int sensitivity, int rapidFire, int deadZone) { // Checks needed because I use this directly when loading bindings. if (port > 1 || slot > 3 || padtype >= numPadTypes) @@ -136,7 +136,7 @@ int BindCommand(Device *dev, unsigned int uid, unsigned int port, unsigned int s p->numBindings++; b->command = command; b->controlIndex = controlIndex; - b->turbo = turbo; + b->rapidFire = rapidFire; b->sensitivity = sensitivity; b->deadZone = deadZone; // Where it appears in listview. @@ -214,7 +214,6 @@ const GeneralSettingsBool BoolOptionsInfo[] = { {L"Save State in Title", 0 /*IDC_SAVE_STATE_TITLE*/, 0}, //No longer required, PCSX2 now handles it - avih 2011-05-17 {L"GH2", 0 /*IDC_GH2_HACK*/, 0}, - {L"Turbo Key Hack", 0 /*IDC_TURBO_KEY_HACK*/, 0}, }; void CALLBACK PADsetSettingsDir(const char *dir) @@ -229,7 +228,7 @@ int SaveSettings(wchar_t *file = 0) for (size_t i = 0; i < sizeof(BoolOptionsInfo) / sizeof(BoolOptionsInfo[0]); i++) { cfg.WriteBool(L"General Settings", BoolOptionsInfo[i].name, config.bools[i]); } - cfg.WriteInt(L"General Settings", L"Close Hacks", config.closeHacks); + cfg.WriteInt(L"General Settings", L"Close Hack", config.closeHack); cfg.WriteInt(L"General Settings", L"Keyboard Mode", config.keyboardApi); cfg.WriteInt(L"General Settings", L"Mouse Mode", config.mouseApi); @@ -277,7 +276,7 @@ int SaveSettings(wchar_t *file = 0) Binding *b = dev->pads[port][slot][padtype].bindings + j; VirtualControl *c = &dev->virtualControls[b->controlIndex]; wsprintfW(temp, L"Binding %i", bindingCount++); - wsprintfW(temp2, L"0x%08X, %i, %i, %i, %i, %i, %i, %i", c->uid, port, b->command, b->sensitivity, b->turbo, slot, b->deadZone, padtype); + wsprintfW(temp2, L"0x%08X, %i, %i, %i, %i, %i, %i, %i", c->uid, port, b->command, b->sensitivity, b->rapidFire, slot, b->deadZone, padtype); cfg.WriteStr(id, temp, temp2); } @@ -319,10 +318,7 @@ int LoadSettings(int force, wchar_t *file) config.bools[i] = cfg.ReadBool(L"General Settings", BoolOptionsInfo[i].name, BoolOptionsInfo[i].defaultValue); } - - config.closeHacks = (u8)cfg.ReadInt(L"General Settings", L"Close Hacks"); - if (config.closeHacks & 1) - config.closeHacks &= ~2; + config.closeHack = (u8)cfg.ReadInt(L"General Settings", L"Close Hack"); config.keyboardApi = (DeviceAPI)cfg.ReadInt(L"General Settings", L"Keyboard Mode", LNX_KEYBOARD); if (!config.keyboardApi) @@ -379,7 +375,7 @@ int LoadSettings(int force, wchar_t *file) } last = 1; unsigned int uid; - int port, command, sensitivity, turbo, slot = 0, deadZone = 0, padtype = 0; + int port, command, sensitivity, rapidFire, slot = 0, deadZone = 0, padtype = 0; int w = 0; char string[1000]; while (temp2[w]) { @@ -387,7 +383,7 @@ int LoadSettings(int force, wchar_t *file) w++; } string[w] = 0; - int len = sscanf(string, " %u , %i , %i , %i , %i , %i , %i , %i", &uid, &port, &command, &sensitivity, &turbo, &slot, &deadZone, &padtype); + int len = sscanf(string, " %u , %i , %i , %i , %i , %i , %i , %i", &uid, &port, &command, &sensitivity, &rapidFire, &slot, &deadZone, &padtype); if (len >= 5 && type) { VirtualControl *c = dev->GetVirtualControl(uid); if (!c) @@ -401,7 +397,7 @@ int LoadSettings(int force, wchar_t *file) padtype = 1; } } - BindCommand(dev, uid, port, slot, padtype, command, sensitivity, turbo, deadZone); + BindCommand(dev, uid, port, slot, padtype, command, sensitivity, rapidFire, deadZone); } } } diff --git a/plugins/LilyPad/Tooltips.cpp b/plugins/LilyPad/Tooltips.cpp index 8ca1796a8..5e231f31b 100644 --- a/plugins/LilyPad/Tooltips.cpp +++ b/plugins/LilyPad/Tooltips.cpp @@ -1,5 +1,5 @@ /* LilyPad - Pad plugin for PS2 Emulator - * Copyright (C) 2016 PCSX2 Dev Team/ChickenLiver + * Copyright (C) 2016-2017 PCSX2 Dev Team/ChickenLiver * * PCSX2 is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free @@ -51,7 +51,8 @@ LPWSTR dialog_message(int ID, bool *updateText) L"\"Dualshock 2\" emulates the default PS2 controller for use in both PS1 and PS2 games.\n\n" L"\"Guitar\" emulates a PS2 controller used in the Guitar Hero and Rock Band series of games.\n\n" L"\"Pop'n Music controller\" emulates a PS2 controller used exclusively in the Japanese Pop'n Music series of games.\n\n" - L"\"PS1 Mouse\" emulates the Playstation Mouse. This controller can only be used in a number of PS1 games like \"Command & Conquer: Red Alert\" and \"Myst\"."; + L"\"PS1 Mouse\" emulates the Playstation Mouse. This controller can only be used in a number of PS1 games like \"Command & Conquer: Red Alert\" and \"Myst\".\n\n" + L"\"neGcon\" emulates a controller that can be used in a number of PS1 games and PS2 games like the \"Ridge Racer\" and \"Ace Combat\" series."; case IDC_ANALOG_START1: return L"Automatically switch a pad from digital mode to analog mode whenever a pad is set to digital mode, if the pad's mode is not locked." L"This removes the need for manually enabling analog mode with a press of the analog button for games that support, but do not automatically enable analog mode.\n\n" @@ -62,6 +63,8 @@ LPWSTR dialog_message(int ID, bool *updateText) L"Double-click a device in the list or right-click it and select \"Test Device\" to display a continuously updated list of the state of all inputs on the selected device.\n" L"Use this option to check if all the inputs on a controller function properly.\n\n" L"Right-click and select \"Refresh\" to update the list of devices in case a recently connected device has not shown up yet."; + case IDC_G_XI: + return L"Xbox 360 controllers(and devices imitating it) only"; // Pad tabs case IDC_BINDINGS_LIST: return L"Shows a list of currently bound inputs of the selected Pad.\n\n" @@ -87,9 +90,8 @@ LPWSTR dialog_message(int ID, bool *updateText) L"This option is useful when analog mode is enabled in a game that does not support it, as this causes the game to not recognise any input or to not even detect a controller.\n\n" L"This option can also be used to enable analog mode in games that support, but do not automatically enable analog mode.\n\n" L"Note: Analog mode enables the analog sticks to function on a DualShock controller, while in digital mode it behaves as an original PlayStation controller.\n\n"; - case ID_IGNORE: - return L"Blocks the assigned keyboard button and does not pass it on to PCSX2. It currently cannot block the windows key (for unknown reasons).\n\n" - L"Ignored keys are listed with pad 1's bindings. You do not have to configure ignored keys again when you change the keyboard input mode."; + case ID_TURBO_KEY: + return L"Sets a key to send a TAB press to the emulator, which toggles Turbo mode(200% speed) in PCSX2."; case ID_LOCK_ALL_INPUT: return L"Locks the current state of the pad. Any further input is handled normally, but the initial pad state is the locked state instead of a state with no buttons pressed. " L"Pressing it again releases the old pad state, if the old pad state had any keys pressed. Otherwise, it's released automatically."; @@ -99,7 +101,7 @@ LPWSTR dialog_message(int ID, bool *updateText) case ID_LOCK_BUTTONS: return L"Locks the current state of the buttons. Pressing this when all input is locked unlocks only the buttons. " L"Pressing it again will lock them again, keeping the d-pad and analog sticks locked."; - case IDC_TURBO: + case IDC_RAPID_FIRE: return L"Automatically presses/releases the input every other time the button is polled."; case IDC_FLIP: return L"Inverts a button or axis, making down up and up down."; diff --git a/plugins/LilyPad/resource.h b/plugins/LilyPad/resource.h index 71b73ea8f..25938a492 100644 --- a/plugins/LilyPad/resource.h +++ b/plugins/LilyPad/resource.h @@ -14,7 +14,7 @@ #define IDR_INI1 111 #define IDD_CONFIG_POPN 112 #define IDD_CONFIG_PS1_MOUSE 113 -#define IDC_CLOSE_HACK1 1099 +#define IDD_CONFIG_NEGCON 114 #define IDC_KB_DISABLE 1100 #define IDC_KB_DI 1101 #define IDC_KB_WM 1102 @@ -27,7 +27,7 @@ #define IDC_G_XI 1109 #define IDC_G_DI 1110 #define IDC_G_DS3 1111 -#define IDC_CLOSE_HACK2 1112 +#define IDC_CLOSE_HACK 1112 #define IDC_DEBUG_FILE 1113 #define IDC_GUITAR1 1114 #define IDC_ANALOG_START1 1115 @@ -40,7 +40,6 @@ #define IDC_MULTIPLE_BINDING 1122 #define IDC_FORCE_HIDE 1124 #define IDC_GH2_HACK 1125 -#define IDC_TURBO_KEY_HACK 1128 #define IDC_SAVE_STATE_TITLE 1129 #define IDC_PAD_LIST 1130 #define IDC_COMBO1 1131 @@ -51,7 +50,7 @@ #define IDC_AXIS_DIRECTION 0x1002 #define IDC_AXIS_CONTROL 0x1003 #define IDC_AXIS_SENSITIVITY 0x1004 -#define IDC_TURBO 0x1005 +#define IDC_RAPID_FIRE 0x1005 #define IDC_AXIS_DEVICE 0x1006 #define ID_SENSITIVITY 0x1007 #define IDC_SLIDER_DEADZONE 0x1008 @@ -96,14 +95,16 @@ #define ID_RSTICK_DOWN 0x1116 #define ID_RSTICK_LEFT 0x1117 #define ID_ANALOG 0x1118 -#define ID_IGNORE 0x1119 -#define IDC_FORCEFEEDBACK 0x111A -#define IDC_FORCEFEEDBACK_FUNCTION 0x111B -#define ID_BIG_MOTOR 0x111C -#define ID_SMALL_MOTOR 0x111D -#define ID_FORCEFEEDBACK_BOX 0x111E -#define IDC_CONFIGURE_ON_BIND 0x111F -#define IDC_DEVICE_SELECT 0x1120 +#define ID_EXCLUDE 0x1119 +#define ID_TURBO_KEY 0x111A +#define IDC_FORCEFEEDBACK 0x1130 +#define IDC_FORCEFEEDBACK_FUNCTION 0x1131 +#define ID_BIG_MOTOR 0x1132 +#define ID_SMALL_MOTOR 0x1133 +#define ID_FORCEFEEDBACK_BOX 0x1134 +#define IDC_CONFIGURE_ON_BIND 0x1135 +#define IDC_DEVICE_SELECT 0x1136 +#define IDC_FACE_ANALOG 0x1137 #define IDC_BINDINGS_LIST 0x1200 #define ID_SAVE 0x1201 #define ID_LOAD 0x1202