From f0f887ce8650a9a5a83c0c861c3762e7c076a932 Mon Sep 17 00:00:00 2001 From: zilmar Date: Tue, 28 Jul 2020 12:55:04 +0930 Subject: [PATCH] Project64-input: Remove duplicate mappings --- Source/Project64-input/InputConfigUI.cpp | 94 ++++++++++++++++++---- Source/Project64-input/InputSettings.cpp | 9 +++ Source/Project64-input/InputSettingsID.h | 1 + Source/Project64-input/N64Controller.h | 1 + Source/Project64-input/OptionsUI.cpp | 7 ++ Source/Project64-input/Project64-input.rc | Bin 18232 -> 18206 bytes Source/Project64-input/resource.h | Bin 9100 -> 9192 bytes Source/Project64-input/wtl-ScanButton.cpp | 4 +- Source/Project64-input/wtl-ScanButton.h | 2 +- 9 files changed, 101 insertions(+), 17 deletions(-) diff --git a/Source/Project64-input/InputConfigUI.cpp b/Source/Project64-input/InputConfigUI.cpp index 2943fddee..cb68b1fa9 100644 --- a/Source/Project64-input/InputConfigUI.cpp +++ b/Source/Project64-input/InputConfigUI.cpp @@ -10,6 +10,8 @@ class CInputConfigUI; +CInputConfigUI * g_ConfigUI = nullptr; + class CControllerSettings : public CPropertyPageImpl { @@ -39,6 +41,7 @@ public: CControllerSettings(uint32_t ControllerNumber); BOOL OnInitDialog(CWindow /*wndFocus*/, LPARAM /*lInitParam*/); HBRUSH OnCtlColorStatic(CDCHandle dc, CWindow wndStatic); + void RemoveMapping(const BUTTON & Button); bool OnApply(); private: @@ -51,8 +54,8 @@ private: void ItemChanged(UINT Code, int id, HWND ctl); LRESULT ItemChangedNotify(NMHDR* /*pNMHDR*/); void DisplayController(void); - void ButtonChannged(void); - static void stButtonChanged(size_t data) { ((CControllerSettings *)data)->ButtonChannged(); } + void ButtonChannged(const BUTTON & Button); + static void stButtonChanged(size_t data, const BUTTON & Button) { ((CControllerSettings *)data)->ButtonChannged(Button); } std::wstring m_Title; uint32_t m_ControllerNumber; @@ -71,6 +74,21 @@ private: CScanButton m_ButtonAnalogU, m_ButtonAnalogD, m_ButtonAnalogL, m_ButtonAnalogR; }; +class CInputConfigUI : + public CPropertySheetImpl +{ +public: + CInputConfigUI(); + ~CInputConfigUI(); + + void UpdateDeviceMapping(void); + void RemoveMapping(const BUTTON & Button); + void OnSheetInitialized(); + +private: + CControllerSettings m_pgController0, m_pgController1, m_pgController2, m_pgController3; +}; + CControllerSettings::CControllerSettings(uint32_t ControllerNumber) : m_ControllerNumber(ControllerNumber), m_ScanCount(0), @@ -249,27 +267,60 @@ void CControllerSettings::DisplayController(void) GetDlgItem(IDC_BOUND_DEVICE).SetWindowText(g_InputPlugin->ControllerDevices(m_Controller).c_str()); } -void CControllerSettings::ButtonChannged(void) +void CControllerSettings::ButtonChannged(const BUTTON & Button) { + if (g_ConfigUI != nullptr) + { + g_ConfigUI->RemoveMapping(Button); + } GetDlgItem(IDC_BOUND_DEVICE).SetWindowText(g_InputPlugin->ControllerDevices(m_Controller).c_str()); CPropertySheetWindow(GetParent()).SetModified(m_hWnd); } -class CInputConfigUI: - public CPropertySheetImpl +void CControllerSettings::RemoveMapping(const BUTTON & Button) { -public: - CInputConfigUI(); - ~CInputConfigUI(); + if (!m_Controller.RemoveDuplicate) + { + return; + } + BUTTON * buttons[] = + { + &m_Controller.U_DPAD, &m_Controller.D_DPAD, &m_Controller.L_DPAD, &m_Controller.R_DPAD, + &m_Controller.A_BUTTON, &m_Controller.B_BUTTON, &m_Controller.START_BUTTON, &m_Controller.Z_TRIG, + &m_Controller.U_CBUTTON, &m_Controller.D_CBUTTON, &m_Controller.L_CBUTTON, &m_Controller.R_CBUTTON, + &m_Controller.U_ANALOG, &m_Controller.D_ANALOG, &m_Controller.L_ANALOG, &m_Controller.R_ANALOG, + &m_Controller.R_TRIG, &m_Controller.L_TRIG, + }; - void UpdateDeviceMapping(void); - void OnSheetInitialized(); + bool Changed = false; + BUTTON EmptyButton = { 0 }; + for (size_t b = 0; b < (sizeof(buttons) / sizeof(buttons[0])); b++) + { + if (buttons[b]->Offset == Button.Offset && + buttons[b]->AxisID == Button.AxisID && + buttons[b]->BtnType == Button.BtnType && + memcmp(&buttons[b]->DeviceGuid, &Button.DeviceGuid, sizeof(Button.DeviceGuid)) == 0) + { + *buttons[b] = EmptyButton; + Changed = true; + } + } -private: - CControllerSettings m_pgController0, m_pgController1, m_pgController2, m_pgController3; -}; + if (Changed) + { + CScanButton * ScanButtons[] = { + &m_ButtonUDPad, &m_ButtonDDPad, &m_ButtonLDPad, &m_ButtonRDPad, &m_ButtonA, &m_ButtonB, + &m_ButtonCUp, &m_ButtonCDown, &m_ButtonCLeft, &m_ButtonCRight, &m_ButtonStart, + &m_ButtonZtrigger, &m_ButtonRTrigger, &m_ButtonLTrigger, + &m_ButtonAnalogU, &m_ButtonAnalogD, &m_ButtonAnalogL, &m_ButtonAnalogR + }; -CInputConfigUI * g_ConfigUI = nullptr; + for (size_t i = 0, n = sizeof(ScanButtons) / sizeof(ScanButtons[0]); i < n; i++) + { + ScanButtons[i]->DisplayButton(); + } + } +} void ConfigInput(void * hParent) { @@ -321,6 +372,21 @@ void CInputConfigUI::UpdateDeviceMapping(void) } } +void CInputConfigUI::RemoveMapping(const BUTTON & Button) +{ + CControllerSettings * Pages[] = { + &m_pgController0, + &m_pgController1, + &m_pgController2, + &m_pgController3 + }; + + for (size_t i = 0, n = (sizeof(Pages) / sizeof(Pages[0])); i < n; i++) + { + Pages[i]->RemoveMapping(Button); + } +} + void ConfigUIDeviceAdded(void) { if (g_ConfigUI != nullptr) diff --git a/Source/Project64-input/InputSettings.cpp b/Source/Project64-input/InputSettings.cpp index ba21eb3cd..0e080a426 100644 --- a/Source/Project64-input/InputSettings.cpp +++ b/Source/Project64-input/InputSettings.cpp @@ -27,6 +27,7 @@ static const uint32_t Default_DeadZone = 25; static const uint32_t Default_Range = 100; static const uint32_t Default_Plugin = PLUGIN_MEMPAK; static const bool Default_RealN64Range = true; +static const bool Default_RemoveDuplicate = true; CInputSettings::CInputSettings() { @@ -82,6 +83,7 @@ void CInputSettings::LoadController(uint32_t ControlIndex, CONTROL & ControllerI InputSettingID RangeSettings[] = { Set_Control0_Range }; InputSettingID DeadZoneSettings[] = { Set_Control0_Deadzone }; InputSettingID RealN64RangeSettings[] = { Set_Control0_RealN64Range }; + InputSettingID RemoveDuplicateSettings[] = { Set_Control0_RemoveDuplicate }; ControllerInfo.Present = ControlIndex < (sizeof(PresentSettings) / sizeof(PresentSettings[0])) ? GetSetting((short)PresentSettings[ControlIndex]) != 0 : 0; ControllerInfo.Plugin = ControlIndex < (sizeof(PluginSettings) / sizeof(PluginSettings[0])) ? GetSetting((short)PluginSettings[ControlIndex]) : Default_Plugin; @@ -91,6 +93,7 @@ void CInputSettings::LoadController(uint32_t ControlIndex, CONTROL & ControllerI Controller.DeadZone = (uint8_t)(ControlIndex < (sizeof(DeadZoneSettings) / sizeof(DeadZoneSettings[0])) ? GetSetting((short)DeadZoneSettings[ControlIndex]) : Default_DeadZone); if (Controller.DeadZone > 100) { Controller.DeadZone = 100; } Controller.RealN64Range = (ControlIndex < (sizeof(RealN64RangeSettings) / sizeof(RealN64RangeSettings[0])) ? GetSetting((short)RealN64RangeSettings[ControlIndex]) != 0 : Default_RealN64Range); + Controller.RemoveDuplicate = (ControlIndex < (sizeof(RemoveDuplicateSettings) / sizeof(RemoveDuplicateSettings[0])) ? GetSetting((short)RemoveDuplicateSettings[ControlIndex]) != 0 : Default_RemoveDuplicate); } void CInputSettings::SaveController(uint32_t ControlIndex, const CONTROL & ControllerInfo, const N64CONTROLLER & Controller) @@ -128,6 +131,7 @@ void CInputSettings::SaveController(uint32_t ControlIndex, const CONTROL & Contr InputSettingID RangeSettings[] = { Set_Control0_Range }; InputSettingID DeadzoneSettings[] = { Set_Control0_Deadzone }; InputSettingID RealN64RangeSettings[] = { Set_Control0_RealN64Range }; + InputSettingID RemoveDuplicateSettings[] = { Set_Control0_RemoveDuplicate }; for (size_t i = 0, n = sizeof(Buttons) / sizeof(Buttons[0]); i < n; i++) { @@ -160,6 +164,10 @@ void CInputSettings::SaveController(uint32_t ControlIndex, const CONTROL & Contr { SetSetting((short)RealN64RangeSettings[ControlIndex], Controller.RealN64Range ? 1 : 0); } + if (ControlIndex < (sizeof(RemoveDuplicateSettings) / sizeof(RemoveDuplicateSettings[0]))) + { + SetSetting((short)RemoveDuplicateSettings[ControlIndex], Controller.RemoveDuplicate ? 1 : 0); + } FlushSettings(); } @@ -242,6 +250,7 @@ void CInputSettings::RegisterSettings(void) RegisterSetting(Set_Control0_Range, Data_DWORD_General, "Range", "Controller 1", Default_Range, nullptr); RegisterSetting(Set_Control0_Deadzone, Data_DWORD_General, "Deadzone", "Controller 1", Default_DeadZone, nullptr); RegisterSetting(Set_Control0_RealN64Range, Data_DWORD_General, "RealN64Range", "Controller 1", Default_RealN64Range, nullptr); + RegisterSetting(Set_Control0_RemoveDuplicate, Data_DWORD_General, "Remove Duplicate", "Controller 1", Default_RemoveDuplicate, nullptr); RegisterSetting(Set_Control0_U_DPAD, Data_String_General, "DPadUp", "Controller 1", 0, Control0_U_DPAD_Default); RegisterSetting(Set_Control0_D_DPAD, Data_String_General, "DPadDown", "Controller 1", 0, Control0_D_DPAD_Default); RegisterSetting(Set_Control0_L_DPAD, Data_String_General, "DPadLeft", "Controller 1", 0, Control0_L_DPAD_Default); diff --git a/Source/Project64-input/InputSettingsID.h b/Source/Project64-input/InputSettingsID.h index 9625e58e8..019093525 100644 --- a/Source/Project64-input/InputSettingsID.h +++ b/Source/Project64-input/InputSettingsID.h @@ -7,6 +7,7 @@ enum InputSettingID Set_Control0_Range, Set_Control0_Deadzone, Set_Control0_RealN64Range, + Set_Control0_RemoveDuplicate, Set_Control0_U_DPAD, Set_Control0_D_DPAD, Set_Control0_L_DPAD, diff --git a/Source/Project64-input/N64Controller.h b/Source/Project64-input/N64Controller.h index c607dfb1e..ba5836273 100644 --- a/Source/Project64-input/N64Controller.h +++ b/Source/Project64-input/N64Controller.h @@ -24,4 +24,5 @@ typedef struct uint8_t Range; uint8_t DeadZone; bool RealN64Range; + bool RemoveDuplicate; } N64CONTROLLER; diff --git a/Source/Project64-input/OptionsUI.cpp b/Source/Project64-input/OptionsUI.cpp index 03225ad7b..6290c044c 100644 --- a/Source/Project64-input/OptionsUI.cpp +++ b/Source/Project64-input/OptionsUI.cpp @@ -27,6 +27,7 @@ public: CenterWindow(GetParent()); SetWindowText(stdstr_f("Options - Player %d", m_ControlIndex + 1).ToUTF16().c_str()); CButton(GetDlgItem(IDC_REAL_N64_RANGE)).SetCheck(m_Controller.RealN64Range ? BST_CHECKED : BST_UNCHECKED); + CButton(GetDlgItem(IDC_REMOVE_DUPLICATE)).SetCheck(m_Controller.RemoveDuplicate ? BST_CHECKED : BST_UNCHECKED); return TRUE; } LRESULT OnOkCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) @@ -38,6 +39,12 @@ public: m_Controller.RealN64Range = RealN64Range; bChanged = true; } + bool RemoveDuplicate = CButton(GetDlgItem(IDC_REMOVE_DUPLICATE)).GetCheck() == BST_CHECKED; + if (RemoveDuplicate != m_Controller.RemoveDuplicate) + { + m_Controller.RemoveDuplicate = RemoveDuplicate; + bChanged = true; + } if (bChanged) { GetParent().SendMessage(PSM_CHANGED); diff --git a/Source/Project64-input/Project64-input.rc b/Source/Project64-input/Project64-input.rc index cfc0c4d2f840dd2b7288add4e4427f3c4ca22190..da10a1687d466a15c196082b686c95e06740d982 100644 GIT binary patch delta 151 zcmdnd$2hN#aRZb25Q8g&FM~fr7?6$!iiI)+F!%svof#Y%LV#jAljoWR o@*6T(0QDF$7%-TE=*f-FqMHTG7cox$VG%M}&q-vnij@d20IG8!3;+NC delta 171 zcmbQ&$GD@9aRZb2f{J@!IGMlB(L*laE*$O+MhrA?d^5%HYNj z!r;r`$PmQf&fv-5$DqTYz+gVP&`eZ52*`J5@W3K($Y9Q31X3d&!r;#kfJOgCTXA`R SpiYpyFNQo=|K^vLrn~@SM7Z3$PhC5qmt-k1xB{X O0rG5&=9`rjGnoL(J`Mo@ delta 12 TcmaFi-s8SOLveG9VhR%gBnkw& diff --git a/Source/Project64-input/wtl-ScanButton.cpp b/Source/Project64-input/wtl-ScanButton.cpp index 0fdbd1781..2b3f389af 100644 --- a/Source/Project64-input/wtl-ScanButton.cpp +++ b/Source/Project64-input/wtl-ScanButton.cpp @@ -60,11 +60,11 @@ void CScanButton::OnTimer(UINT_PTR nIDEvent) CDirectInput::ScanResult Result = g_InputPlugin->ScanDevices(Button); if (Result == CDirectInput::SCAN_SUCCEED && (Button.Offset != m_Button.Offset || Button.AxisID != m_Button.AxisID || Button.BtnType != m_Button.BtnType)) { - m_Button = Button; if (m_ChangeCallback != nullptr) { - m_ChangeCallback(m_ChangeCallbackData); + m_ChangeCallback(m_ChangeCallbackData, Button); } + m_Button = Button; } if (Result == CDirectInput::SCAN_SUCCEED || Result == CDirectInput::SCAN_ESCAPE) { diff --git a/Source/Project64-input/wtl-ScanButton.h b/Source/Project64-input/wtl-ScanButton.h index 5f365fbf5..60048cdd2 100644 --- a/Source/Project64-input/wtl-ScanButton.h +++ b/Source/Project64-input/wtl-ScanButton.h @@ -15,7 +15,7 @@ public: WM_SCAN_SUCCESS = WM_USER + 0x140, WM_SCAN_CANCELED = WM_USER + 0x141, }; - typedef void(*ChangeCallback)(size_t Data); + typedef void(*ChangeCallback)(size_t Data, const BUTTON & Button); CScanButton(BUTTON & Button, int DisplayCtrlId, int ScanBtnId);