Skip to content

Commit 60cddbf

Browse files
committed
Move settings to UserSettings struct, load [Default] ini key as default settings for new controllers
1 parent b213063 commit 60cddbf

File tree

3 files changed

+140
-111
lines changed

3 files changed

+140
-111
lines changed

Xb2XInput/XboxController.cpp

Lines changed: 106 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ std::vector<std::pair<int, int>> xbox_devices =
5151
{0xFFFF, 0xFFFF}, // PowerWave Xbox Controller (The ID's may look sketchy but this controller actually uses it)
5252
};
5353

54+
UserSettings defaults_;
55+
5456
// Xb2XInput.cpp externs
5557
void USBDeviceChanged(const XboxController& controller, bool added);
5658
extern char ini_path[4096];
@@ -146,12 +148,77 @@ libusb_device_handle* XboxController::OpenDevice()
146148
return ret;
147149
}
148150

151+
UserSettings XboxController::LoadSettings(const std::string& ini_key, bool use_defaults)
152+
{
153+
UserSettings ret;
154+
155+
bool defaultVal = use_defaults ? defaults_.guide_enabled : true;
156+
ret.guide_enabled = GetSettingBool("EnableGuide", defaultVal, ini_key);
157+
158+
if (ret.guide_enabled == defaultVal) // write setting to ini if this == default, in case it didn't already exist
159+
SetSetting("EnableGuide", defaultVal ? "true" : "false", ini_key);
160+
161+
defaultVal = use_defaults ? defaults_.vibration_enabled : false;
162+
ret.vibration_enabled = GetSettingBool("EnableVibration", defaultVal, ini_key);
163+
164+
if (ret.vibration_enabled) // write setting to ini if this == default, in case it didn't already exist
165+
SetSetting("EnableVibration", defaultVal ? "true" : "false", ini_key); // write setting to ini if this == default, in case it didn't already exist
166+
167+
ret.deadzone.sThumbL = min(max(GetSettingInt("DeadzoneLeftStick", use_defaults ? defaults_.deadzone.sThumbL : 0, ini_key), 0), SHRT_MAX);
168+
ret.deadzone.sThumbR = min(max(GetSettingInt("DeadzoneRightStick", use_defaults ? defaults_.deadzone.sThumbR : 0, ini_key), 0), SHRT_MAX);
169+
ret.deadzone.bLeftTrigger = min(max(GetSettingInt("DeadzoneLeftTrigger", use_defaults ? defaults_.deadzone.bLeftTrigger : 0, ini_key), 0), 0xFF);
170+
ret.deadzone.bRightTrigger = min(max(GetSettingInt("DeadzoneRightTrigger", use_defaults ? defaults_.deadzone.bRightTrigger : 0, ini_key), 0), 0xFF);
171+
172+
ret.button_remap.clear();
173+
if (use_defaults && defaults_.remap_enabled)
174+
ret.button_remap = defaults_.button_remap;
175+
176+
if (GetSettingBool("RemapEnable", use_defaults ? defaults_.remap_enabled : false, ini_key))
177+
{
178+
std::string remap;
179+
180+
int ParseButtonCombination(const char* combo); // Xb2XInput.cpp
181+
182+
// TODO: if RemapEnable, should we SetSetting for all of these so INI is populated with the proper Remap* settings?
183+
#define LoadMap(btn) \
184+
remap = GetSettingString("Remap" #btn, "", ini_key); \
185+
if (remap.length()) \
186+
{ \
187+
int combo = ParseButtonCombination(remap.c_str()); \
188+
if (combo) \
189+
ret.button_remap[XUSB_GAMEPAD_##btn] = combo; \
190+
}
191+
192+
LoadMap(A);
193+
LoadMap(B);
194+
LoadMap(X);
195+
LoadMap(Y);
196+
LoadMap(Start);
197+
LoadMap(Back);
198+
LoadMap(LS);
199+
LoadMap(RS);
200+
LoadMap(Black);
201+
LoadMap(White);
202+
LoadMap(DpadUp);
203+
LoadMap(DpadDown);
204+
LoadMap(DpadLeft);
205+
LoadMap(DpadRight);
206+
207+
#undef LoadMap
208+
}
209+
210+
return ret;
211+
}
212+
149213
bool XboxController::Initialize(WCHAR* app_title)
150214
{
151215
static bool inited = false;
152216
if (inited)
153217
return true;
154218

219+
// Load default INI settings
220+
defaults_ = LoadSettings("Default", false);
221+
155222
// Init libusb & ViGEm
156223
auto ret = libusb_init(NULL);
157224
if (ret < 0)
@@ -296,51 +363,7 @@ XboxController::XboxController(libusb_device_handle* handle, uint8_t* usb_ports,
296363
ini_key_ = ss.str();
297364

298365
// Read in INI settings for this controller
299-
guide_enabled_ = GetSettingBool("EnableGuide", true);
300-
if (guide_enabled_)
301-
GuideEnabled(guide_enabled_); // write setting to ini if this == default, in case it didn't already exist
302-
303-
vibration_enabled_ = GetSettingBool("EnableVibration", true);
304-
if (vibration_enabled_)
305-
VibrationEnabled(vibration_enabled_);
306-
307-
deadzone_.sThumbL = min(max(GetSettingInt("DeadzoneLeftStick", 0), 0), SHRT_MAX);
308-
deadzone_.sThumbR = min(max(GetSettingInt("DeadzoneRightStick", 0), 0), SHRT_MAX);
309-
deadzone_.bLeftTrigger = min(max(GetSettingInt("DeadzoneLeftTrigger", 0), 0), 0xFF);
310-
deadzone_.bRightTrigger = min(max(GetSettingInt("DeadzoneRightTrigger", 0), 0), 0xFF);
311-
312-
button_remap_.clear();
313-
if (GetSettingBool("RemapEnable", false))
314-
{
315-
std::string remap;
316-
317-
int ParseButtonCombination(const char* combo);
318-
#define LoadMap(btn) \
319-
remap = GetSettingString("Remap" #btn, ""); \
320-
if (remap.length()) \
321-
{ \
322-
int combo = ParseButtonCombination(remap.c_str()); \
323-
if (combo) \
324-
button_remap_[XUSB_GAMEPAD_##btn] = combo; \
325-
}
326-
327-
LoadMap(A);
328-
LoadMap(B);
329-
LoadMap(X);
330-
LoadMap(Y);
331-
LoadMap(Start);
332-
LoadMap(Back);
333-
LoadMap(LS);
334-
LoadMap(RS);
335-
LoadMap(Black);
336-
LoadMap(White);
337-
LoadMap(DpadUp);
338-
LoadMap(DpadDown);
339-
LoadMap(DpadLeft);
340-
LoadMap(DpadRight);
341-
342-
#undef LoadMap
343-
}
366+
settings_ = LoadSettings(ini_key_, true);
344367

345368
usb_product_ = usb_desc_.idProduct;
346369
usb_vendor_ = usb_desc_.idVendor;
@@ -359,7 +382,7 @@ void CALLBACK XboxController::OnVigemNotification(PVIGEM_CLIENT Client, PVIGEM_T
359382
if (controller.target_ != Target)
360383
continue;
361384

362-
if (!controller.vibration_enabled_)
385+
if (!controller.settings_.vibration_enabled)
363386
LargeMotor = SmallMotor = 0;
364387

365388
memset(&controller.output_prev_, 0, sizeof(XboxOutputReport));
@@ -469,7 +492,6 @@ bool XboxController::update()
469492
int length = 0;
470493
int ret = -1;
471494

472-
473495
// if we have interrupt endpoints use those for better compatibility, otherwise fallback to control transfers
474496
if (endpoint_in_)
475497
{
@@ -510,7 +532,7 @@ bool XboxController::update()
510532
gamepad_.wButtons |= input_prev_.Gamepad.bAnalogButtons[OGXINPUT_GAMEPAD_WHITE] ? XUSB_GAMEPAD_LEFT_SHOULDER : 0;
511533
gamepad_.wButtons |= input_prev_.Gamepad.bAnalogButtons[OGXINPUT_GAMEPAD_BLACK] ? XUSB_GAMEPAD_RIGHT_SHOULDER : 0;
512534

513-
if (button_remap_.size())
535+
if (settings_.button_remap.size())
514536
{
515537
auto buttons = gamepad_.wButtons;
516538
gamepad_.wButtons = 0;
@@ -520,8 +542,8 @@ bool XboxController::update()
520542
if (buttons & XUSB_GAMEPAD_##btn) \
521543
{ \
522544
auto remap = (int)XUSB_GAMEPAD_##btn; \
523-
if (button_remap_.count(XUSB_GAMEPAD_##btn)) \
524-
remap = button_remap_[XUSB_GAMEPAD_##btn]; \
545+
if (settings_.button_remap.count(XUSB_GAMEPAD_##btn)) \
546+
remap = settings_.button_remap[XUSB_GAMEPAD_##btn]; \
525547
gamepad_.wButtons |= remap; \
526548
}
527549

@@ -552,57 +574,57 @@ bool XboxController::update()
552574
(input_prev_.Gamepad.wButtons & (OGXINPUT_GAMEPAD_DPAD_UP | OGXINPUT_GAMEPAD_DPAD_DOWN))) // Direction to change deadzone
553575
{
554576
// wait for previous deadzone adjustment button release
555-
if (!deadzone_.hold){
577+
if (!settings_.deadzone.hold){
556578
short adjustment = (input_prev_.Gamepad.wButtons & OGXINPUT_GAMEPAD_DPAD_UP ? 500 : -500);
557579

558580
if (input_prev_.Gamepad.wButtons & OGXINPUT_GAMEPAD_LEFT_THUMB){
559-
deadzone_.sThumbL = min(max(deadzone_.sThumbL+adjustment,0), SHRT_MAX);
581+
settings_.deadzone.sThumbL = min(max(settings_.deadzone.sThumbL+adjustment,0), SHRT_MAX);
560582
}
561583
if (input_prev_.Gamepad.wButtons & OGXINPUT_GAMEPAD_RIGHT_THUMB){
562-
deadzone_.sThumbR = min(max(deadzone_.sThumbR+adjustment,0), SHRT_MAX);
584+
settings_.deadzone.sThumbR = min(max(settings_.deadzone.sThumbR+adjustment,0), SHRT_MAX);
563585
}
564586

565587
SaveDeadzones();
566588

567589
// wait for button release
568-
deadzone_.hold = true;
590+
settings_.deadzone.hold = true;
569591
}
570592

571593
// Trigger Deadzone Adjustment: (LT | RT) + LS + RS + D-Pad Up/Down
572594
} else if ((input_prev_.Gamepad.wButtons & OGXINPUT_GAMEPAD_LEFT_THUMB) && (input_prev_.Gamepad.wButtons & OGXINPUT_GAMEPAD_RIGHT_THUMB) && // // (LS && RS) AND
573595
((input_prev_.Gamepad.bAnalogButtons[OGXINPUT_GAMEPAD_LEFT_TRIGGER] >= 0x8) ^ (input_prev_.Gamepad.bAnalogButtons[OGXINPUT_GAMEPAD_RIGHT_TRIGGER] >= 0x8)) && // Left XOR Right Trigger AND
574596
(input_prev_.Gamepad.wButtons & (OGXINPUT_GAMEPAD_DPAD_UP | OGXINPUT_GAMEPAD_DPAD_DOWN))) // Direction to change deadzone
575597
{
576-
if(!deadzone_.hold){
598+
if(!settings_.deadzone.hold){
577599
short adjustment = (input_prev_.Gamepad.wButtons & OGXINPUT_GAMEPAD_DPAD_UP ? 15 : -15);
578600

579601
if (input_prev_.Gamepad.bAnalogButtons[OGXINPUT_GAMEPAD_LEFT_TRIGGER]){
580-
deadzone_.bLeftTrigger = min(max(deadzone_.bLeftTrigger+adjustment,0), 0xFF);
602+
settings_.deadzone.bLeftTrigger = min(max(settings_.deadzone.bLeftTrigger+adjustment,0), 0xFF);
581603
}
582604
if (input_prev_.Gamepad.bAnalogButtons[OGXINPUT_GAMEPAD_RIGHT_TRIGGER]){
583-
deadzone_.bRightTrigger = min(max(deadzone_.bRightTrigger+adjustment,0), 0xFF);
605+
settings_.deadzone.bRightTrigger = min(max(settings_.deadzone.bRightTrigger+adjustment,0), 0xFF);
584606
}
585607

586608
SaveDeadzones();
587609

588610
// wait for button release
589-
deadzone_.hold = true;
611+
settings_.deadzone.hold = true;
590612
}
591613
} else {
592614
// reset button release
593-
deadzone_.hold = false;
615+
settings_.deadzone.hold = false;
594616
}
595617
}
596618

597619
// Analog Stick Deadzone Calculations
598-
deadZoneCalc(&gamepad_.sThumbLX, &gamepad_.sThumbLY, input_prev_.Gamepad.sThumbLX, input_prev_.Gamepad.sThumbLY, deadzone_.sThumbL, SHRT_MAX);
599-
deadZoneCalc(&gamepad_.sThumbRX, &gamepad_.sThumbRY, input_prev_.Gamepad.sThumbRX, input_prev_.Gamepad.sThumbRY, deadzone_.sThumbR, SHRT_MAX);
620+
deadZoneCalc(&gamepad_.sThumbLX, &gamepad_.sThumbLY, input_prev_.Gamepad.sThumbLX, input_prev_.Gamepad.sThumbLY, settings_.deadzone.sThumbL, SHRT_MAX);
621+
deadZoneCalc(&gamepad_.sThumbRX, &gamepad_.sThumbRY, input_prev_.Gamepad.sThumbRX, input_prev_.Gamepad.sThumbRY, settings_.deadzone.sThumbR, SHRT_MAX);
600622

601623
// Trigger Deadzone Calculations
602624
short triggerbuf;
603-
deadZoneCalc(&triggerbuf, NULL, input_prev_.Gamepad.bAnalogButtons[OGXINPUT_GAMEPAD_LEFT_TRIGGER], 0, deadzone_.bLeftTrigger, 0xFF);
625+
deadZoneCalc(&triggerbuf, NULL, input_prev_.Gamepad.bAnalogButtons[OGXINPUT_GAMEPAD_LEFT_TRIGGER], 0, settings_.deadzone.bLeftTrigger, 0xFF);
604626
gamepad_.bLeftTrigger = triggerbuf;
605-
deadZoneCalc(&triggerbuf, NULL, input_prev_.Gamepad.bAnalogButtons[OGXINPUT_GAMEPAD_RIGHT_TRIGGER], 0, deadzone_.bRightTrigger, 0xFF);
627+
deadZoneCalc(&triggerbuf, NULL, input_prev_.Gamepad.bAnalogButtons[OGXINPUT_GAMEPAD_RIGHT_TRIGGER], 0, settings_.deadzone.bRightTrigger, 0xFF);
606628
gamepad_.bRightTrigger = triggerbuf;
607629

608630
// Create a 'digital' bitfield so we can test combinations against LT/RT
@@ -613,7 +635,7 @@ bool XboxController::update()
613635
digitalPressed |= XUSB_GAMEPAD_RT;
614636

615637
// Secret guide combination
616-
if (combo_guideButton && (digitalPressed & combo_guideButton) == combo_guideButton)
638+
if (settings_.guide_enabled && combo_guideButton && (digitalPressed & combo_guideButton) == combo_guideButton)
617639
{
618640
gamepad_.wButtons |= XUSB_GAMEPAD_GUIDE;
619641

@@ -633,55 +655,55 @@ bool XboxController::update()
633655

634656
void XboxController::GuideEnabled(bool value)
635657
{
636-
guide_enabled_ = value;
637-
SetSetting("EnableGuide", value ? "true" : "false");
658+
settings_.guide_enabled = value;
659+
SetSetting("EnableGuide", value ? "true" : "false", ini_key_);
638660
}
639661

640662
void XboxController::VibrationEnabled(bool value)
641663
{
642-
vibration_enabled_ = value;
643-
SetSetting("EnableVibration", value ? "true" : "false");
664+
settings_.vibration_enabled = value;
665+
SetSetting("EnableVibration", value ? "true" : "false", ini_key_);
644666
}
645667

646668
void XboxController::SaveDeadzones()
647669
{
648670
// WritePrivateProfile can only write strings, bleh
649-
if (deadzone_.sThumbL)
650-
SetSetting("DeadzoneLeftStick", std::to_string(deadzone_.sThumbL));
671+
if (settings_.deadzone.sThumbL)
672+
SetSetting("DeadzoneLeftStick", std::to_string(settings_.deadzone.sThumbL), ini_key_);
651673

652-
if (deadzone_.sThumbR)
653-
SetSetting("DeadzoneRightStick", std::to_string(deadzone_.sThumbR));
674+
if (settings_.deadzone.sThumbR)
675+
SetSetting("DeadzoneRightStick", std::to_string(settings_.deadzone.sThumbR), ini_key_);
654676

655-
if (deadzone_.bLeftTrigger)
656-
SetSetting("DeadzoneLeftTrigger", std::to_string(deadzone_.bLeftTrigger));
677+
if (settings_.deadzone.bLeftTrigger)
678+
SetSetting("DeadzoneLeftTrigger", std::to_string(settings_.deadzone.bLeftTrigger), ini_key_);
657679

658-
if (deadzone_.bRightTrigger)
659-
SetSetting("DeadzoneRightTrigger", std::to_string(deadzone_.bRightTrigger));
680+
if (settings_.deadzone.bRightTrigger)
681+
SetSetting("DeadzoneRightTrigger", std::to_string(settings_.deadzone.bRightTrigger), ini_key_);
660682
}
661683

662-
int XboxController::GetSettingInt(const std::string& setting, int default_val)
684+
int XboxController::GetSettingInt(const std::string& setting, int default_val, const std::string& ini_key)
663685
{
664-
return GetPrivateProfileIntA(ini_key_.c_str(), setting.c_str(), default_val, ini_path);
686+
return GetPrivateProfileIntA(ini_key.c_str(), setting.c_str(), default_val, ini_path);
665687
}
666688

667-
std::string XboxController::GetSettingString(const std::string& setting, const std::string& default_val)
689+
std::string XboxController::GetSettingString(const std::string& setting, const std::string& default_val, const std::string& ini_key)
668690
{
669691
char result[256];
670692

671-
GetPrivateProfileStringA(ini_key_.c_str(), setting.c_str(), default_val.c_str(), result, 256, ini_path);
693+
GetPrivateProfileStringA(ini_key.c_str(), setting.c_str(), default_val.c_str(), result, 256, ini_path);
672694

673695
return result;
674696
}
675697

676-
bool XboxController::GetSettingBool(const std::string& setting, bool default_val)
698+
bool XboxController::GetSettingBool(const std::string& setting, bool default_val, const std::string& ini_key)
677699
{
678-
auto res = GetSettingString(setting, default_val ? "true" : "false");
700+
auto res = GetSettingString(setting, default_val ? "true" : "false", ini_key);
679701
return res == "true" || res == "TRUE" || res == "yes" || res == "YES" || res == "1" || res == "Y";
680702
}
681703

682-
void XboxController::SetSetting(const std::string& setting, const std::string& value)
704+
void XboxController::SetSetting(const std::string& setting, const std::string& value, const std::string& ini_key)
683705
{
684-
WritePrivateProfileStringA(ini_key_.c_str(), setting.c_str(), value.c_str(), ini_path);
706+
WritePrivateProfileStringA(ini_key.c_str(), setting.c_str(), value.c_str(), ini_path);
685707
}
686708

687709

Xb2XInput/XboxController.hpp

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,16 @@ struct Deadzone {
7373
bool hold;
7474
};
7575

76+
struct UserSettings {
77+
bool guide_enabled = false;
78+
bool vibration_enabled = false;
79+
80+
Deadzone deadzone = { 0 };
81+
82+
std::unordered_map<int, int> button_remap;
83+
bool remap_enabled = false;
84+
};
85+
7686
#pragma pack(pop)
7787

7888
#define HID_GET_REPORT 0x01
@@ -108,29 +118,25 @@ class XboxController
108118
uint8_t endpoint_in_ = 0;
109119
uint8_t endpoint_out_ = 0;
110120

111-
Deadzone deadzone_ = {0};
112121
int deadZoneCalc(short *x_out, short *y_out, short x, short y, short deadzone, short sickzone);
113122

114-
bool guide_enabled_ = false;
115-
bool vibration_enabled_ = false;
116-
117-
std::unordered_map<int, int> button_remap_;
123+
UserSettings settings_;
118124

119125
bool update();
120126

121-
int GetSettingInt(const std::string& setting, int default_val);
122-
std::string GetSettingString(const std::string& setting, const std::string& default_val);
123-
bool GetSettingBool(const std::string& setting, bool default_val);
124-
125-
void SetSetting(const std::string& setting, const std::string& value);
127+
static int GetSettingInt(const std::string& setting, int default_val, const std::string& ini_key);
128+
static std::string GetSettingString(const std::string& setting, const std::string& default_val, const std::string& ini_key);
129+
static bool GetSettingBool(const std::string& setting, bool default_val, const std::string& ini_key);
130+
static void SetSetting(const std::string& setting, const std::string& value, const std::string& ini_key);
126131

132+
static UserSettings LoadSettings(const std::string& ini_key, bool use_defaults);
127133
void SaveDeadzones();
128134

129135
public:
130-
bool GuideEnabled() { return guide_enabled_; }
136+
bool GuideEnabled() { return settings_.guide_enabled; }
131137
void GuideEnabled(bool value);
132138

133-
bool VibrationEnabled() { return vibration_enabled_; }
139+
bool VibrationEnabled() { return settings_.vibration_enabled; }
134140
void VibrationEnabled(bool value);
135141

136142
XboxController(libusb_device_handle* handle, uint8_t* usb_ports, int num_ports);
@@ -140,7 +146,7 @@ class XboxController
140146
const char* GetProductName() const { return usb_productname_; }
141147
const char* GetVendorName() const { return usb_vendorname_; }
142148
const char* GetSerialNo() const { return usb_serialno_; }
143-
Deadzone GetDeadzone() { return deadzone_; }
149+
Deadzone GetDeadzone() { return settings_.deadzone; }
144150

145151
int GetControllerIndex()
146152
{

0 commit comments

Comments
 (0)