@@ -51,6 +51,8 @@ std::vector<std::pair<int, int>> xbox_devices =
51
51
{0xFFFF , 0xFFFF }, // PowerWave Xbox Controller (The ID's may look sketchy but this controller actually uses it)
52
52
};
53
53
54
+ UserSettings defaults_;
55
+
54
56
// Xb2XInput.cpp externs
55
57
void USBDeviceChanged (const XboxController& controller, bool added);
56
58
extern char ini_path[4096 ];
@@ -146,12 +148,77 @@ libusb_device_handle* XboxController::OpenDevice()
146
148
return ret;
147
149
}
148
150
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
+
149
213
bool XboxController::Initialize (WCHAR* app_title)
150
214
{
151
215
static bool inited = false ;
152
216
if (inited)
153
217
return true ;
154
218
219
+ // Load default INI settings
220
+ defaults_ = LoadSettings (" Default" , false );
221
+
155
222
// Init libusb & ViGEm
156
223
auto ret = libusb_init (NULL );
157
224
if (ret < 0 )
@@ -296,51 +363,7 @@ XboxController::XboxController(libusb_device_handle* handle, uint8_t* usb_ports,
296
363
ini_key_ = ss.str ();
297
364
298
365
// 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 );
344
367
345
368
usb_product_ = usb_desc_.idProduct ;
346
369
usb_vendor_ = usb_desc_.idVendor ;
@@ -359,7 +382,7 @@ void CALLBACK XboxController::OnVigemNotification(PVIGEM_CLIENT Client, PVIGEM_T
359
382
if (controller.target_ != Target)
360
383
continue ;
361
384
362
- if (!controller.vibration_enabled_ )
385
+ if (!controller.settings_ . vibration_enabled )
363
386
LargeMotor = SmallMotor = 0 ;
364
387
365
388
memset (&controller.output_prev_ , 0 , sizeof (XboxOutputReport));
@@ -469,7 +492,6 @@ bool XboxController::update()
469
492
int length = 0 ;
470
493
int ret = -1 ;
471
494
472
-
473
495
// if we have interrupt endpoints use those for better compatibility, otherwise fallback to control transfers
474
496
if (endpoint_in_)
475
497
{
@@ -510,7 +532,7 @@ bool XboxController::update()
510
532
gamepad_.wButtons |= input_prev_.Gamepad .bAnalogButtons [OGXINPUT_GAMEPAD_WHITE] ? XUSB_GAMEPAD_LEFT_SHOULDER : 0 ;
511
533
gamepad_.wButtons |= input_prev_.Gamepad .bAnalogButtons [OGXINPUT_GAMEPAD_BLACK] ? XUSB_GAMEPAD_RIGHT_SHOULDER : 0 ;
512
534
513
- if (button_remap_ .size ())
535
+ if (settings_. button_remap .size ())
514
536
{
515
537
auto buttons = gamepad_.wButtons ;
516
538
gamepad_.wButtons = 0 ;
@@ -520,8 +542,8 @@ bool XboxController::update()
520
542
if (buttons & XUSB_GAMEPAD_##btn) \
521
543
{ \
522
544
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]; \
525
547
gamepad_.wButtons |= remap; \
526
548
}
527
549
@@ -552,57 +574,57 @@ bool XboxController::update()
552
574
(input_prev_.Gamepad .wButtons & (OGXINPUT_GAMEPAD_DPAD_UP | OGXINPUT_GAMEPAD_DPAD_DOWN))) // Direction to change deadzone
553
575
{
554
576
// wait for previous deadzone adjustment button release
555
- if (!deadzone_. hold ){
577
+ if (!settings_. deadzone . hold ){
556
578
short adjustment = (input_prev_.Gamepad .wButtons & OGXINPUT_GAMEPAD_DPAD_UP ? 500 : -500 );
557
579
558
580
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);
560
582
}
561
583
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);
563
585
}
564
586
565
587
SaveDeadzones ();
566
588
567
589
// wait for button release
568
- deadzone_ .hold = true ;
590
+ settings_. deadzone .hold = true ;
569
591
}
570
592
571
593
// Trigger Deadzone Adjustment: (LT | RT) + LS + RS + D-Pad Up/Down
572
594
} else if ((input_prev_.Gamepad .wButtons & OGXINPUT_GAMEPAD_LEFT_THUMB) && (input_prev_.Gamepad .wButtons & OGXINPUT_GAMEPAD_RIGHT_THUMB) && // // (LS && RS) AND
573
595
((input_prev_.Gamepad .bAnalogButtons [OGXINPUT_GAMEPAD_LEFT_TRIGGER] >= 0x8 ) ^ (input_prev_.Gamepad .bAnalogButtons [OGXINPUT_GAMEPAD_RIGHT_TRIGGER] >= 0x8 )) && // Left XOR Right Trigger AND
574
596
(input_prev_.Gamepad .wButtons & (OGXINPUT_GAMEPAD_DPAD_UP | OGXINPUT_GAMEPAD_DPAD_DOWN))) // Direction to change deadzone
575
597
{
576
- if (!deadzone_ .hold ){
598
+ if (!settings_. deadzone .hold ){
577
599
short adjustment = (input_prev_.Gamepad .wButtons & OGXINPUT_GAMEPAD_DPAD_UP ? 15 : -15 );
578
600
579
601
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 );
581
603
}
582
604
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 );
584
606
}
585
607
586
608
SaveDeadzones ();
587
609
588
610
// wait for button release
589
- deadzone_ .hold = true ;
611
+ settings_. deadzone .hold = true ;
590
612
}
591
613
} else {
592
614
// reset button release
593
- deadzone_ .hold = false ;
615
+ settings_. deadzone .hold = false ;
594
616
}
595
617
}
596
618
597
619
// 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);
600
622
601
623
// Trigger Deadzone Calculations
602
624
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 );
604
626
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 );
606
628
gamepad_.bRightTrigger = triggerbuf;
607
629
608
630
// Create a 'digital' bitfield so we can test combinations against LT/RT
@@ -613,7 +635,7 @@ bool XboxController::update()
613
635
digitalPressed |= XUSB_GAMEPAD_RT;
614
636
615
637
// Secret guide combination
616
- if (combo_guideButton && (digitalPressed & combo_guideButton) == combo_guideButton)
638
+ if (settings_. guide_enabled && combo_guideButton && (digitalPressed & combo_guideButton) == combo_guideButton)
617
639
{
618
640
gamepad_.wButtons |= XUSB_GAMEPAD_GUIDE;
619
641
@@ -633,55 +655,55 @@ bool XboxController::update()
633
655
634
656
void XboxController::GuideEnabled (bool value)
635
657
{
636
- guide_enabled_ = value;
637
- SetSetting (" EnableGuide" , value ? " true" : " false" );
658
+ settings_. guide_enabled = value;
659
+ SetSetting (" EnableGuide" , value ? " true" : " false" , ini_key_ );
638
660
}
639
661
640
662
void XboxController::VibrationEnabled (bool value)
641
663
{
642
- vibration_enabled_ = value;
643
- SetSetting (" EnableVibration" , value ? " true" : " false" );
664
+ settings_. vibration_enabled = value;
665
+ SetSetting (" EnableVibration" , value ? " true" : " false" , ini_key_ );
644
666
}
645
667
646
668
void XboxController::SaveDeadzones ()
647
669
{
648
670
// 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_ );
651
673
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_ );
654
676
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_ );
657
679
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_ );
660
682
}
661
683
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 )
663
685
{
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);
665
687
}
666
688
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 )
668
690
{
669
691
char result[256 ];
670
692
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);
672
694
673
695
return result;
674
696
}
675
697
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 )
677
699
{
678
- auto res = GetSettingString (setting, default_val ? " true" : " false" );
700
+ auto res = GetSettingString (setting, default_val ? " true" : " false" , ini_key );
679
701
return res == " true" || res == " TRUE" || res == " yes" || res == " YES" || res == " 1" || res == " Y" ;
680
702
}
681
703
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 )
683
705
{
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);
685
707
}
686
708
687
709
0 commit comments