HW: Don't be responsible for g_controller_interface

Currently, `g_controller_interface` is initialized and shut down by each
of `GCKeyboard`, `GCPad`, `Wiimote`, and `HotkeyManager`.

This 1) is weird conceptually, because it necessitates passing a pointer
to the native window to each of those classes, which don't need it, and
2) can cause issues when controller backends are initialized or shutdown
multiple times in succession.
This commit is contained in:
Michael Maltese 2016-10-11 12:54:35 -07:00
parent 183f3c3759
commit a082e9324f
10 changed files with 24 additions and 36 deletions

View File

@ -510,8 +510,9 @@ void EmuThread()
bool init_controllers = false; bool init_controllers = false;
if (!g_controller_interface.IsInit()) if (!g_controller_interface.IsInit())
{ {
Pad::Initialize(s_window_handle); g_controller_interface.Initialize(s_window_handle);
Keyboard::Initialize(s_window_handle); Pad::Initialize();
Keyboard::Initialize();
init_controllers = true; init_controllers = true;
} }
else else
@ -525,7 +526,7 @@ void EmuThread()
if (core_parameter.bWii && !SConfig::GetInstance().m_bt_passthrough_enabled) if (core_parameter.bWii && !SConfig::GetInstance().m_bt_passthrough_enabled)
{ {
if (init_controllers) if (init_controllers)
Wiimote::Initialize(s_window_handle, !s_state_filename.empty() ? Wiimote::Initialize(!s_state_filename.empty() ?
Wiimote::InitializeMode::DO_WAIT_FOR_WIIMOTES : Wiimote::InitializeMode::DO_WAIT_FOR_WIIMOTES :
Wiimote::InitializeMode::DO_NOT_WAIT_FOR_WIIMOTES); Wiimote::InitializeMode::DO_NOT_WAIT_FOR_WIIMOTES);
else else
@ -651,6 +652,7 @@ void EmuThread()
Wiimote::Shutdown(); Wiimote::Shutdown();
Keyboard::Shutdown(); Keyboard::Shutdown();
Pad::Shutdown(); Pad::Shutdown();
g_controller_interface.Shutdown();
init_controllers = false; init_controllers = false;
} }

View File

@ -23,11 +23,9 @@ InputConfig* GetConfig()
void Shutdown() void Shutdown()
{ {
s_config.ClearControllers(); s_config.ClearControllers();
g_controller_interface.Shutdown();
} }
void Initialize(void* const hwnd) void Initialize()
{ {
if (s_config.ControllersNeedToBeCreated()) if (s_config.ControllersNeedToBeCreated())
{ {
@ -35,7 +33,6 @@ void Initialize(void* const hwnd)
s_config.CreateController<GCKeyboard>(i); s_config.CreateController<GCKeyboard>(i);
} }
g_controller_interface.Initialize(hwnd);
g_controller_interface.RegisterHotplugCallback(LoadConfig); g_controller_interface.RegisterHotplugCallback(LoadConfig);
// Load the saved controller config // Load the saved controller config

View File

@ -12,7 +12,7 @@ struct KeyboardStatus;
namespace Keyboard namespace Keyboard
{ {
void Shutdown(); void Shutdown();
void Initialize(void* const hwnd); void Initialize();
void LoadConfig(); void LoadConfig();
InputConfig* GetConfig(); InputConfig* GetConfig();

View File

@ -22,11 +22,9 @@ InputConfig* GetConfig()
void Shutdown() void Shutdown()
{ {
s_config.ClearControllers(); s_config.ClearControllers();
g_controller_interface.Shutdown();
} }
void Initialize(void* const hwnd) void Initialize()
{ {
if (s_config.ControllersNeedToBeCreated()) if (s_config.ControllersNeedToBeCreated())
{ {
@ -34,7 +32,6 @@ void Initialize(void* const hwnd)
s_config.CreateController<GCPad>(i); s_config.CreateController<GCPad>(i);
} }
g_controller_interface.Initialize(hwnd);
g_controller_interface.RegisterHotplugCallback(LoadConfig); g_controller_interface.RegisterHotplugCallback(LoadConfig);
// Load the saved controller config // Load the saved controller config

View File

@ -13,7 +13,7 @@ struct GCPadStatus;
namespace Pad namespace Pad
{ {
void Shutdown(); void Shutdown();
void Initialize(void* const hwnd); void Initialize();
void LoadConfig(); void LoadConfig();
InputConfig* GetConfig(); InputConfig* GetConfig();

View File

@ -24,11 +24,9 @@ void Shutdown()
s_config.ClearControllers(); s_config.ClearControllers();
WiimoteReal::Stop(); WiimoteReal::Stop();
g_controller_interface.Shutdown();
} }
void Initialize(void* const hwnd, InitializeMode init_mode) void Initialize(InitializeMode init_mode)
{ {
if (s_config.ControllersNeedToBeCreated()) if (s_config.ControllersNeedToBeCreated())
{ {
@ -36,7 +34,6 @@ void Initialize(void* const hwnd, InitializeMode init_mode)
s_config.CreateController<WiimoteEmu::Wiimote>(i); s_config.CreateController<WiimoteEmu::Wiimote>(i);
} }
g_controller_interface.Initialize(hwnd);
g_controller_interface.RegisterHotplugCallback(LoadConfig); g_controller_interface.RegisterHotplugCallback(LoadConfig);
s_config.LoadConfig(false); s_config.LoadConfig(false);

View File

@ -42,7 +42,7 @@ enum class InitializeMode
}; };
void Shutdown(); void Shutdown();
void Initialize(void* const hwnd, InitializeMode init_mode); void Initialize(InitializeMode init_mode);
void ResetAllWiimotes(); void ResetAllWiimotes();
void LoadConfig(); void LoadConfig();
void Resume(); void Resume();

View File

@ -182,12 +182,11 @@ bool IsPressed(int Id, bool held)
return false; return false;
} }
void Initialize(void* const hwnd) void Initialize()
{ {
if (s_config.ControllersNeedToBeCreated()) if (s_config.ControllersNeedToBeCreated())
s_config.CreateController<HotkeyManager>(); s_config.CreateController<HotkeyManager>();
g_controller_interface.Initialize(hwnd);
g_controller_interface.RegisterHotplugCallback(LoadConfig); g_controller_interface.RegisterHotplugCallback(LoadConfig);
// load the saved controller config // load the saved controller config
@ -207,8 +206,6 @@ void LoadConfig()
void Shutdown() void Shutdown()
{ {
s_config.ClearControllers(); s_config.ClearControllers();
g_controller_interface.Shutdown();
} }
} }

View File

@ -155,7 +155,7 @@ private:
namespace HotkeyManagerEmu namespace HotkeyManagerEmu
{ {
void Initialize(void* const hwnd); void Initialize();
void Shutdown(); void Shutdown();
void LoadConfig(); void LoadConfig();

View File

@ -333,19 +333,16 @@ bool CFrame::InitControllers()
if (!g_controller_interface.IsInit()) if (!g_controller_interface.IsInit())
{ {
#if defined(HAVE_X11) && HAVE_X11 #if defined(HAVE_X11) && HAVE_X11
Window win = X11Utils::XWindowFromHandle(GetHandle()); void* win = reinterpret_cast<void*>(X11Utils::XWindowFromHandle(GetHandle()));
Pad::Initialize(reinterpret_cast<void*>(win));
Keyboard::Initialize(reinterpret_cast<void*>(win));
Wiimote::Initialize(reinterpret_cast<void*>(win),
Wiimote::InitializeMode::DO_NOT_WAIT_FOR_WIIMOTES);
HotkeyManagerEmu::Initialize(reinterpret_cast<void*>(win));
#else #else
Pad::Initialize(reinterpret_cast<void*>(GetHandle())); void* win = reinterpret_cast<void*>(GetHandle());
Keyboard::Initialize(reinterpret_cast<void*>(GetHandle()));
Wiimote::Initialize(reinterpret_cast<void*>(GetHandle()),
Wiimote::InitializeMode::DO_NOT_WAIT_FOR_WIIMOTES);
HotkeyManagerEmu::Initialize(reinterpret_cast<void*>(GetHandle()));
#endif #endif
g_controller_interface.Initialize(win);
Pad::Initialize();
Keyboard::Initialize();
Wiimote::Initialize(Wiimote::InitializeMode::DO_NOT_WAIT_FOR_WIIMOTES);
HotkeyManagerEmu::Initialize();
return true; return true;
} }
return false; return false;
@ -547,6 +544,7 @@ CFrame::~CFrame()
Keyboard::Shutdown(); Keyboard::Shutdown();
Pad::Shutdown(); Pad::Shutdown();
HotkeyManagerEmu::Shutdown(); HotkeyManagerEmu::Shutdown();
g_controller_interface.Shutdown();
drives.clear(); drives.clear();