diff --git a/Source/Core/Common/Src/Common.h b/Source/Core/Common/Src/Common.h
index 7df31f7cb7..712006c1d2 100644
--- a/Source/Core/Common/Src/Common.h
+++ b/Source/Core/Common/Src/Common.h
@@ -38,6 +38,7 @@
#include "../../../PluginSpecs/CommonTypes.h"
#define HAVE_WIIUSE 1
+ #define HAVE_SDL 1
#define HAVE_WX 1
#else
#include "CommonTypes.h"
diff --git a/Source/Core/Core/Core.vcproj b/Source/Core/Core/Core.vcproj
index af0d405876..f4352351fd 100644
--- a/Source/Core/Core/Core.vcproj
+++ b/Source/Core/Core/Core.vcproj
@@ -1244,6 +1244,14 @@
RelativePath=".\Src\PluginManager.h"
>
+
+
+
+
diff --git a/Source/Core/Core/Src/InputManager.cpp b/Source/Core/Core/Src/InputManager.cpp
new file mode 100644
index 0000000000..14ed63ee8c
--- /dev/null
+++ b/Source/Core/Core/Src/InputManager.cpp
@@ -0,0 +1,27 @@
+#include "InputManager.h"
+
+bool InputManager::Init() {
+#ifdef HAVE_SDL
+ // Move also joystick opening code here.
+ if (! sdlInit) {
+ /* SDL 1.3 use DirectInput instead of the old Microsoft Multimeda API,
+ and with this we need the SDL_INIT_VIDEO flag as well */
+ if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) {
+ PanicAlert("Could not initialize SDL! (%s)\n", SDL_GetError());
+ } else {
+ sdlInit = true;
+ }
+ }
+#endif
+
+ return true;
+}
+
+bool InputManager::Shutdown() {
+#ifdef HAVE_SDL
+ SDL_Quit();
+ sdlInit = false;
+#endif
+
+ return true;
+}
diff --git a/Source/Core/Core/Src/InputManager.h b/Source/Core/Core/Src/InputManager.h
new file mode 100644
index 0000000000..2d800ad7f6
--- /dev/null
+++ b/Source/Core/Core/Src/InputManager.h
@@ -0,0 +1,16 @@
+#ifndef INPUTMANAGER_H
+#define INPUTMANAGER_H
+
+class InputManager {
+
+public:
+ bool Init();
+ bool Shutdown();
+
+ InputManager(): sdlInit(false) {}
+ ~InputManager() {}
+
+private:
+ bool sdlInit;
+};
+#endif
diff --git a/Source/Core/Core/Src/PluginManager.cpp b/Source/Core/Core/Src/PluginManager.cpp
index b6d8159a4e..e31d6593a0 100644
--- a/Source/Core/Core/Src/PluginManager.cpp
+++ b/Source/Core/Core/Src/PluginManager.cpp
@@ -15,31 +15,20 @@
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
-
-//////////////////////////////////////////////////////////////////////////////////////////
-// Include
-// ŻŻŻŻŻŻŻŻŻŻŻŻ
-#include // System
+#include
#include
-//#include "Globals.h" // Local
+//#include "Globals.h"
+#include "FileSearch.h"
+#include "FileUtil.h"
#include "PluginManager.h"
#include "ConfigManager.h"
#include "LogManager.h"
-#include "Core.h"
-
-#include "FileSearch.h" // Common
-#include "FileUtil.h"
#include "StringUtil.h"
-#include "ConsoleWindow.h"
CPluginManager CPluginManager::m_Instance;
-//////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////////////////
-// The Plugin Manager Class
-// ŻŻŻŻŻŻŻŻŻŻŻŻ
CPluginManager::CPluginManager() :
m_params(SConfig::GetInstance().m_LocalCoreStartupParameter)
{
@@ -47,189 +36,113 @@ CPluginManager::CPluginManager() :
m_PluginGlobals->eventHandler = EventHandler::GetInstance();
m_PluginGlobals->config = (void *)&SConfig::GetInstance();
m_PluginGlobals->messageLogger = NULL;
+ m_InputManager = new InputManager();
}
-// Function: FreeLibrary()
-// Called from: This will be called when Dolphin is closed, not when we Stop a game
+
CPluginManager::~CPluginManager()
{
- Console::Print("Delete CPluginManager\n");
+ if (m_PluginGlobals)
+ delete m_PluginGlobals;
- if (m_PluginGlobals) delete m_PluginGlobals;
+ ShutdownPlugins();
- if (m_dsp) delete m_dsp;
-
- if (m_video) delete m_video;
+ delete m_InputManager;
- /**/
- for (int i = 0; i < MAXPADS; i++)
- {
- if (m_pad[i] && OkayToInitPlugin(i))
- {
- Console::Print("Delete: %i\n", i);
- delete m_pad[i];
- }
- m_pad[i] = NULL;
- }
-
-
- for (int i = 0; i < MAXWIIMOTES; i++)
- if (m_wiimote[i]) delete m_wiimote[i];
}
-//////////////////////////////////////////////
+bool CPluginManager::InitPlugins() {
-//////////////////////////////////////////////////////////////////////////////////////////
-// Init and ShutDown Plugins
-// ŻŻŻŻŻŻŻŻŻŻŻŻ
-
-// Point the m_pad[] and other variables to a certain plugin
-bool CPluginManager::InitPlugins()
-{
-
- if (! GetVideo())
- {
- PanicAlert("Can't init Video Plugin");
- return false;
+ if (! GetVideo()) {
+ PanicAlert("Can't init Video Plugin");
+ return false;
}
- if (! GetDSP())
- {
- PanicAlert("Can't init DSP Plugin");
- return false;
+ if (! GetDSP()) {
+ PanicAlert("Can't init DSP Plugin");
+ return false;
+ }
+
+ if (! m_InputManager->Init()) {
+ PanicAlert("Can't init input manager");
+ return false;
}
- // Check if we get at least one pad or wiimote
bool pad = false;
bool wiimote = false;
- // Init pad
for (int i = 0; i < MAXPADS; i++)
{
- if (! m_params.m_strPadPlugin[i].empty())
- GetPAD(i);
- if (m_pad[i] != NULL)
- pad = true;
- }
- if (! pad)
- {
- PanicAlert("Can't init any PAD Plugins");
- return false;
+ if (! m_params.m_strPadPlugin[i].empty())
+ GetPAD(i);
+
+ if (m_pad[i] != NULL)
+ pad = true;
}
- // Init wiimote
- if (m_params.bWii)
+ if (! pad) {
+ PanicAlert("Can't init any PAD Plugins");
+ return false;
+ }
+ if (m_params.bWii) {
+ for (int i = 0; i < MAXWIIMOTES; i++)
{
- for (int i = 0; i < MAXWIIMOTES; i++)
- {
- if (! m_params.m_strWiimotePlugin[i].empty())
- GetWiimote(i);
+ if (! m_params.m_strWiimotePlugin[i].empty())
+ GetWiimote(i);
- if (m_wiimote[i] != NULL)
- wiimote = true;
- }
- if (! wiimote)
- {
- PanicAlert("Can't init any Wiimote Plugins");
- return false;
- }
+ if (m_wiimote[i] != NULL)
+ wiimote = true;
+ }
+
+ if (! wiimote) {
+ PanicAlert("Can't init any Wiimote Plugins");
+ return false;
+ }
}
return true;
}
void CPluginManager::ShutdownPlugins()
-{
- // Check if we can shutdown the plugin
- for (int i = 0; i < MAXPADS; i++)
- {
- if (m_pad[i] && OkayToInitPlugin(i))
- {
- //Console::Print("Shutdown: %i\n", i);
- m_pad[i]->Shutdown();
- }
- //delete m_pad[i];
- //m_pad[i] = NULL;
+{
+ for (int i = 0; i < MAXPADS; i++) {
+ if (m_pad[i]) {
+ m_pad[i]->Shutdown();
+ delete m_pad[i];
+ m_pad[i] = NULL;
}
-
- for (int i = 0; i < MAXWIIMOTES; i++)
- if (m_wiimote[i]) m_wiimote[i]->Shutdown();
-
- if (m_video)
- m_video->Shutdown();
-
- if (m_dsp)
- m_dsp->Shutdown();
-}
-//////////////////////////////////////////
-
-
-//////////////////////////////////////////////////////////////////////////////////////////
-// Supporting functions
-// ŻŻŻŻŻŻŻŻŻŻŻŻ
-
-
-void *CPluginManager::LoadPlugin(const char *_rFilename)//, PLUGIN_TYPE type)
-{
- CPluginInfo info(_rFilename);
- PLUGIN_TYPE type = info.GetPluginInfo().Type;
- Common::CPlugin *plugin = NULL;
- switch (type)
- {
- case PLUGIN_TYPE_VIDEO:
- plugin = new Common::PluginVideo(_rFilename);
- break;
-
- case PLUGIN_TYPE_PAD:
- plugin = new Common::PluginPAD(_rFilename);
- break;
-
- case PLUGIN_TYPE_DSP:
- plugin = new Common::PluginDSP(_rFilename);
- break;
-
- case PLUGIN_TYPE_WIIMOTE:
- plugin = new Common::PluginWiimote(_rFilename);
- break;
- default:
- PanicAlert("Trying to load unsupported type %d", type);
}
- if (!plugin->IsValid())
- {
- PanicAlert("Can't open %s", _rFilename);
- return NULL;
- }
-
- plugin->SetGlobals(m_PluginGlobals);
- return plugin;
+ if (! m_InputManager->Shutdown()) {
+ PanicAlert("Error cleaning after input manager");
+ }
+
+ for (int i = 0; i < MAXWIIMOTES; i++) {
+ if (m_wiimote[i]) {
+ m_wiimote[i]->Shutdown();
+ delete m_wiimote[i];
+ m_wiimote[i] = NULL;
+ }
+ }
+
+ if (m_video) {
+ m_video->Shutdown();
+ delete m_video;
+ m_video = NULL;
+ }
+
+ if (m_dsp) {
+ m_dsp->Shutdown();
+ delete m_dsp;
+ m_dsp = NULL;
+ }
}
-// ----------------------------------------
-/* Check if the plugin has already been initialized. If so, return the Id of the duplicate pad
- so we can point the new m_pad[] to that */
-// -------------
-int CPluginManager::OkayToInitPlugin(int Plugin)
-{
- //Console::Print("OkayToInitShutdown: %i", Plugin);
- // Compare it to the earlier plugins
- for(int i = 0; i < Plugin; i++)
- if (m_params.m_strPadPlugin[Plugin] == m_params.m_strPadPlugin[i])
- {
- //Console::Print("(%i %i) %s\n", Plugin, i, g_CoreStartupParameter.m_strPadPlugin[Plugin].c_str());
- return i;
- }
- return -1;
-}
-
-
-PLUGIN_GLOBALS* CPluginManager::GetGlobals()
-{
+PLUGIN_GLOBALS* CPluginManager::GetGlobals() {
return m_PluginGlobals;
}
-
// ----------------------------------------
// Create list of available plugins
// -------------
@@ -267,29 +180,12 @@ void CPluginManager::ScanForPlugins()
}
}
}
-/////////////////////////////////////////////////
-
-//////////////////////////////////////////////////////////////////////////////////////////
-// Create or return the already created plugin pointers
-// ŻŻŻŻŻŻŻŻŻŻŻŻ
Common::PluginPAD *CPluginManager::GetPAD(int controller)
{
if (m_pad[controller] == NULL)
- {
- if(OkayToInitPlugin(controller) == -1)
- {
- m_pad[controller] = (Common::PluginPAD*)LoadPlugin(m_params.m_strPadPlugin[controller].c_str());
- Console::Print("LoadPlugin: %i\n", controller);
- }
- else
- {
- Console::Print("Pointed: %i to %i\n", controller, OkayToInitPlugin(controller));
- m_pad[controller] = m_pad[OkayToInitPlugin(controller)];
- }
- }
+ m_pad[controller] = (Common::PluginPAD*)LoadPlugin(m_params.m_strPadPlugin[controller].c_str());
- //Console::Print("Returned: %i\n", controller);
return m_pad[controller];
}
@@ -317,15 +213,45 @@ Common::PluginVideo *CPluginManager::GetVideo() {
return m_video;
}
-///////////////////////////////////////////
+
+void *CPluginManager::LoadPlugin(const char *_rFilename)//, PLUGIN_TYPE type)
+{
+ CPluginInfo info(_rFilename);
+ PLUGIN_TYPE type = info.GetPluginInfo().Type;
+ Common::CPlugin *plugin = NULL;
+ switch (type) {
+ case PLUGIN_TYPE_VIDEO:
+ plugin = new Common::PluginVideo(_rFilename);
+ break;
+
+ case PLUGIN_TYPE_PAD:
+ plugin = new Common::PluginPAD(_rFilename);
+ break;
+
+ case PLUGIN_TYPE_DSP:
+ plugin = new Common::PluginDSP(_rFilename);
+ break;
+
+ case PLUGIN_TYPE_WIIMOTE:
+ plugin = new Common::PluginWiimote(_rFilename);
+ break;
+ default:
+ PanicAlert("Trying to load unsupported type %d", type);
+ }
+
+ if (!plugin->IsValid()) {
+ PanicAlert("Can't open %s", _rFilename);
+ return NULL;
+ }
+
+ plugin->SetGlobals(m_PluginGlobals);
-//////////////////////////////////////////////////////////////////////////////////////////
-// Call DLL functions
-// ŻŻŻŻŻŻŻŻŻŻŻŻ
+ return plugin;
+}
// ----------------------------------------
-// Open config window. _rFilename = plugin filename , ret = the dll slot number
+// Open config window. _rFilename = plugin filename ,ret = the dll slot number
// -------------
void CPluginManager::OpenConfig(void* _Parent, const char *_rFilename)
{
@@ -342,9 +268,9 @@ void CPluginManager::OpenConfig(void* _Parent, const char *_rFilename)
void CPluginManager::OpenDebug(void* _Parent, const char *_rFilename, PLUGIN_TYPE Type, bool Show)
{
if (Type == PLUGIN_TYPE_VIDEO) {
- GetVideo()->Debug((HWND)_Parent, Show);
+ GetVideo()->Debug((HWND)_Parent, Show);
} else if (Type == PLUGIN_TYPE_DSP) {
- GetDSP()->Debug((HWND)_Parent, Show);
+ GetDSP()->Debug((HWND)_Parent, Show);
}
}
@@ -356,15 +282,13 @@ CPluginInfo::CPluginInfo(const char *_rFileName)
, m_Valid(false)
{
Common::CPlugin *plugin = new Common::CPlugin(_rFileName);
- if (plugin->IsValid())
- {
- if (plugin->GetInfo(m_PluginInfo))
- m_Valid = true;
- else
- PanicAlert("Could not get info about plugin %s", _rFileName);
-
- delete plugin;
- }
+ if (plugin->IsValid()) {
+ if (plugin->GetInfo(m_PluginInfo))
+ m_Valid = true;
+ else
+ PanicAlert("Could not get info about plugin %s", _rFileName);
+ delete plugin;
+ }
}
-///////////////////////////////////////////
+
diff --git a/Source/Core/Core/Src/PluginManager.h b/Source/Core/Core/Src/PluginManager.h
index f71c92cce0..c0f5fce28b 100644
--- a/Source/Core/Core/Src/PluginManager.h
+++ b/Source/Core/Core/Src/PluginManager.h
@@ -25,6 +25,7 @@
#include "PluginWiimote.h"
#include "EventHandler.h"
#include "CoreParameter.h"
+#include "InputManager.h"
class CPluginInfo
{
@@ -70,6 +71,7 @@ private:
Common::PluginWiimote *m_wiimote[4];
Common::PluginDSP *m_dsp;
+ InputManager *m_InputManager;
SCoreStartupParameter& m_params;
CPluginManager();
~CPluginManager();
diff --git a/Source/Core/Core/Src/SConscript b/Source/Core/Core/Src/SConscript
index 9838f39e16..a926baaa45 100644
--- a/Source/Core/Core/Src/SConscript
+++ b/Source/Core/Core/Src/SConscript
@@ -15,7 +15,8 @@ files = ["Console.cpp",
"PatchEngine.cpp",
"State.cpp",
"Tracer.cpp",
- 'PluginManager.cpp',
+ "PluginManager.cpp",
+ "InputManager.cpp",
"VolumeHandler.cpp",
"Boot/Boot.cpp",
"Boot/Boot_BIOSEmu.cpp",
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp
index d4ae404180..f93e2e32d4 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp
+++ b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp
@@ -181,12 +181,11 @@ void GetDllInfo(PLUGIN_INFO* _PluginInfo)
void SetDllGlobals(PLUGIN_GLOBALS* _pPluginGlobals) {
}
+
// Call config dialog
// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
void DllConfig(HWND _hParent)
{
- #ifdef _WIN32
-
// Start the pads so we can use them in the configuration and advanced controls
if(!emulator_running)
{
@@ -197,32 +196,11 @@ void DllConfig(HWND _hParent)
emulator_running = false; // Set it back to false
}
- g_Config.Load(); // Load settings
-
- // We don't need a parent for this wxDialog
- //wxWindow win;
- //win.SetHWND(_hParent);
- //ConfigBox frame(&win);
- //win.SetHWND(0);
-
+#if defined(HAVE_WX) && HAVE_WX
m_frame = new ConfigBox(NULL);
m_frame->ShowModal();
+#endif
- #else
- if (SDL_Init(SDL_INIT_JOYSTICK ) < 0)
- {
- printf("Could not initialize SDL! (%s)\n", SDL_GetError());
- return;
- }
-
- g_Config.Load(); // load settings
-
- #if defined(HAVE_WX) && HAVE_WX
- ConfigBox frame(NULL);
- frame.ShowModal();
- #endif
-
- #endif
}
void DllDebugger(HWND _hParent, bool Show) {
@@ -249,18 +227,6 @@ void Initialize(void *init)
DEBUG_INIT();
#endif
- /* SDL 1.3 use DirectInput instead of the old Microsoft Multimeda API, and with this we need
- the SDL_INIT_VIDEO flag to */
- if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0)
- {
- #ifdef _WIN32
- MessageBox(NULL, SDL_GetError(), "Could not initialize SDL!", MB_ICONERROR);
- #else
- printf("Could not initialize SDL! (%s)\n", SDL_GetError());
- #endif
- return;
- }
-
#ifdef _WIN32
m_hWnd = (HWND)_PADInitialize.hWnd;
#endif
@@ -302,12 +268,8 @@ int Search_Devices()
// Warn the user if no PadMapping are detected
if (numjoy == 0)
{
- #ifdef _WIN32
- //MessageBox(NULL, "No Joystick detected!", NULL, MB_ICONWARNING);
- #else
- printf("No Joystick detected!\n");
- #endif
- return 0;
+ PanicAlert("No Joystick detected!\n");
+ return 0;
}
#ifdef _DEBUG
@@ -361,8 +323,6 @@ void Shutdown()
if (PadMapping[3].enabled && SDL_JoystickOpened(PadMapping[3].ID))
SDL_JoystickClose(joystate[3].joy);
- SDL_Quit();
-
#ifdef _DEBUG
DEBUG_QUIT();
#endif
diff --git a/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp b/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp
index 2d1746b608..b50dd2b8db 100644
--- a/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp
+++ b/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp
@@ -164,37 +164,22 @@ void SetDllGlobals(PLUGIN_GLOBALS* _pPluginGlobals) {
// Call config dialog
// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
void DllConfig(HWND _hParent)
-{
- #ifdef _WIN32
- if(SDL_Init(SDL_INIT_JOYSTICK ) < 0)
+{
+ // Start the pads so we can use them in the configuration and advanced controls
+ if(!emulator_running)
{
- MessageBox(NULL, SDL_GetError(), "Could not initialize SDL!", MB_ICONERROR);
- return;
+ SPADInitialize _PADInitialize;
+ _PADInitialize.hWnd = NULL;
+ _PADInitialize.pLog = NULL;
+ Initialize((void*)&_PADInitialize);
+ emulator_running = false; // Set it back to false
}
- LoadConfig(); // load settings
-
#if defined(HAVE_WX) && HAVE_WX
- wxWindow win;
- win.SetHWND(_hParent);
- ConfigBox frame(&win);
- frame.ShowModal();
- win.SetHWND(0);
+ m_frame = new ConfigBox(NULL);
+ m_frame->ShowModal();
#endif
- #else
- if(SDL_Init(SDL_INIT_JOYSTICK ) < 0)
- {
- printf("Could not initialize SDL! (%s)\n", SDL_GetError());
- return;
- }
- LoadConfig(); // load settings
-
-#if defined(HAVE_WX) && HAVE_WX
- ConfigBox frame(NULL);
- frame.ShowModal();
-#endif
- #endif
}
void DllDebugger(HWND _hParent, bool Show) {
@@ -210,16 +195,6 @@ void Initialize(void *init)
DEBUG_INIT();
#endif
- if(SDL_Init(SDL_INIT_JOYSTICK ) < 0)
- {
- #ifdef _WIN32
- MessageBox(NULL, SDL_GetError(), "Could not initialize SDL!", MB_ICONERROR);
- #else
- printf("Could not initialize SDL! (%s)\n", SDL_GetError());
- #endif
- return;
- }
-
#ifdef _WIN32
m_hWnd = (HWND)_PADInitialize.hWnd;
#endif
@@ -249,8 +224,6 @@ void Shutdown()
if(joysticks[3].enabled)
SDL_JoystickClose(joystate[3].joy);
- SDL_Quit();
-
#ifdef _DEBUG
DEBUG_QUIT();
#endif
@@ -700,13 +673,9 @@ int Search_Devices()
int numjoy = SDL_NumJoysticks();
if(numjoy == 0)
- {
- #ifdef _WIN32
- MessageBox(NULL, "No Joystick detected!", NULL, MB_ICONWARNING);
- #else
- printf("No Joystick detected!\n");
- #endif
- return 0;
+ {
+ PanicAlert("No Joystick detected!\n");
+ return 0;
}
if(joyinfo)