Add toggle: SDL GameController mode for joysticks
Add a toggle for SDL GameController Mode in the game key configuration dialog, default enabled. On check or uncheck, change the option and reinitialize joysticks, not using GameController mode if it is disabled. Signed-off-by: Rafael Kitover <rkitover@gmail.com>
This commit is contained in:
parent
8576733c0d
commit
cc9a03ce48
|
@ -211,6 +211,7 @@ std::array<Option, kNbOptions>& Option::All() {
|
|||
|
||||
/// Joypad
|
||||
uint32_t default_stick = 1;
|
||||
bool sdl_game_controller_mode = true;
|
||||
|
||||
/// Geometry
|
||||
bool fullscreen = false;
|
||||
|
@ -293,6 +294,7 @@ std::array<Option, kNbOptions>& Option::All() {
|
|||
Option(OptionID::kJoy),
|
||||
Option(OptionID::kJoyAutofireThrottle, &gopts.autofire_rate, 1, 1000),
|
||||
Option(OptionID::kJoyDefault, &g_owned_opts.default_stick, 1, 4),
|
||||
Option(OptionID::kSDLGameControllerMode, &g_owned_opts.sdl_game_controller_mode),
|
||||
|
||||
/// Keyboard
|
||||
Option(OptionID::kKeyboard),
|
||||
|
@ -478,6 +480,8 @@ const std::array<OptionData, kNbOptions + 1> kAllOptionsData = {
|
|||
_("The autofire toggle period, in frames (1/60 s)")},
|
||||
OptionData{"Joypad/Default", "",
|
||||
_("The number of the stick to use in single-player mode")},
|
||||
OptionData{"Joypad/SDLGameControllerMode", "SDLGameControllerMode",
|
||||
_("Whether to enable SDL GameController mode")},
|
||||
|
||||
/// Keyboard
|
||||
OptionData{"Keyboard/*", "",
|
||||
|
|
|
@ -61,6 +61,7 @@ enum class OptionID {
|
|||
kJoy,
|
||||
kJoyAutofireThrottle,
|
||||
kJoyDefault,
|
||||
kSDLGameControllerMode,
|
||||
|
||||
/// Keyboard
|
||||
kKeyboard,
|
||||
|
|
|
@ -65,6 +65,7 @@ static constexpr std::array<Option::Type, kNbOptions> kOptionsTypes = {
|
|||
/*kJoy*/ Option::Type::kNone,
|
||||
/*kJoyAutofireThrottle*/ Option::Type::kInt,
|
||||
/*kJoyDefault*/ Option::Type::kUnsigned,
|
||||
/*kSDLGameControllerMode*/ Option::Type::kBool,
|
||||
|
||||
/// Keyboard
|
||||
/*kKeyboard*/ Option::Type::kNone,
|
||||
|
|
|
@ -3,9 +3,11 @@
|
|||
#include <wx/xrc/xmlres.h>
|
||||
|
||||
#include "wx/dialogs/validated-child.h"
|
||||
#include "wx/opts.h"
|
||||
#include "wx/config/option-proxy.h"
|
||||
#include "wx/config/option.h"
|
||||
#include "wx/widgets/option-validator.h"
|
||||
#include "wx/widgets/user-input-ctrl.h"
|
||||
#include "wx/wxvbam.h"
|
||||
|
||||
namespace dialogs {
|
||||
|
||||
|
@ -23,6 +25,11 @@ JoypadConfig::JoypadConfig(wxWindow* parent) : wxDialog(), keep_on_top_styler_(t
|
|||
#endif
|
||||
wxXmlResource::Get()->LoadDialog(this, parent, "JoypadConfig");
|
||||
|
||||
this->Bind(wxEVT_CHECKBOX, std::bind(&JoypadConfig::ToggleSDLGameControllerMode, this),
|
||||
XRCID("SDLGameControllerMode"));
|
||||
|
||||
GetValidatedChild<wxCheckBox>(this, "SDLGameControllerMode")->SetValue(OPTION(kSDLGameControllerMode));
|
||||
|
||||
for (int joypad = 0; joypad < 4; joypad++) {
|
||||
wxWindow* panel = GetValidatedChild(this, wxString::Format("joy%d", joypad + 1));
|
||||
|
||||
|
@ -82,4 +89,19 @@ void JoypadConfig::ClearJoypad(wxWindow* panel) {
|
|||
}
|
||||
}
|
||||
|
||||
void JoypadConfig::ToggleSDLGameControllerMode() {
|
||||
OPTION(kSDLGameControllerMode) = GetValidatedChild<wxCheckBox>(this, "SDLGameControllerMode")
|
||||
->IsChecked();
|
||||
ClearAllJoypads();
|
||||
wxGetApp().frame->PollAllJoysticks();
|
||||
}
|
||||
|
||||
void JoypadConfig::ClearAllJoypads() {
|
||||
for (unsigned joypad = 0; joypad < 4; joypad++) {
|
||||
wxWindow* panel = GetValidatedChild(this, wxString::Format("joy%d", joypad + 1));
|
||||
|
||||
ClearJoypad(panel);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace dialogs
|
||||
|
|
|
@ -25,6 +25,12 @@ private:
|
|||
// Clears all Joypad controls.
|
||||
void ClearJoypad(wxWindow* panel);
|
||||
|
||||
// Clears all Joypad controls for all Joypads.
|
||||
void ClearAllJoypads();
|
||||
|
||||
// Toggle SDL GameController mode for all joysticks.
|
||||
void ToggleSDLGameControllerMode();
|
||||
|
||||
const widgets::KeepOnTopStyler keep_on_top_styler_;
|
||||
};
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
#include <wx/timer.h>
|
||||
#include <SDL.h>
|
||||
|
||||
#include "wx/config/option-proxy.h"
|
||||
#include "wx/config/option.h"
|
||||
#include "wx/wxvbam.h"
|
||||
|
||||
namespace {
|
||||
|
@ -171,7 +173,7 @@ wxSDLJoyState::wxSDLJoyState(int sdl_index)
|
|||
|
||||
wxSDLJoyState::wxSDLJoyState(wxJoystick joystick) : wx_joystick_(joystick) {
|
||||
int sdl_index = wx_joystick_.sdl_index_;
|
||||
if (SDL_IsGameController(sdl_index)) {
|
||||
if (OPTION(kSDLGameControllerMode) && SDL_IsGameController(sdl_index)) {
|
||||
game_controller_ = SDL_GameControllerOpen(sdl_index);
|
||||
if (game_controller_)
|
||||
sdl_joystick_ = SDL_GameControllerGetJoystick(game_controller_);
|
||||
|
|
|
@ -315,6 +315,8 @@ public:
|
|||
|
||||
void PollJoysticks() { joy.Poll(); }
|
||||
|
||||
void PollAllJoysticks() { joy.PollAllJoysticks(); }
|
||||
|
||||
// Poll joysticks with timer.
|
||||
void StartJoyPollTimer();
|
||||
void StopJoyPollTimer();
|
||||
|
|
|
@ -4,6 +4,12 @@
|
|||
<title>Joypad Configuration</title>
|
||||
<object class="wxBoxSizer">
|
||||
<orient>wxVERTICAL</orient>
|
||||
<object class="sizeritem">
|
||||
<flag>wxALIGN_CENTRE_HORIZONTAL</flag>
|
||||
<object class="wxCheckBox" name="SDLGameControllerMode">
|
||||
<label>SDL GameController Mode</label>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxNotebook">
|
||||
<object class="notebookpage">
|
||||
|
|
Loading…
Reference in New Issue