summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon
diff options
context:
space:
mode:
authorhrydgard <hrydgard@gmail.com>2010-06-03 18:05:08 +0000
committerhrydgard <hrydgard@gmail.com>2010-06-03 18:05:08 +0000
commita3c96ac42c4c2ce4a4cf2f5ca09a5ae9dd4bd303 (patch)
treeda7ca1f64fce704934d581c82a9533fe38b103f1 /Source/Core/InputCommon
parent3236aa9e73cf6d0bc798cce6f5224cff40eb6955 (diff)
Warp back to 5578. Sorry for the lost changes, please re-apply. Reason: 5579 is a complete disaster.
Not only does it change tons of files to switch to a new and non-working (it doesn't parse my ini files, at least) ini parser, it also reshuffles a lot of code and removes a plugin. The latter part is fine, but doing these two major switches in one revision, one of which is broken, is completely unacceptable. I said to merge tiny changes, not massive reworkings. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5589 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/InputCommon')
-rw-r--r--Source/Core/InputCommon/InputCommon.vcproj84
-rw-r--r--Source/Core/InputCommon/Src/Configuration.cpp7
-rw-r--r--Source/Core/InputCommon/Src/ControllerEmu.cpp350
-rw-r--r--Source/Core/InputCommon/Src/ControllerEmu.h392
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/DirectInput/DirectInputKeyboardMouse.cpp7
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/DirectInput/DirectInputKeyboardMouse.h4
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.cpp2
-rw-r--r--Source/Core/InputCommon/Src/DirectInputBase.cpp229
-rw-r--r--Source/Core/InputCommon/Src/DirectInputBase.h53
-rwxr-xr-xSource/Core/InputCommon/Src/Event.hpp264
-rw-r--r--Source/Core/InputCommon/Src/EventHandler.cpp318
-rw-r--r--Source/Core/InputCommon/Src/EventHandler.h64
-rw-r--r--Source/Core/InputCommon/Src/InputCommon.cpp16
-rw-r--r--Source/Core/InputCommon/Src/InputCommon.h6
-rw-r--r--Source/Core/InputCommon/Src/InputConfig.cpp57
-rw-r--r--Source/Core/InputCommon/Src/InputConfig.h33
-rw-r--r--Source/Core/InputCommon/Src/SConscript9
-rw-r--r--Source/Core/InputCommon/Src/WXInputBase.cpp127
-rw-r--r--Source/Core/InputCommon/Src/WXInputBase.h28
-rw-r--r--Source/Core/InputCommon/Src/X11InputBase.h2
20 files changed, 1170 insertions, 882 deletions
diff --git a/Source/Core/InputCommon/InputCommon.vcproj b/Source/Core/InputCommon/InputCommon.vcproj
index 692a50b37b..eaa33a78ca 100644
--- a/Source/Core/InputCommon/InputCommon.vcproj
+++ b/Source/Core/InputCommon/InputCommon.vcproj
@@ -45,7 +45,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\Externals\SDL\include;../../Core/Common/Src"
+ AdditionalIncludeDirectories="..\..\..\Externals\SDL\include;../../Core/Common/Src;../../PluginSpecs;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\wxWidgets\lib\vc_lib\msw;..\..\..\Externals\wxWidgets\include\msvc"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0"
MinimalRebuild="true"
BasicRuntimeChecks="3"
@@ -110,7 +110,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\Externals\SDL\include;../../Core/Common/Src"
+ AdditionalIncludeDirectories="..\..\..\Externals\SDL\include;../../Core/Common/Src;../../PluginSpecs;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\wxWidgets\lib\vc_lib\msw;..\..\..\Externals\wxWidgets\include\msvc"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_SECURE_SCL=0;_LIB;__WXMSW__;wxUSE_BASE=0;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
@@ -175,7 +175,7 @@
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="..\..\..\Externals\SDL\include;../../Core/Common/Src"
+ AdditionalIncludeDirectories="..\..\..\Externals\SDL\include;../../Core/Common/Src;../../PluginSpecs;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\wxWidgets\lib\vc_lib\msw;..\..\..\Externals\wxWidgets\include\msvc"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_SECURE_SCL=0;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE"
StringPooling="true"
RuntimeLibrary="0"
@@ -244,7 +244,7 @@
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
OmitFramePointers="false"
- AdditionalIncludeDirectories="..\..\..\Externals\SDL\include;../../Core/Common/Src"
+ AdditionalIncludeDirectories="..\..\..\Externals\SDL\include;../../Core/Common/Src;../../PluginSpecs;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\wxWidgets\lib\vc_lib\msw;..\..\..\Externals\wxWidgets\include\msvc"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_SECURE_SCL=0;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE"
RuntimeLibrary="0"
BufferSecurityCheck="false"
@@ -306,7 +306,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\..\..\Externals\SDL\include;../../Core/Common/Src"
+ AdditionalIncludeDirectories="..\..\..\Externals\SDL\include;../../Core/Common/Src;../../PluginSpecs;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\wxWidgets\lib\vc_lib\msw;..\..\..\Externals\wxWidgets\include\msvc"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0"
RuntimeLibrary="0"
BufferSecurityCheck="false"
@@ -368,7 +368,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\..\..\Externals\SDL\include;../../Core/Common/Src"
+ AdditionalIncludeDirectories="..\..\..\Externals\SDL\include;../../Core/Common/Src;../../PluginSpecs;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\wxWidgets\lib\vc_lib\msw;..\..\..\Externals\wxWidgets\include\msvc"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_SECURE_SCL=0;__WXMSW__;wxUSE_BASE=0;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE"
RuntimeLibrary="0"
BufferSecurityCheck="false"
@@ -476,52 +476,60 @@
</File>
</Filter>
</Filter>
- <Filter
- Name="old"
+ <File
+ RelativePath=".\Src\Configuration.cpp"
>
- <File
- RelativePath=".\Src\Configuration.cpp"
- >
- </File>
- <File
- RelativePath=".\Src\InputCommon.h"
- >
- </File>
- <File
- RelativePath=".\Src\SDL_Util.cpp"
- >
- </File>
- <File
- RelativePath=".\Src\SDL_Util.h"
- >
- </File>
- <File
- RelativePath=".\Src\XInput_Util.cpp"
- >
- </File>
- <File
- RelativePath=".\Src\XInput_Util.h"
- >
- </File>
- </Filter>
+ </File>
+ <File
+ RelativePath=".\Src\DirectInputBase.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\Src\DirectInputBase.h"
+ >
+ </File>
+ <File
+ RelativePath=".\Src\Event.hpp"
+ >
+ </File>
+ <File
+ RelativePath=".\Src\EventHandler.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\Src\EventHandler.h"
+ >
+ </File>
+ <File
+ RelativePath=".\Src\InputCommon.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\Src\InputCommon.h"
+ >
+ </File>
+ <File
+ RelativePath=".\Src\SDL_Util.cpp"
+ >
+ </File>
<File
- RelativePath=".\Src\ControllerEmu.cpp"
+ RelativePath=".\Src\SDL_Util.h"
>
</File>
<File
- RelativePath=".\Src\ControllerEmu.h"
+ RelativePath=".\Src\WXInputBase.cpp"
>
</File>
<File
- RelativePath=".\Src\InputConfig.cpp"
+ RelativePath=".\Src\WXInputBase.h"
>
</File>
<File
- RelativePath=".\Src\InputConfig.h"
+ RelativePath=".\Src\XInput_Util.cpp"
>
</File>
<File
- RelativePath=".\Src\SConscript"
+ RelativePath=".\Src\XInput_Util.h"
>
</File>
</Files>
diff --git a/Source/Core/InputCommon/Src/Configuration.cpp b/Source/Core/InputCommon/Src/Configuration.cpp
index 7f4972ea11..c48e48d05f 100644
--- a/Source/Core/InputCommon/Src/Configuration.cpp
+++ b/Source/Core/InputCommon/Src/Configuration.cpp
@@ -18,10 +18,13 @@
#include <iostream> // System
#include <vector>
-#define _USE_MATH_DEFINES
-#include <math.h>
+#include <cmath>
#include "Common.h" // Common
+#if defined HAVE_WX && HAVE_WX
+ #include <wx/wx.h>
+#endif
+
#ifdef _WIN32
#define NOMINMAX
#include <Windows.h>
diff --git a/Source/Core/InputCommon/Src/ControllerEmu.cpp b/Source/Core/InputCommon/Src/ControllerEmu.cpp
deleted file mode 100644
index e94a9b70d8..0000000000
--- a/Source/Core/InputCommon/Src/ControllerEmu.cpp
+++ /dev/null
@@ -1,350 +0,0 @@
-#include "ControllerEmu.h"
-
-#if defined(HAVE_X11) && HAVE_X11
-#include <X11/Xlib.h>
-#endif
-
-ControllerEmu::~ControllerEmu()
-{
- // control groups
- std::vector<ControlGroup*>::const_iterator
- i = groups.begin(),
- e = groups.end();
- for ( ; i!=e; ++i )
- delete *i;
-}
-
-ControllerEmu::ControlGroup::~ControlGroup()
-{
- // controls
- std::vector<Control*>::const_iterator
- ci = controls.begin(),
- ce = controls.end();
- for ( ; ci!=ce; ++ci )
- delete *ci;
-
- // settings
- std::vector<Setting*>::const_iterator
- si = settings.begin(),
- se = settings.end();
- for ( ; si!=se; ++si )
- delete *si;
-}
-
-ControllerEmu::Extension::~Extension()
-{
- // attachments
- std::vector<ControllerEmu*>::const_iterator
- ai = attachments.begin(),
- ae = attachments.end();
- for ( ; ai!=ae; ++ai )
- delete *ai;
-}
-ControllerEmu::ControlGroup::Control::~Control()
-{
- delete control_ref;
-}
-
-void ControllerEmu::UpdateReferences( ControllerInterface& devi )
-{
- std::vector<ControlGroup*>::const_iterator
- i = groups.begin(),
- e = groups.end();
- for ( ; i!=e; ++i )
- {
- std::vector<ControlGroup::Control*>::const_iterator
- ci = (*i)->controls.begin(),
- ce = (*i)->controls.end();
- for ( ; ci!=ce; ++ci )
- devi.UpdateReference( (*ci)->control_ref );
-
- // extension
- if ( GROUP_TYPE_EXTENSION == (*i)->type )
- {
- std::vector<ControllerEmu*>::const_iterator
- ai = ((Extension*)*i)->attachments.begin(),
- ae = ((Extension*)*i)->attachments.end();
- for ( ; ai!=ae; ++ai )
- (*ai)->UpdateReferences( devi );
- }
- }
-}
-
-void ControllerEmu::UpdateDefaultDevice()
-{
- std::vector<ControlGroup*>::const_iterator
- i = groups.begin(),
- e = groups.end();
- for ( ; i!=e; ++i )
- {
- std::vector<ControlGroup::Control*>::const_iterator
- ci = (*i)->controls.begin(),
- ce = (*i)->controls.end();
- for ( ; ci!=ce; ++ci )
- (*ci)->control_ref->device_qualifier = default_device;
-
- // extension
- if ( GROUP_TYPE_EXTENSION == (*i)->type )
- {
- std::vector<ControllerEmu*>::const_iterator
- ai = ((Extension*)*i)->attachments.begin(),
- ae = ((Extension*)*i)->attachments.end();
- for ( ; ai!=ae; ++ai )
- {
- (*ai)->default_device = default_device;
- (*ai)->UpdateDefaultDevice();
- }
- }
- }
-}
-
-void ControllerEmu::ControlGroup::LoadConfig( Section& sec, const std::string& defdev, const std::string& base )
-{
- std::string group( base + name ); group += "/";
-
- // settings
- std::vector<ControlGroup::Setting*>::const_iterator
- si = settings.begin(),
- se = settings.end();
- for ( ; si!=se; ++si )
- {
- sec.Get(group+(*si)->name, &(*si)->value, (*si)->default_value*100);
- (*si)->value /= 100;
- }
-
- // controls
- std::vector<ControlGroup::Control*>::const_iterator
- ci = controls.begin(),
- ce = controls.end();
- for ( ; ci!=ce; ++ci )
- {
- // control and dev qualifier
- (*ci)->control_ref->control_qualifier.name = sec[group + (*ci)->name];
- std::string tmpdevstr;
- sec.Get( group+(*ci)->name+"/Device", &tmpdevstr, defdev );
- (*ci)->control_ref->device_qualifier.FromString(tmpdevstr);
-
- // range
- sec.Get( group+(*ci)->name+"/Range", &(*ci)->control_ref->range, 100.0f );
- (*ci)->control_ref->range /= 100;
-
- // input mode
- if ( (*ci)->control_ref->is_input )
- sec.Get( group+(*ci)->name+"/Mode",
- &((ControllerInterface::InputReference*)((*ci)->control_ref))->mode, 0 );
- }
-
- // extensions
- if ( GROUP_TYPE_EXTENSION == type )
- {
- Extension* const ex = ((Extension*)this);
-
- ex->switch_extension = 0;
- unsigned int n = 0;
- const std::string extname = sec[ base + name ];
-
- std::vector<ControllerEmu*>::const_iterator
- ai = ((Extension*)this)->attachments.begin(),
- ae = ((Extension*)this)->attachments.end();
- for ( ; ai!=ae; ++ai,++n )
- {
- (*ai)->default_device.FromString( defdev );
- (*ai)->LoadConfig( sec, base + (*ai)->GetName() + "/" );
-
- if ( (*ai)->GetName() == extname )
- ex->switch_extension = n;
- }
- }
-}
-
-void ControllerEmu::LoadConfig( Section& sec, const std::string& base )
-{
- std::string defdev = default_device.ToString();
- if ( base.empty() )
- {
- defdev = sec[ base + "Device" ];
- default_device.FromString( defdev );
- }
-
- std::vector<ControlGroup*>::const_iterator i = groups.begin(),
- e = groups.end();
- for ( ; i!=e; ++i )
- (*i)->LoadConfig( sec, defdev, base );
-}
-
-void ControllerEmu::ControlGroup::SaveConfig( Section& sec, const std::string& defdev, const std::string& base )
-{
- std::string group( base + name ); group += "/";
-
- // settings
- std::vector<ControlGroup::Setting*>::const_iterator
- si = settings.begin(),
- se = settings.end();
- for ( ; si!=se; ++si )
- sec.Set( group+(*si)->name, (*si)->value*100, (*si)->default_value*100 );
-
- // controls
- std::vector<ControlGroup::Control*>::const_iterator
- ci = controls.begin(),
- ce = controls.end();
- for ( ; ci!=ce; ++ci )
- {
- // control and dev qualifier
- sec.Set( group+(*ci)->name, (*ci)->control_ref->control_qualifier.name );
- sec.Set( group+(*ci)->name+"/Device", (*ci)->control_ref->device_qualifier.ToString(), defdev );
-
- // range
- sec.Set( group+(*ci)->name+"/Range", (*ci)->control_ref->range*100, 100 );
-
- // input mode
- if ( (*ci)->control_ref->is_input )
- sec.Set( group+(*ci)->name+"/Mode",
- ((ControllerInterface::InputReference*)((*ci)->control_ref))->mode, (unsigned int)0 );
- }
-
- // extensions
- if ( GROUP_TYPE_EXTENSION == type )
- {
- Extension* const ext = ((Extension*)this);
- sec.Set( base + name, ext->attachments[ext->switch_extension]->GetName(), std::string("None") );
-
- std::vector<ControllerEmu*>::const_iterator
- ai = ((Extension*)this)->attachments.begin(),
- ae = ((Extension*)this)->attachments.end();
- for ( ; ai!=ae; ++ai )
- (*ai)->SaveConfig( sec, base + (*ai)->GetName() + "/" );
- }
-}
-
-void ControllerEmu::SaveConfig( Section& sec, const std::string& base )
-{
- const std::string defdev = default_device.ToString();
- if ( base.empty() )
- sec.Set( std::string(" ") + base + "Device", defdev );
-
- std::vector<ControlGroup*>::const_iterator i = groups.begin(),
- e = groups.end();
- for ( ; i!=e; ++i )
- (*i)->SaveConfig( sec, defdev, base );
-}
-
-ControllerEmu::AnalogStick::AnalogStick( const char* const _name ) : ControlGroup( _name, GROUP_TYPE_STICK )
-{
- for ( unsigned int i = 0; i < 4; ++i )
- controls.push_back( new Input( named_directions[i] ) );
-
- controls.push_back( new Input( "Modifier" ) );
-
- settings.push_back( new Setting("Dead Zone", 0, 1, 50 ) );
- settings.push_back( new Setting("Square Stick", 0 ) );
-
-}
-
-ControllerEmu::Buttons::Buttons( const char* const _name ) : ControlGroup( _name, GROUP_TYPE_BUTTONS )
-{
- settings.push_back( new Setting("Threshold", 0.5f ) );
-}
-
-ControllerEmu::MixedTriggers::MixedTriggers( const char* const _name ) : ControlGroup( _name, GROUP_TYPE_MIXED_TRIGGERS )
-{
- settings.push_back( new Setting("Threshold", 0.9f ) );
-}
-
-ControllerEmu::Triggers::Triggers( const char* const _name ) : ControlGroup( _name, GROUP_TYPE_TRIGGERS )
-{
- settings.push_back( new Setting("Dead Zone", 0, 1, 50 ) );
-}
-
-ControllerEmu::Force::Force( const char* const _name ) : ControlGroup( _name, GROUP_TYPE_FORCE )
-{
- controls.push_back( new Input( "Up" ) );
- controls.push_back( new Input( "Down" ) );
- controls.push_back( new Input( "Left" ) );
- controls.push_back( new Input( "Right" ) );
- controls.push_back( new Input( "Forward" ) );
- controls.push_back( new Input( "Backward" ) );
- controls.push_back( new Input( "Modifier" ) );
-
- settings.push_back( new Setting("Dead Zone", 0, 1, 50 ) );
-}
-
-ControllerEmu::Tilt::Tilt( const char* const _name ) : ControlGroup( _name, GROUP_TYPE_TILT )
-{
- //for ( unsigned int i = 0; i < 4; ++i )
- //controls.push_back( new Input( named_directions[i] ) );
- controls.push_back( new Input( "Forward" ) );
- controls.push_back( new Input( "Backward" ) );
- controls.push_back( new Input( "Left" ) );
- controls.push_back( new Input( "Right" ) );
-
- controls.push_back( new Input( "Modifier" ) );
-
- settings.push_back( new Setting("Dead Zone", 0, 1, 50 ) );
- settings.push_back( new Setting("Circle Stick", 0 ) );
-}
-
-ControllerEmu::Cursor::Cursor( const char* const _name, const SWiimoteInitialize* const _wiimote_initialize )
- : ControlGroup( _name, GROUP_TYPE_CURSOR )
- //, z(0)
- , wiimote_initialize(_wiimote_initialize)
-{
- for ( unsigned int i = 0; i < 4; ++i )
- controls.push_back( new Input( named_directions[i] ) );
- controls.push_back( new Input( "Forward" ) );
- controls.push_back( new Input( "Hide" ) );
-
- settings.push_back( new Setting("Center", 0.5f ) );
- settings.push_back( new Setting("Width", 0.5f ) );
- settings.push_back( new Setting("Height", 0.5f ) );
-
-}
-
-void GetMousePos(float& x, float& y, const SWiimoteInitialize* const wiimote_initialize)
-{
-#if ( defined(_WIN32) || (defined(HAVE_X11) && HAVE_X11))
- unsigned int win_width = 2, win_height = 2;
-#endif
-
-#ifdef _WIN32
- // Get the cursor position for the entire screen
- POINT point = { 1, 1 };
- GetCursorPos(&point);
- // Get the cursor position relative to the upper left corner of the rendering window
- ScreenToClient(wiimote_initialize->hWnd, &point);
-
- // Get the size of the rendering window. (In my case Rect.top and Rect.left was zero.)
- RECT Rect;
- GetClientRect(wiimote_initialize->hWnd, &Rect);
- // Width and height is the size of the rendering window
- win_width = Rect.right - Rect.left;
- win_height = Rect.bottom - Rect.top;
-
-#elif defined(HAVE_X11) && HAVE_X11
- int root_x, root_y;
- struct
- {
- int x, y;
- } point = { 1, 1 };
-
- Display* const wm_display = (Display*)wiimote_initialize->hWnd;
- Window glwin = *(Window *)wiimote_initialize->pXWindow;
-
- XWindowAttributes win_attribs;
- XGetWindowAttributes (wm_display, glwin, &win_attribs);
- win_width = win_attribs.width;
- win_height = win_attribs.height;
- Window root_dummy, child_win;
- unsigned int mask;
- XQueryPointer(wm_display, glwin, &root_dummy, &child_win, &root_x, &root_y, &point.x, &point.y, &mask);
-#endif
-
-#if ( defined(_WIN32) || (defined(HAVE_X11) && HAVE_X11))
- // Return the mouse position as a range from -1 to 1
- x = (float)point.x / (float)win_width * 2 - 1;
- y = (float)point.y / (float)win_height * 2 - 1;
-#else
- x = 0;
- y = 0;
-#endif
-
-}
diff --git a/Source/Core/InputCommon/Src/ControllerEmu.h b/Source/Core/InputCommon/Src/ControllerEmu.h
deleted file mode 100644
index 875cb0ffeb..0000000000
--- a/Source/Core/InputCommon/Src/ControllerEmu.h
+++ /dev/null
@@ -1,392 +0,0 @@
-#pragma once
-
-// windows crap
-#define NOMINMAX
-
-#include "../../../PluginSpecs/pluginspecs_wiimote.h"
-#include <math.h>
-
-#include "ControllerInterface/ControllerInterface.h"
-#include "IniFile.h"
-
-#include <vector>
-#include <string>
-#include <algorithm>
-
-#define sign(x) ((x)?(x)<0?-1:1:0)
-
-enum
-{
- GROUP_TYPE_OTHER,
- GROUP_TYPE_STICK,
- GROUP_TYPE_MIXED_TRIGGERS,
- GROUP_TYPE_BUTTONS,
- GROUP_TYPE_FORCE,
- GROUP_TYPE_EXTENSION,
- GROUP_TYPE_TILT,
- GROUP_TYPE_CURSOR,
- GROUP_TYPE_TRIGGERS,
-};
-
-const char * const named_directions[] =
-{
- "Up",
- "Down",
- "Left",
- "Right"
-};
-
-void GetMousePos(float& x, float& y, const SWiimoteInitialize* const wiimote_initialize);
-
-class ControllerEmu
-{
-public:
-
- class ControlGroup
- {
- public:
-
- class Control
- {
- protected:
- Control( ControllerInterface::ControlReference* const _ref, const char * const _name )
- : control_ref(_ref), name(_name){}
- public:
-
- virtual ~Control();
- ControllerInterface::ControlReference* const control_ref;
- const char * const name;
-
- };
-
- class Input : public Control
- {
- public:
-
- Input( const char * const _name )
- : Control( new ControllerInterface::InputReference, _name ) {}
-
- };
-
- class Output : public Control
- {
- public:
-
- Output( const char * const _name )
- : Control( new ControllerInterface::OutputReference, _name ) {}
-
- };
-
- class Setting
- {
- public:
-
- Setting(const char* const _name, const ControlState def_value
- , const unsigned int _low = 1, const unsigned int _high = 100 )
- : name(_name)
- , value(def_value)
- , default_value(def_value)
- , low(_low)
- , high(_high){}
-
- const char* const name;
- ControlState value;
- const ControlState default_value;
- const unsigned int low, high;
- };
-
- ControlGroup( const char* const _name, const unsigned int _type = GROUP_TYPE_OTHER ) : name(_name), type(_type) {}
- virtual ~ControlGroup();
-
- void LoadConfig( Section& sec, const std::string& defdev = "", const std::string& base = "" );
- void SaveConfig( Section& sec, const std::string& defdev = "", const std::string& base = "" );
-
- const char* const name;
- const unsigned int type;
-
- std::vector< Control* > controls;
- std::vector< Setting* > settings;
-
- };
-
- class AnalogStick : public ControlGroup
- {
- public:
-
- template <typename C>
- void GetState( C* const x, C* const y, const unsigned int base, const unsigned int range )
- {
- // this is all a mess
-
- ControlState yy = controls[0]->control_ref->State() - controls[1]->control_ref->State();
- ControlState xx = controls[3]->control_ref->State() - controls[2]->control_ref->State();
-
- ControlState deadzone = settings[0]->value;
- ControlState square = settings[1]->value;
- ControlState m = controls[4]->control_ref->State();
-
- // modifier code
- if ( m )
- {
- yy = (abs(yy)>deadzone) * sign(yy) * (m + deadzone/2);
- xx = (abs(xx)>deadzone) * sign(xx) * (m + deadzone/2);
- }
-
- // deadzone / square stick code
- if ( deadzone || square )
- {
- // this section might be all wrong, but its working good enough, i think
-
- ControlState ang = atan2( yy, xx );
- ControlState ang_sin = sin(ang);
- ControlState ang_cos = cos(ang);
-
- // the amt a full square stick would have at current angle
- ControlState square_full = std::min( ang_sin ? 1/abs(ang_sin) : 2, ang_cos ? 1/abs(ang_cos) : 2 );
-
- // the amt a full stick would have that was ( user setting squareness) at current angle
- // i think this is more like a pointed circle rather than a rounded square like it should be
- ControlState stick_full = ( 1 + ( square_full - 1 ) * square );
-
- ControlState dist = sqrt(xx*xx + yy*yy);
-
- // dead zone code
- dist = std::max( 0.0f, dist - deadzone * stick_full );
- dist /= ( 1 - deadzone );
-
- // square stick code
- ControlState amt = dist / stick_full;
- dist -= ((square_full - 1) * amt * square);
-
- yy = std::max( -1.0f, std::min( 1.0f, ang_sin * dist ) );
- xx = std::max( -1.0f, std::min( 1.0f, ang_cos * dist ) );
- }
-
- *y = C( yy * range + base );
- *x = C( xx * range + base );
- }
-
- AnalogStick( const char* const _name );
-
- };
-
- class Buttons : public ControlGroup
- {
- public:
- Buttons( const char* const _name );
-
- template <typename C>
- void GetState( C* const buttons, const C* bitmasks )
- {
- std::vector<Control*>::iterator i = controls.begin(),
- e = controls.end();
- for ( ; i!=e; ++i, ++bitmasks )
- if ( (*i)->control_ref->State() > settings[0]->value ) // threshold
- *buttons |= *bitmasks;
- }
-
- };
-
- class MixedTriggers : public ControlGroup
- {
- public:
-
- template <typename C, typename S>
- void GetState( C* const digital, const C* bitmasks, S* analog, const unsigned int range )
- {
- const unsigned int trig_count = ((unsigned int) (controls.size() / 2));
- for ( unsigned int i=0; i<trig_count; ++i,++bitmasks,++analog )
- {
- if ( controls[i]->control_ref->State() > settings[0]->value ) //threshold
- {
- *analog = range;
- *digital |= *bitmasks;
- }
- else
- *analog = S(controls[i+trig_count]->control_ref->State() * range);
-
- }
- }
-
- MixedTriggers( const char* const _name );
-
- };
-
- class Triggers : public ControlGroup
- {
- public:
-
- template <typename S>
- void GetState( S* analog, const unsigned int range )
- {
- const unsigned int trig_count = ((unsigned int) (controls.size()));
- const ControlState deadzone = settings[0]->value;
- for ( unsigned int i=0; i<trig_count; ++i,++analog )
- *analog = S( std::max(controls[i]->control_ref->State() - deadzone, 0.0f) / (1 - deadzone) * range );
- }
-
- Triggers( const char* const _name );
-
- };
-
- class Force : public ControlGroup
- {
- public:
- Force( const char* const _name );
-
- template <typename C, typename R>
- void GetState( C* axis, const u8 base, const R range )
- {
- const float deadzone = settings[0]->value;
- for ( unsigned int i=0; i<6; i+=2 )
- {
- const float state = controls[i+1]->control_ref->State() - controls[i]->control_ref->State();
- if (abs(state) > deadzone)
- *axis++ = (C)((state - (deadzone * sign(state))) / (1 - deadzone) * range + base);
- //*axis++ = state * range + base;
- else
- *axis++ = (C)(base);
- }
- }
- };
-
- class Tilt : public ControlGroup
- {
- public:
- Tilt( const char* const _name );
-
- template <typename C, typename R>
- void GetState( C* const x, C* const y, const unsigned int base, const R range )
- {
- // this is all a mess
-
- ControlState yy = controls[0]->control_ref->State() - controls[1]->control_ref->State();
- ControlState xx = controls[3]->control_ref->State() - controls[2]->control_ref->State();
-
- ControlState deadzone = settings[0]->value;
- ControlState circle = settings[1]->value;
- ControlState m = controls[4]->control_ref->State();
-
- // modifier code
- if ( m )
- {
- yy = (abs(yy)>deadzone) * sign(yy) * (m + deadzone/2);
- xx = (abs(xx)>deadzone) * sign(xx) * (m + deadzone/2);
- }
-
- // deadzone / circle stick code
- if ( deadzone || circle )
- {
- // this section might be all wrong, but its working good enough, i think
-
- ControlState ang = atan2( yy, xx );
- ControlState ang_sin = sin(ang);
- ControlState ang_cos = cos(ang);
-
- // the amt a full square stick would have at current angle
- ControlState square_full = std::min( ang_sin ? 1/abs(ang_sin) : 2, ang_cos ? 1/abs(ang_cos) : 2 );
-
- // the amt a full stick would have that was ( user setting circular ) at current angle
- // i think this is more like a pointed circle rather than a rounded square like it should be
- ControlState stick_full = (square_full * (1 - circle)) + (circle);
-
- ControlState dist = sqrt(xx*xx + yy*yy);
-
- // dead zone code
- dist = std::max( 0.0f, dist - deadzone * stick_full );
- dist /= (1 - deadzone);
-
- // circle stick code
- ControlState amt = dist / stick_full;
- dist += (square_full - 1) * amt * circle;
-
- yy = std::max( -1.0f, std::min( 1.0f, ang_sin * dist ) );
- xx = std::max( -1.0f, std::min( 1.0f, ang_cos * dist ) );
- }
-
- *y = C( yy * range + base );
- *x = C( xx * range + base );
- }
- };
-
- class Cursor : public ControlGroup
- {
- public:
- Cursor( const char* const _name, const SWiimoteInitialize* const _wiimote_initialize );
-
- template <typename C>
- void GetState( C* const x, C* const y, C* const forward, const bool adjusted = false )
- {
- const ControlState z = controls[4]->control_ref->State();
-
- // hide
- if (controls[5]->control_ref->State() > 0.5f)
- {
- *x = 10000; *y = 0; *forward = 0;
- }
- else
- {
- *forward = z;
- float xx, yy;
- GetMousePos(xx, yy, wiimote_initialize);
-
- // use mouse cursor, or user defined mapping if they have something mapped
- // this if seems horrible
- if ( controls[0]->control_ref->control_qualifier.name.size() || controls[1]->control_ref->control_qualifier.name.size() )
- yy = controls[0]->control_ref->State() - controls[1]->control_ref->State();
- else
- yy = -yy;
-
- if ( controls[2]->control_ref->control_qualifier.name.size() || controls[3]->control_ref->control_qualifier.name.size() )
- xx = controls[3]->control_ref->State() - controls[2]->control_ref->State();
-
- // adjust cursor according to settings
- if (adjusted)
- {
- xx *= ( settings[1]->value * 2 );
- yy *= ( settings[2]->value * 2 );
- yy += ( settings[0]->value - 0.5f );
- }
-
- *x = xx;
- *y = yy;
- }
- }
-
- private:
- const SWiimoteInitialize* const wiimote_initialize;
-
- };
-
- class Extension : public ControlGroup
- {
- public:
- Extension( const char* const _name )
- : ControlGroup( _name, GROUP_TYPE_EXTENSION )
- , switch_extension(0)
- , active_extension(0) {}
- ~Extension();
-
- void GetState( u8* const data, const bool focus = true );
-
- std::vector<ControllerEmu*> attachments;
-
- int switch_extension;
- int active_extension;
- };
-
- virtual ~ControllerEmu();
-
- virtual std::string GetName() const = 0;
-
- void LoadConfig( Section& sec, const std::string& base = "" );
- void SaveConfig( Section& sec, const std::string& base = "" );
- void UpdateDefaultDevice();
-
- void UpdateReferences( ControllerInterface& devi );
-
- std::vector< ControlGroup* > groups;
-
- ControllerInterface::DeviceQualifier default_device;
-
-};
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/DirectInput/DirectInputKeyboardMouse.cpp b/Source/Core/InputCommon/Src/ControllerInterface/DirectInput/DirectInputKeyboardMouse.cpp
index 98e199c24f..071a233887 100644
--- a/Source/Core/InputCommon/Src/ControllerInterface/DirectInput/DirectInputKeyboardMouse.cpp
+++ b/Source/Core/InputCommon/Src/ControllerInterface/DirectInput/DirectInputKeyboardMouse.cpp
@@ -2,7 +2,6 @@
#ifdef CIFACE_USE_DIRECTINPUT_KBM
-#include <Timer.h>
#include "DirectInputKeyboardMouse.h"
// TODO: maybe add a ClearInputState function to this device
@@ -96,7 +95,7 @@ KeyboardMouse::KeyboardMouse( const LPDIRECTINPUTDEVICE8 kb_device, const LPDIRE
: m_kb_device(kb_device)
, m_mo_device(mo_device)
{
- m_last_update = Common::Timer::GetLocalTimeSinceJan1970();
+ m_last_update = wxGetLocalTimeMillis();
ZeroMemory( &m_state_in, sizeof(m_state_in) );
ZeroMemory( m_state_out, sizeof(m_state_out) );
@@ -134,7 +133,7 @@ bool KeyboardMouse::UpdateInput()
DIMOUSESTATE2 tmp_mouse;
// if mouse position hasn't been updated in a short while, skip a dev state
- u64 cur_time = Common::Timer::GetLocalTimeSinceJan1970();
+ wxLongLong cur_time = wxGetLocalTimeMillis();
if ( cur_time - m_last_update > DROP_INPUT_TIME )
{
// set axes to zero
@@ -179,7 +178,7 @@ bool KeyboardMouse::UpdateOutput()
{
bool want_on = false;
if ( m_state_out[i] )
- want_on = m_state_out[i] > Common::Timer::GetLocalTimeSinceJan1970() % 255 ; // light should flash when output is 0.5
+ want_on = m_state_out[i] > wxGetLocalTimeMillis() % 255 ; // light should flash when output is 0.5
// lights are set to their original state when output is zero
if ( want_on ^ m_current_state_out[i] )
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/DirectInput/DirectInputKeyboardMouse.h b/Source/Core/InputCommon/Src/ControllerInterface/DirectInput/DirectInputKeyboardMouse.h
index e57e8d7e97..6af5fb10d0 100644
--- a/Source/Core/InputCommon/Src/ControllerInterface/DirectInput/DirectInputKeyboardMouse.h
+++ b/Source/Core/InputCommon/Src/ControllerInterface/DirectInput/DirectInputKeyboardMouse.h
@@ -9,6 +9,8 @@
#include <Windows.h>
#include <dinput.h>
+#include <wx/stopwatch.h>
+#include <wx/utils.h>
namespace ciface
{
@@ -111,7 +113,7 @@ private:
const LPDIRECTINPUTDEVICE8 m_kb_device;
const LPDIRECTINPUTDEVICE8 m_mo_device;
- u64 m_last_update;
+ wxLongLong m_last_update;
State m_state_in;
unsigned char m_state_out[3]; // NUM CAPS SCROLL
bool m_current_state_out[3]; // NUM CAPS SCROLL
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.cpp b/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.cpp
index 61a7b724f6..a2b6c638c9 100644
--- a/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.cpp
+++ b/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.cpp
@@ -4,8 +4,6 @@
#include "XInput.h"
-#pragma comment(lib, "xinput.lib")
-
namespace ciface
{
namespace XInput
diff --git a/Source/Core/InputCommon/Src/DirectInputBase.cpp b/Source/Core/InputCommon/Src/DirectInputBase.cpp
new file mode 100644
index 0000000000..b9a7fee33d
--- /dev/null
+++ b/Source/Core/InputCommon/Src/DirectInputBase.cpp
@@ -0,0 +1,229 @@
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+
+
+// Include
+// -------------------
+#include "DirectInputBase.h"
+
+
+
+DInput::DInput()
+ : g_pDI(NULL),
+ g_pKeyboard(NULL)
+{}
+
+
+DInput::~DInput()
+{
+ Free();
+}
+
+void DInput::DIKToString(unsigned int keycode, char *keyStr)
+{
+ switch(keycode) {
+ case DIK_RETURN:
+ sprintf(keyStr, "Enter");
+ break;
+ case DIK_LCONTROL:
+ sprintf(keyStr, "Left Ctrl");
+ break;
+ case DIK_RCONTROL:
+ strcpy(keyStr, "Right Ctrl");
+ break;
+ case DIK_LSHIFT:
+ sprintf(keyStr, "Left Shift");
+ break;
+ case DIK_RSHIFT:
+ sprintf(keyStr, "Right Shift");
+ break;
+ case DIK_LMENU:
+ sprintf(keyStr, "Left Alt");
+ break;
+ case DIK_RMENU:
+ strcpy(keyStr, "Right Alt");
+ break;
+ case DIK_UP:
+ sprintf(keyStr, "Up");
+ break;
+ case DIK_DOWN:
+ sprintf(keyStr, "Down");
+ break;
+ case DIK_LEFT:
+ sprintf(keyStr, "Left");
+ break;
+ case DIK_RIGHT:
+ sprintf(keyStr, "Right");
+ break;
+ case DIK_HOME:
+ strcpy(keyStr, "Home");
+ break;
+ case DIK_END:
+ strcpy(keyStr, "End");
+ break;
+ case DIK_INSERT:
+ strcpy(keyStr, "Ins");
+ break;
+ case DIK_DELETE:
+ strcpy(keyStr, "Del");
+ break;
+ case DIK_PGUP:
+ strcpy(keyStr, "PgUp");
+ break;
+ case DIK_PGDN:
+ strcpy(keyStr, "PgDn");
+ break;
+ case DIK_NUMLOCK:
+ strcpy(keyStr, "Num Lock");
+ break;
+ case DIK_NUMPAD0:
+ strcpy(keyStr, "Num 0");
+ break;
+ case DIK_NUMPAD1:
+ strcpy(keyStr, "Num 1");
+ break;
+ case DIK_NUMPAD2:
+ strcpy(keyStr, "Num 2");
+ break;
+ case DIK_NUMPAD3:
+ strcpy(keyStr, "Num 3");
+ break;
+ case DIK_NUMPAD4:
+ strcpy(keyStr, "Num 4");
+ break;
+ case DIK_NUMPAD5:
+ strcpy(keyStr, "Num 5");
+ break;
+ case DIK_NUMPAD6:
+ strcpy(keyStr, "Num 6");
+ break;
+ case DIK_NUMPAD7:
+ strcpy(keyStr, "Num 7");
+ break;
+ case DIK_NUMPAD8:
+ strcpy(keyStr, "Num 8");
+ break;
+ case DIK_NUMPAD9:
+ strcpy(keyStr, "Num 9");
+ break;
+ case DIK_DIVIDE:
+ strcpy(keyStr, "Num /");
+ break;
+ case DIK_NUMPADENTER:
+ strcpy(keyStr, "Num Enter");
+ break;
+ case DIK_DECIMAL:
+ strcpy(keyStr, "Num Decimal");
+ break;
+ case DIK_NUMPADCOMMA:
+ case DIK_ABNT_C2:
+ strcpy(keyStr, "Num Separator");
+ break;
+ case DIK_NUMPADEQUALS:
+ strcpy(keyStr, "Num =");
+ break;
+ default:
+ // TODO: Switch to unicode GetKeyNameText?
+ GetKeyNameTextA(keycode << 16, keyStr, 64);
+ break;
+ }
+}
+
+HRESULT DInput::Init(HWND hWnd)
+{
+ HRESULT hr;
+ DWORD dwCoopFlags;
+ dwCoopFlags = DISCL_FOREGROUND | DISCL_NOWINKEY;
+
+ // Create a DInput object
+ if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION,
+ IID_IDirectInput8, (VOID* *)&g_pDI, NULL)))
+ {
+ MessageBox(0, L"Direct Input Create Failed", 0, MB_ICONERROR);
+ return(hr);
+ }
+
+ if (FAILED(hr = g_pDI->CreateDevice(GUID_SysKeyboard, &g_pKeyboard, NULL)))
+ {
+ MessageBox(0, L"Couldn't access keyboard", 0, MB_ICONERROR);
+ Free();
+ return(hr);
+ }
+
+ g_pKeyboard->SetDataFormat(&c_dfDIKeyboard);
+ g_pKeyboard->SetCooperativeLevel(hWnd, dwCoopFlags);
+ g_pKeyboard->Acquire();
+
+ return(S_OK);
+}
+
+void DInput::Free()
+{
+ if (g_pKeyboard)
+ {
+ g_pKeyboard->Unacquire();
+ g_pKeyboard->Release();
+ g_pKeyboard = 0;
+ }
+
+ if (g_pDI)
+ {
+ g_pDI->Release();
+ g_pDI = 0;
+ }
+}
+
+// Desc: Read the input device's state when in immediate mode and display it.
+HRESULT DInput::Read()
+{
+ HRESULT hr;
+
+ if (NULL == g_pKeyboard)
+ {
+ return(S_OK);
+ }
+
+ // Get the input's device state, and put the state in dims
+ ZeroMemory(diks, sizeof(diks));
+ hr = g_pKeyboard->GetDeviceState(sizeof(diks), diks);
+
+ //for (int i=0; i<256; i++)
+ // if (diks[i]) MessageBox(0,"DSFJDKSF|",0,0);
+ if (FAILED(hr))
+ {
+ // DirectInput may be telling us that the input stream has been
+ // interrupted. We aren't tracking any state between polls, so
+ // we don't have any special reset that needs to be done.
+ // We just re-acquire and try again.
+
+ // If input is lost then acquire and keep trying
+ hr = g_pKeyboard->Acquire();
+
+ while (hr == DIERR_INPUTLOST)
+ {
+ hr = g_pKeyboard->Acquire();
+ }
+
+ // hr may be DIERR_OTHERAPPHASPRIO or other errors. This
+ // may occur when the app is minimized or in the process of
+ // switching, so just try again later
+ return(S_OK);
+ }
+
+ return(S_OK);
+}
diff --git a/Source/Core/InputCommon/Src/DirectInputBase.h b/Source/Core/InputCommon/Src/DirectInputBase.h
new file mode 100644
index 0000000000..22f7fb5d2e
--- /dev/null
+++ b/Source/Core/InputCommon/Src/DirectInputBase.h
@@ -0,0 +1,53 @@
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#ifndef _DIRECTINPUTBASE_H
+#define _DIRECTINPUTBASE_H
+
+
+#include <windows.h> // System
+#include <stdio.h>
+
+#define DIRECTINPUT_VERSION 0x0800 // DirectInput
+#include <dinput.h>
+
+
+
+class DInput
+{
+ public:
+
+ DInput();
+ ~DInput();
+
+ static void DInput::DIKToString(unsigned int keycode, char *keyStr);
+
+ HRESULT Init(HWND hWnd);
+ void Free();
+ HRESULT Read();
+
+
+ BYTE diks[256]; // DirectInput keyboard state buffer
+
+ private:
+
+ LPDIRECTINPUT8 g_pDI; // The DirectInput object
+ LPDIRECTINPUTDEVICE8 g_pKeyboard; // The keyboard device
+};
+
+#endif
+
diff --git a/Source/Core/InputCommon/Src/Event.hpp b/Source/Core/InputCommon/Src/Event.hpp
new file mode 100755
index 0000000000..7f84265c3d
--- /dev/null
+++ b/Source/Core/InputCommon/Src/Event.hpp
@@ -0,0 +1,264 @@
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2008 Laurent Gomila (laurent.gom@gmail.com)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+
+#ifndef SFML_EVENT_HPP
+#define SFML_EVENT_HPP
+
+
+namespace sf
+{
+ namespace Key
+ {
+ enum Code
+ {
+ A = 'a',
+ B = 'b',
+ C = 'c',
+ D = 'd',
+ E = 'e',
+ F = 'f',
+ G = 'g',
+ H = 'h',
+ I = 'i',
+ J = 'j',
+ K = 'k',
+ L = 'l',
+ M = 'm',
+ N = 'n',
+ O = 'o',
+ P = 'p',
+ Q = 'q',
+ R = 'r',
+ S = 's',
+ T = 't',
+ U = 'u',
+ V = 'v',
+ W = 'w',
+ X = 'x',
+ Y = 'y',
+ Z = 'z',
+ Num0 = '0',
+ Num1 = '1',
+ Num2 = '2',
+ Num3 = '3',
+ Num4 = '4',
+ Num5 = '5',
+ Num6 = '6',
+ Num7 = '7',
+ Num8 = '8',
+ Num9 = '9',
+ Escape = 256,
+ LControl,
+ LShift,
+ LAlt,
+ LSystem,
+ RControl,
+ RShift,
+ RAlt,
+ RSystem,
+ Menu,
+ LBracket,
+ RBracket,
+ SemiColon,
+ Comma,
+ Period,
+ Quote,
+ Slash,
+ BackSlash,
+ Tilde,
+ Equal,
+ Dash,
+ Space,
+ Return,
+ Back,
+ Tab,
+ PageUp,
+ PageDown,
+ End,
+ Home,
+ Insert,
+ Delete,
+ Add,
+ Subtract,
+ Multiply,
+ Divide,
+ Left,
+ Right,
+ Up,
+ Down,
+ Numpad0,
+ Numpad1,
+ Numpad2,
+ Numpad3,
+ Numpad4,
+ Numpad5,
+ Numpad6,
+ Numpad7,
+ Numpad8,
+ Numpad9,
+ F1,
+ F2,
+ F3,
+ F4,
+ F5,
+ F6,
+ F7,
+ F8,
+ F9,
+ F10,
+ F11,
+ F12,
+ F13,
+ F14,
+ F15,
+ Pause,
+
+ Count // For internal use
+ };
+ }
+
+
+ namespace Mouse
+ {
+ enum Button
+ {
+ Left,
+ Right,
+ Middle,
+ XButton1,
+ XButton2,
+
+ Count // For internal use
+ };
+ }
+
+
+ namespace Joy
+ {
+ enum Axis
+ {
+ AxisX,
+ AxisY,
+ AxisZ,
+ AxisR,
+ AxisU,
+ AxisV,
+ AxisPOV,
+
+ Count // For internal use
+ };
+ }
+
+
+ class Event
+ {
+ public :
+
+ struct KeyEvent
+ {
+ Key::Code Code;
+ bool Alt;
+ bool Control;
+ bool Shift;
+ };
+
+ struct TextEvent
+ {
+ // I'm not sure we need this...
+ unsigned short Unicode;
+ };
+
+ struct MouseMoveEvent
+ {
+ int X;
+ int Y;
+ };
+
+ struct MouseButtonEvent
+ {
+ Mouse::Button Button;
+ int X;
+ int Y;
+ };
+
+ struct MouseWheelEvent
+ {
+ int Delta;
+ };
+
+ struct JoyMoveEvent
+ {
+ unsigned int JoystickId;
+ Joy::Axis Axis;
+ float Position;
+ };
+
+ struct JoyButtonEvent
+ {
+ unsigned int JoystickId;
+ unsigned int Button;
+ };
+
+ struct SizeEvent
+ {
+ unsigned int Width;
+ unsigned int Height;
+ };
+
+ enum EventType
+ {
+ Closed,
+ Resized,
+ LostFocus,
+ GainedFocus,
+ TextEntered,
+ KeyPressed,
+ KeyReleased,
+ MouseWheelMoved,
+ MouseButtonPressed,
+ MouseButtonReleased,
+ MouseMoved,
+ MouseEntered,
+ MouseLeft,
+ JoyButtonPressed,
+ JoyButtonReleased,
+ JoyMoved
+ };
+
+ // Member data
+ EventType Type;
+
+ union
+ {
+ KeyEvent Key;
+ TextEvent Text;
+ MouseMoveEvent MouseMove;
+ MouseButtonEvent MouseButton;
+ MouseWheelEvent MouseWheel;
+ JoyMoveEvent JoyMove;
+ JoyButtonEvent JoyButton;
+ SizeEvent Size;
+ };
+ };
+
+} // namespace sf
+
+
+#endif // SFML_EVENT_HPP
diff --git a/Source/Core/InputCommon/Src/EventHandler.cpp b/Source/Core/InputCommon/Src/EventHandler.cpp
new file mode 100644
index 0000000000..19dc819baf
--- /dev/null
+++ b/Source/Core/InputCommon/Src/EventHandler.cpp
@@ -0,0 +1,318 @@
+#include "EventHandler.h"
+#include <stdio.h>
+#include <ctype.h>
+
+#if defined HAVE_WX && HAVE_WX
+#include <wx/wx.h>
+#endif
+
+EventHandler *EventHandler::m_Instance = 0;
+
+EventHandler::EventHandler() {
+ memset(keys, 0, sizeof(keys));
+ memset(mouse, 0, sizeof(mouse));
+ memset(joys, 0, sizeof(joys));
+}
+
+EventHandler::~EventHandler() {
+}
+
+EventHandler *EventHandler::GetInstance() {
+ // fprintf(stderr, "handler instance %p\n", m_Instance);
+ return m_Instance;
+}
+
+void EventHandler::Init()
+{
+ m_Instance = new EventHandler();
+}
+
+void EventHandler::Shutdown() {
+ if (m_Instance)
+ delete m_Instance;
+ // fprintf(stderr, "deleting instance %p\n", m_Instance);
+ m_Instance = 0;
+}
+
+bool EventHandler::RegisterEventListener(listenFuncPtr func, Keys key) {
+ if (key.inputType == KeyboardInput) {
+ // fprintf(stderr, "Registering %d:%d %p %p \n", key.keyCode, key.mods, func, this);
+ if (key.keyCode == sf::Key::Count || key.mods >= NUMMODS ||
+ key.keyCode >= NUMKEYS)
+ return false;
+ if (keys[key.keyCode][key.mods] && keys[key.keyCode][key.mods] != func)
+ return false
+;
+ keys[key.keyCode][key.mods] = func;
+ } else if (key.inputType == MouseInput) {
+ if (mouse[key.mouseButton])
+ return false;
+ mouse[key.mouseButton] = func;
+ }
+
+ return true;
+}
+
+bool EventHandler::RemoveEventListener(Keys key) {
+ if (key.inputType == KeyboardInput) {
+ if ((key.keyCode == sf::Key::Count || key.keyCode >= NUMKEYS
+ || key.mods >= NUMMODS) && ! keys[key.keyCode][key.mods])
+ return false;
+ keys[key.keyCode][key.mods] = NULL;
+ } else if (key.inputType == MouseInput) {
+ if (! mouse[key.mouseButton])
+ return false;
+ mouse[key.mouseButton] = NULL;
+ }
+
+ return true;
+}
+
+void EventHandler::Update() {
+ for (unsigned int i = 0; i < eventQueue.size();i++) {
+ sf::Event ev = eventQueue.front();
+ eventQueue.pop();
+ fprintf(stderr, "Updating event type %d code %d mod %d func %p %p\n", ev.Type, ev.Key.Code, ev.Key.Alt+2*ev.Key.Shift+4*ev.Key.Control, keys[ev.Key.Code][ev.Key.Alt+2*ev.Key.Shift+4*ev.Key.Control], this);
+ if(keys[ev.Key.Code][ev.Key.Alt+2*ev.Key.Shift+4*ev.Key.Control])
+ keys[ev.Key.Code][ev.Key.Alt+2*ev.Key.Shift+4*ev.Key.Control](ev);
+ }
+}
+
+bool EventHandler::addEvent(sf::Event *ev) {
+ eventQueue.push(*ev);
+ fprintf(stderr, "Got event type %d code %d %p\n", ev->Type, ev->Key.Code, this);
+ return true;
+}
+
+
+bool EventHandler::TestEvent (Keys k, sf::Event e)
+{
+ //Mouse event
+ if (k.inputType==MouseInput && k.eventType==e.Type && k.mouseButton==e.MouseButton.Button)
+ {
+ return (true);
+ }
+ //Keyboard event
+ if (k.inputType==KeyboardInput && k.eventType==e.Type && k.keyCode==e.Key.Code)
+ {
+ return (true);
+ }
+ return (false);
+}
+
+#if defined HAVE_WX && HAVE_WX
+// Taken from wxw source code
+sf::Key::Code EventHandler::wxCharCodeToSF(int id)
+{
+ sf::Key::Code sfKey;
+
+ switch (id) {
+// case WXK_CANCEL: sfKey = sf::Key::Cancel; break;
+// case WXK_BACK: sfKey = sf::Key::BackSpace; break;
+ case WXK_TAB: sfKey = sf::Key::Tab; break;
+// case WXK_CLEAR: sfKey = sf::Key::Clear; break;
+ case WXK_RETURN: sfKey = sf::Key::Return; break;
+ case WXK_SHIFT: sfKey = sf::Key::LShift; break;
+ case WXK_CONTROL: sfKey = sf::Key::LControl; break;
+ case WXK_ALT: sfKey = sf::Key::LAlt; break;
+// case WXK_CAPITAL: sfKey = sf::Key::Caps_Lock; break;
+ case WXK_MENU : sfKey = sf::Key::Menu; break;
+ case WXK_PAUSE: sfKey = sf::Key::Pause; break;
+ case WXK_ESCAPE: sfKey = sf::Key::Escape; break;
+ case WXK_SPACE: sfKey = sf::Key::Space; break;
+ case WXK_PAGEUP: sfKey = sf::Key::PageUp; break;
+ case WXK_PAGEDOWN: sfKey = sf::Key::PageDown; break;
+ case WXK_END: sfKey = sf::Key::End; break;
+ case WXK_HOME : sfKey = sf::Key::Home; break;
+ case WXK_LEFT : sfKey = sf::Key::Left; break;
+ case WXK_UP: sfKey = sf::Key::Up; break;
+ case WXK_RIGHT: sfKey = sf::Key::Right; break;
+ case WXK_DOWN : sfKey = sf::Key::Down; break;
+// case WXK_SELECT: sfKey = sf::Key::Select; break;
+// case WXK_PRINT: sfKey = sf::Key::Print; break;
+// case WXK_EXECUTE: sfKey = sf::Key::Execute; break;
+ case WXK_INSERT: sfKey = sf::Key::Insert; break;
+ case WXK_DELETE: sfKey = sf::Key::Delete; break;
+// case WXK_HELP : sfKey = sf::Key::Help; break;
+ case WXK_NUMPAD0: sfKey = sf::Key::Numpad0; break;
+ case WXK_NUMPAD_INSERT: sfKey = sf::Key::Insert; break;
+ case WXK_NUMPAD1: sfKey = sf::Key::Numpad1; break;
+ case WXK_NUMPAD_END: sfKey = sf::Key::End; break;
+ case WXK_NUMPAD2: sfKey = sf::Key::Numpad2; break;
+ case WXK_NUMPAD_DOWN: sfKey = sf::Key::Down; break;
+ case WXK_NUMPAD3: sfKey = sf::Key::Numpad3; break;
+ case WXK_NUMPAD_PAGEDOWN: sfKey = sf::Key::PageDown; break;
+ case WXK_NUMPAD4: sfKey = sf::Key::Numpad4; break;
+ case WXK_NUMPAD_LEFT: sfKey = sf::Key::Left; break;
+ case WXK_NUMPAD5: sfKey = sf::Key::Numpad5; break;
+ case WXK_NUMPAD6: sfKey = sf::Key::Numpad6; break;
+ case WXK_NUMPAD_RIGHT: sfKey = sf::Key::Right; break;
+ case WXK_NUMPAD7: sfKey = sf::Key::Numpad7; break;
+ case WXK_NUMPAD_HOME: sfKey = sf::Key::Home; break;
+ case WXK_NUMPAD8: sfKey = sf::Key::Numpad8; break;
+ case WXK_NUMPAD_UP: sfKey = sf::Key::Up; break;
+ case WXK_NUMPAD9: sfKey = sf::Key::Numpad9; break;
+ case WXK_NUMPAD_PAGEUP: sfKey = sf::Key::PageUp; break;
+// case WXK_NUMPAD_DECIMAL: sfKey = sf::Key::Decimal; break;
+ case WXK_NUMPAD_DELETE: sfKey = sf::Key::Delete; break;
+ case WXK_NUMPAD_MULTIPLY: sfKey = sf::Key::Multiply; break;
+ case WXK_NUMPAD_ADD: sfKey = sf::Key::Add; break;
+ case WXK_NUMPAD_SUBTRACT: sfKey = sf::Key::Subtract; break;
+ case WXK_NUMPAD_DIVIDE: sfKey = sf::Key::Divide; break;
+ case WXK_NUMPAD_ENTER: sfKey = sf::Key::Return; break;
+// case WXK_NUMPAD_SEPARATOR:sfKey = sf::Key::Separator; break;
+ case WXK_F1: sfKey = sf::Key::F1; break;
+ case WXK_F2: sfKey = sf::Key::F2; break;
+ case WXK_F3: sfKey = sf::Key::F3; break;
+ case WXK_F4: sfKey = sf::Key::F4; break;
+ case WXK_F5: sfKey = sf::Key::F5; break;
+ case WXK_F6: sfKey = sf::Key::F6; break;
+ case WXK_F7: sfKey = sf::Key::F7; break;
+ case WXK_F8: sfKey = sf::Key::F8; break;
+ case WXK_F9: sfKey = sf::Key::F9; break;
+ case WXK_F10: sfKey = sf::Key::F10; break;
+ case WXK_F11: sfKey = sf::Key::F11; break;
+ case WXK_F12: sfKey = sf::Key::F12; break;
+ case WXK_F13: sfKey = sf::Key::F13; break;
+ case WXK_F14: sfKey = sf::Key::F14; break;
+ case WXK_F15: sfKey = sf::Key::F15; break;
+// case WXK_NUMLOCK: sfKey = sf::Key::Num_Lock; break;
+// case WXK_SCROLL: sfKey = sf::Key::Scroll_Lock; break;
+ default:
+
+ // To lower (will tolower work on windows?)
+ if (id >= 'A' && id <= 'Z')
+ id = id - 'A' + 'a';
+
+ if ((id >= 'a' && id <= 'z') ||
+ (id >= '0' && id <= '9'))
+ sfKey = (sf::Key::Code)id;
+ else
+ sfKey = sf::Key::Count; // Invalid key
+
+ }
+
+ return sfKey;
+}
+#endif
+
+void EventHandler::SFKeyToString(sf::Key::Code keycode, char *keyStr) {
+ switch (keycode) {
+/* case sf::Key::A = 'a': sprintf(keyStr, "UP"); break;
+ case sf::Key::B = 'b': sprintf(keyStr, "UP"); break;
+ case sf::Key::C = 'c': sprintf(keyStr, "UP"); break;
+ case sf::Key::D = 'd': sprintf(keyStr, "UP"); break;
+ case sf::Key::E = 'e': sprintf(keyStr, "UP"); break;
+ case sf::Key::F = 'f': sprintf(keyStr, "UP"); break;
+ case sf::Key::G = 'g': sprintf(keyStr, "UP"); break;
+ case sf::Key::H = 'h': sprintf(keyStr, "UP"); break;
+ case sf::Key::I = 'i': sprintf(keyStr, "UP"); break;
+ case sf::Key::J = 'j': sprintf(keyStr, "UP"); break;
+ case sf::Key::K = 'k': sprintf(keyStr, "UP"); break;
+ case sf::Key::L = 'l': sprintf(keyStr, "UP"); break;
+ case sf::Key::M = 'm': sprintf(keyStr, "UP"); break;
+ case sf::Key::N = 'n': sprintf(keyStr, "UP"); break;
+ case sf::Key::O = 'o': sprintf(keyStr, "UP"); break;
+ case sf::Key::P = 'p': sprintf(keyStr, "UP"); break;
+ case sf::Key::Q = 'q': sprintf(keyStr, "UP"); break;
+ case sf::Key::R = 'r': sprintf(keyStr, "UP"); break;
+ case sf::Key::S = 's': sprintf(keyStr, "UP"); break;
+ case sf::Key::T = 't': sprintf(keyStr, "UP"); break;
+ case sf::Key::U = 'u': sprintf(keyStr, "UP"); break;
+ case sf::Key::V = 'v': sprintf(keyStr, "UP"); break;
+ case sf::Key::W = 'w': sprintf(keyStr, "UP"); break;
+ case sf::Key::X = 'x': sprintf(keyStr, "UP"); break;
+ case sf::Key::Y = 'y': sprintf(keyStr, "UP"); break;
+ case sf::Key::Z = 'z': sprintf(keyStr, "UP"); break;
+ case sf::Key::Num0 = '0': sprintf(keyStr, "UP"); break;
+ case sf::Key::Num1 = '1': sprintf(keyStr, "UP"); break;
+ case sf::Key::Num2 = '2': sprintf(keyStr, "UP"); break;
+ case sf::Key::Num3 = '3': sprintf(keyStr, "UP"); break;
+ case sf::Key::Num4 = '4': sprintf(keyStr, "UP"); break;
+ case sf::Key::Num5 = '5': sprintf(keyStr, "UP"); break;
+ case sf::Key::Num6 = '6': sprintf(keyStr, "UP"); break;
+ case sf::Key::Num7 = '7': sprintf(keyStr, "UP"); break;
+ case sf::Key::Num8 = '8': sprintf(keyStr, "UP"); break;
+ case sf::Key::Num9 = '9': sprintf(keyStr, "UP"); break;*/
+ case sf::Key::Escape: sprintf(keyStr, "Escape"); break;
+ case sf::Key::LControl: sprintf(keyStr, "LControl"); break;
+ case sf::Key::LShift: sprintf(keyStr, "LShift"); break;
+ case sf::Key::LAlt: sprintf(keyStr, "LAlt"); break;
+ case sf::Key::LSystem: sprintf(keyStr, "LSystem"); break;
+ case sf::Key::RControl: sprintf(keyStr, "RControl"); break;
+ case sf::Key::RShift: sprintf(keyStr, "RShift"); break;
+ case sf::Key::RAlt: sprintf(keyStr, "RAlt"); break;
+ case sf::Key::RSystem: sprintf(keyStr, "RSystem"); break;
+ case sf::Key::Menu: sprintf(keyStr, "Menu"); break;
+ case sf::Key::LBracket: sprintf(keyStr, "LBracket"); break;
+ case sf::Key::RBracket: sprintf(keyStr, "RBracket"); break;
+ case sf::Key::SemiColon: sprintf(keyStr, ";"); break;
+ case sf::Key::Comma: sprintf(keyStr, ","); break;
+ case sf::Key::Period: sprintf(keyStr, "."); break;
+ case sf::Key::Quote: sprintf(keyStr, "\'"); break;
+ case sf::Key::Slash: sprintf(keyStr, "/"); break;
+ case sf::Key::BackSlash: sprintf(keyStr, "\\"); break;
+ case sf::Key::Tilde: sprintf(keyStr, "~"); break;
+ case sf::Key::Equal: sprintf(keyStr, "="); break;
+ case sf::Key::Dash: sprintf(keyStr, "-"); break;
+ case sf::Key::Space: sprintf(keyStr, "Space"); break;
+ case sf::Key::Return: sprintf(keyStr, "Return"); break;
+ case sf::Key::Back: sprintf(keyStr, "Back"); break;
+ case sf::Key::Tab: sprintf(keyStr, "Tab"); break;
+ case sf::Key::PageUp: sprintf(keyStr, "Page Up"); break;
+ case sf::Key::PageDown: sprintf(keyStr, "Page Down"); break;
+ case sf::Key::End: sprintf(keyStr, "End"); break;
+ case sf::Key::Home: sprintf(keyStr, "Home"); break;
+ case sf::Key::Insert: sprintf(keyStr, "Insert"); break;
+ case sf::Key::Delete: sprintf(keyStr, "Delete"); break;
+ case sf::Key::Add: sprintf(keyStr, "+"); break;
+ case sf::Key::Subtract: sprintf(keyStr, "-"); break;
+ case sf::Key::Multiply: sprintf(keyStr, "*"); break;
+ case sf::Key::Divide: sprintf(keyStr, "/"); break;
+ case sf::Key::Left: sprintf(keyStr, "Left"); break;
+ case sf::Key::Right: sprintf(keyStr, "Right"); break;
+ case sf::Key::Up: sprintf(keyStr, "Up"); break;
+ case sf::Key::Down: sprintf(keyStr, "Down"); break;
+ case sf::Key::Numpad0: sprintf(keyStr, "NP 0"); break;
+ case sf::Key::Numpad1: sprintf(keyStr, "NP 1"); break;
+ case sf::Key::Numpad2: sprintf(keyStr, "NP 2"); break;
+ case sf::Key::Numpad3: sprintf(keyStr, "NP 3"); break;
+ case sf::Key::Numpad4: sprintf(keyStr, "NP 4"); break;
+ case sf::Key::Numpad5: sprintf(keyStr, "NP 5"); break;
+ case sf::Key::Numpad6: sprintf(keyStr, "NP 6"); break;
+ case sf::Key::Numpad7: sprintf(keyStr, "NP 7"); break;
+ case sf::Key::Numpad8: sprintf(keyStr, "NP 8"); break;
+ case sf::Key::Numpad9: sprintf(keyStr, "NP 9"); break;
+ case sf::Key::F1: sprintf(keyStr, "F1"); break;
+ case sf::Key::F2: sprintf(keyStr, "F2"); break;
+ case sf::Key::F3: sprintf(keyStr, "F3"); break;
+ case sf::Key::F4: sprintf(keyStr, "F4"); break;
+ case sf::Key::F5: sprintf(keyStr, "F5"); break;
+ case sf::Key::F6: sprintf(keyStr, "F6"); break;
+ case sf::Key::F7: sprintf(keyStr, "F7"); break;
+ case sf::Key::F8: sprintf(keyStr, "F8"); break;
+ case sf::Key::F9: sprintf(keyStr, "F9"); break;
+ case sf::Key::F10: sprintf(keyStr, "F10"); break;
+ case sf::Key::F11: sprintf(keyStr, "F11"); break;
+ case sf::Key::F12: sprintf(keyStr, "F12"); break;
+ case sf::Key::F13: sprintf(keyStr, "F13"); break;
+ case sf::Key::F14: sprintf(keyStr, "F14"); break;
+ case sf::Key::F15: sprintf(keyStr, "F15"); break;
+ case sf::Key::Pause: sprintf(keyStr, "Pause"); break;
+ default:
+ if (keycode > sf::Key::Escape)
+ sprintf(keyStr, "Invalid Key");
+ else
+ sprintf(keyStr, "%c", toupper(keycode));
+ break;
+ }
+}
+
+class EventHandlerCleaner
+{
+public:
+ ~EventHandlerCleaner()
+ {
+ //EventHandler::Destroy();
+ }
+} EventHandlerCleanerInst;
diff --git a/Source/Core/InputCommon/Src/EventHandler.h b/Source/Core/InputCommon/Src/EventHandler.h
new file mode 100644
index 0000000000..bde6bbf430
--- /dev/null
+++ b/Source/Core/InputCommon/Src/EventHandler.h
@@ -0,0 +1,64 @@
+#ifndef EVENTHANDER_H
+#define EVENTHANDER_H 1
+#include "Common.h"
+#include <queue>
+#include "Event.hpp"
+
+#define NUMKEYS 300
+#define NUMMODS 8
+
+typedef bool (*listenFuncPtr) (sf::Event);
+enum InputType
+{
+ KeyboardInput,
+ MouseInput,
+ JoystickInput
+};
+
+enum Modifiers {
+ UseAlt = 1,
+ UseShift = 2,
+ UseCtrl = 4
+};
+
+struct Keys {
+ InputType inputType;
+ sf::Event::EventType eventType;
+ sf::Key::Code keyCode;
+ int mods;
+ sf::Mouse::Button mouseButton;
+};
+
+class EventHandler {
+
+private:
+ listenFuncPtr keys[NUMKEYS][NUMMODS];
+ listenFuncPtr mouse[sf::Mouse::Count+1];
+ listenFuncPtr joys[sf::Joy::Count+1];
+ std::queue<sf::Event> eventQueue;
+ static EventHandler *m_Instance;
+
+protected:
+ EventHandler(const EventHandler&);
+ EventHandler& operator= (const EventHandler&);
+
+ EventHandler();
+ ~EventHandler();
+
+public:
+
+ bool RegisterEventListener(listenFuncPtr func, Keys key);
+ bool RemoveEventListener(Keys key);
+ void Update();
+ static EventHandler *GetInstance();
+ static void Init();
+ static void Shutdown();
+ bool addEvent(sf::Event *e);
+ static bool TestEvent (Keys k, sf::Event e);
+#if defined HAVE_WX && HAVE_WX
+ static sf::Key::Code wxCharCodeToSF(int id);
+#endif
+ static void SFKeyToString(sf::Key::Code keycode, char *keyStr);
+};
+
+#endif
diff --git a/Source/Core/InputCommon/Src/InputCommon.cpp b/Source/Core/InputCommon/Src/InputCommon.cpp
new file mode 100644
index 0000000000..beed506f8e
--- /dev/null
+++ b/Source/Core/InputCommon/Src/InputCommon.cpp
@@ -0,0 +1,16 @@
+#include "EventHandler.h"
+
+//EventHandler *eventHandler = NULL;
+
+namespace InputCommon
+{
+ void Init() {
+ // init the event handler
+ //EventHandler::GetInstance();
+ }
+
+ void Shutdown() {
+ //if (eventHandler)
+ // delete eventHandler;
+ }
+}
diff --git a/Source/Core/InputCommon/Src/InputCommon.h b/Source/Core/InputCommon/Src/InputCommon.h
index 52b75e0f0f..5b930fb217 100644
--- a/Source/Core/InputCommon/Src/InputCommon.h
+++ b/Source/Core/InputCommon/Src/InputCommon.h
@@ -1,3 +1,7 @@
+#include "EventHandler.h"
+
+//extern EventHandler *eventHandler;
+
namespace InputCommon
{
enum EButtonType
@@ -20,4 +24,6 @@ enum EXInputTrigger
XI_TRIGGER_R,
};
+ void Init();
+ void Shutdown();
}
diff --git a/Source/Core/InputCommon/Src/InputConfig.cpp b/Source/Core/InputCommon/Src/InputConfig.cpp
deleted file mode 100644
index f01a723360..0000000000
--- a/Source/Core/InputCommon/Src/InputConfig.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-
-#include "InputConfig.h"
-
-Plugin::Plugin( const char* const _ini_name, const char* const _gui_name, const char* const _profile_name )
- : ini_name(_ini_name)
- , gui_name(_gui_name)
- , profile_name(_profile_name)
-{
- // GCPads
- //for ( unsigned int i = 0; i<4; ++i )
- //controllers.push_back( new GCPad( i ) );
- // Wiimotes / disabled, cause it only the GUI half is done
- //for ( unsigned int i = 0; i<4; ++i )
- // controllers.push_back( new Wiimote( i ) );
-};
-
-Plugin::~Plugin()
-{
- // delete pads
- std::vector<ControllerEmu*>::const_iterator i = controllers.begin(),
- e = controllers.end();
- for ( ; i != e; ++i )
- delete *i;
-}
-
-void Plugin::LoadConfig()
-{
- IniFile inifile;
-
- std::ifstream file;
- file.open( (std::string(File::GetUserPath(D_CONFIG_IDX)) + ini_name + ".ini" ).c_str() );
- inifile.Load( file );
- file.close();
-
- std::vector< ControllerEmu* >::const_iterator i = controllers.begin(),
- e = controllers.end();
- for ( ; i!=e; ++i )
- (*i)->LoadConfig( inifile[ (*i)->GetName() ] );
-}
-
-void Plugin::SaveConfig()
-{
- IniFile inifile;
-
- std::vector< ControllerEmu* >::const_iterator i = controllers.begin(),
- e = controllers.end();
- for ( ; i!=e; ++i )
- (*i)->SaveConfig( inifile[ (*i)->GetName() ] );
-
- // dont need to save empty values
- //inifile.Clean();
-
- std::ofstream file;
- file.open( (std::string(File::GetUserPath(D_CONFIG_IDX)) + ini_name + ".ini" ).c_str() );
- inifile.Save( file );
- file.close();
-}
diff --git a/Source/Core/InputCommon/Src/InputConfig.h b/Source/Core/InputCommon/Src/InputConfig.h
deleted file mode 100644
index 51379a33fc..0000000000
--- a/Source/Core/InputCommon/Src/InputConfig.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#pragma once
-
-#include "ControllerInterface/ControllerInterface.h"
-#include "Thread.h"
-#include "FileUtil.h"
-#include "IniFile.h"
-
-#include "ControllerEmu.h"
-
-#include <string>
-#include <vector>
-#include <map>
-#include <sstream>
-
-class Plugin
-{
-public:
-
- Plugin( const char* const _ini_name, const char* const _gui_name, const char* const _profile_name );
- ~Plugin();
-
- void LoadConfig();
- void SaveConfig();
-
- std::vector< ControllerEmu* > controllers;
-
- Common::CriticalSection controls_crit, interface_crit; // lock controls first
- ControllerInterface controller_interface;
-
- const char * const ini_name;
- const char * const gui_name;
- const char * const profile_name;
-};
diff --git a/Source/Core/InputCommon/Src/SConscript b/Source/Core/InputCommon/Src/SConscript
index 59796940d7..d80a43f3c3 100644
--- a/Source/Core/InputCommon/Src/SConscript
+++ b/Source/Core/InputCommon/Src/SConscript
@@ -5,8 +5,8 @@ icenv = env.Clone()
files = [
'Configuration.cpp',
- 'InputConfig.cpp',
- 'ControllerEmu.cpp',
+ 'EventHandler.cpp',
+ 'InputCommon.cpp',
'SDL_Util.cpp',
'ControllerInterface/ControllerInterface.cpp',
]
@@ -16,6 +16,11 @@ if env['HAVE_X11']:
"X11InputBase.cpp",
]
+if env['HAVE_WX']:
+ files += [
+ "WXInputBase.cpp",
+ ]
+
if icenv['HAVE_SDL']:
files += [
'ControllerInterface/SDL/SDL.cpp'
diff --git a/Source/Core/InputCommon/Src/WXInputBase.cpp b/Source/Core/InputCommon/Src/WXInputBase.cpp
new file mode 100644
index 0000000000..f89f813e97
--- /dev/null
+++ b/Source/Core/InputCommon/Src/WXInputBase.cpp
@@ -0,0 +1,127 @@
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#include <wx/stattext.h>
+#include "WXInputBase.h"
+//#include <string.h>
+//#include <stdio.h>
+//#include <ctype.h>
+
+namespace InputCommon
+{
+
+const wxChar *WXKeyToString(int keycode)
+{
+ switch (keycode)
+ {
+ case WXK_CANCEL: return wxT("Cancel"); break;
+ case WXK_BACK: return wxT("Back"); break;
+ case WXK_TAB: return wxT("Tab"); break;
+ case WXK_CLEAR: return wxT("Clear"); break;
+ case WXK_RETURN: return wxT("Return"); break;
+ case WXK_SHIFT: return wxT("Shift"); break;
+ case WXK_CONTROL: return wxT("Control"); break;
+ case WXK_ALT: return wxT("Alt"); break;
+ case WXK_CAPITAL: return wxT("CapsLock"); break;
+ case WXK_MENU : return wxT("Menu"); break;
+ case WXK_PAUSE: return wxT("Pause"); break;
+ case WXK_ESCAPE: return wxT("Escape"); break;
+ case WXK_SPACE: return wxT("Space"); break;
+ case WXK_PAGEUP: return wxT("PgUp"); break;
+ case WXK_PAGEDOWN: return wxT("PgDn"); break;
+ case WXK_END: return wxT("End"); break;
+ case WXK_HOME : return wxT("Home"); break;
+ case WXK_LEFT : return wxT("Left"); break;
+ case WXK_UP: return wxT("Up"); break;
+ case WXK_RIGHT: return wxT("Right"); break;
+ case WXK_DOWN : return wxT("Down"); break;
+ case WXK_SELECT: return wxT("Select"); break;
+ case WXK_PRINT: return wxT("Print"); break;
+ case WXK_EXECUTE: return wxT("Execute"); break;
+ case WXK_INSERT: return wxT("Insert"); break;
+ case WXK_DELETE: return wxT("Delete"); break;
+ case WXK_HELP : return wxT("Help"); break;
+ case WXK_NUMPAD0: return wxT("NP 0"); break;
+ case WXK_NUMPAD1: return wxT("NP 1"); break;
+ case WXK_NUMPAD2: return wxT("NP 2"); break;
+ case WXK_NUMPAD3: return wxT("NP 3"); break;
+ case WXK_NUMPAD4: return wxT("NP 4"); break;
+ case WXK_NUMPAD5: return wxT("NP 5"); break;
+ case WXK_NUMPAD6: return wxT("NP 6"); break;
+ case WXK_NUMPAD7: return wxT("NP 7"); break;
+ case WXK_NUMPAD8: return wxT("NP 8"); break;
+ case WXK_NUMPAD9: return wxT("NP 9"); break;
+ case WXK_NUMPAD_DECIMAL: return wxT("NP ."); break;
+ case WXK_NUMPAD_DELETE: return wxT("NP Delete"); break;
+ case WXK_NUMPAD_INSERT: return wxT("NP Insert"); break;
+ case WXK_NUMPAD_END: return wxT("NP End"); break;
+ case WXK_NUMPAD_DOWN: return wxT("NP Down"); break;
+ case WXK_NUMPAD_PAGEDOWN: return wxT("NP Pagedown"); break;
+ case WXK_NUMPAD_LEFT: return wxT("NP Left"); break;
+ case WXK_NUMPAD_RIGHT: return wxT("NP Right"); break;
+ case WXK_NUMPAD_HOME: return wxT("NP Home"); break;
+ case WXK_NUMPAD_UP: return wxT("NP Up"); break;
+ case WXK_NUMPAD_PAGEUP: return wxT("NP Pageup"); break;
+ case WXK_NUMPAD_MULTIPLY: return wxT("NP *"); break;
+ case WXK_NUMPAD_ADD: return wxT("NP +"); break;
+ case WXK_NUMPAD_SUBTRACT: return wxT("NP -"); break;
+ case WXK_NUMPAD_DIVIDE: return wxT("NP /"); break;
+ case WXK_NUMPAD_ENTER: return wxT("NP Enter"); break;
+ case WXK_NUMPAD_SEPARATOR: return wxT("NP Separator"); break;
+ case WXK_F1: return wxT("F1"); break;
+ case WXK_F2: return wxT("F2"); break;
+ case WXK_F3: return wxT("F3"); break;
+ case WXK_F4: return wxT("F4"); break;
+ case WXK_F5: return wxT("F5"); break;
+ case WXK_F6: return wxT("F6"); break;
+ case WXK_F7: return wxT("F7"); break;
+ case WXK_F8: return wxT("F8"); break;
+ case WXK_F9: return wxT("F9"); break;
+ case WXK_F10: return wxT("F10"); break;
+ case WXK_F11: return wxT("F11"); break;
+ case WXK_F12: return wxT("F12"); break;
+ case WXK_F13: return wxT("F13"); break;
+ case WXK_F14: return wxT("F14"); break;
+ case WXK_F15: return wxT("F15"); break;
+ case WXK_F16: return wxT("F16"); break;
+ case WXK_F17: return wxT("F17"); break;
+ case WXK_F18: return wxT("F19"); break;
+ case WXK_F19: return wxT("F20"); break;
+ case WXK_F20: return wxT("F21"); break;
+ case WXK_F21: return wxT("F22"); break;
+ case WXK_F22: return wxT("F23"); break;
+ case WXK_F23: return wxT("F24"); break;
+ case WXK_F24: return wxT("F25"); break;
+ case WXK_NUMLOCK: return wxT("Numlock"); break;
+ case WXK_SCROLL: return wxT("Scrolllock"); break;
+ default: return wxString::FromAscii(keycode);
+ }
+}
+
+const wxChar *WXKeymodToString(int modifier)
+{
+ switch (modifier)
+ {
+ case wxMOD_ALT: return wxT("Alt"); break;
+ case wxMOD_CMD: return wxT("Ctrl"); break;
+ case wxMOD_ALTGR: return wxT("Ctrl+Alt"); break;
+ case wxMOD_SHIFT: return wxT("Shift"); break;
+ default: return wxT(""); break;
+ }
+}
+
+}
diff --git a/Source/Core/InputCommon/Src/WXInputBase.h b/Source/Core/InputCommon/Src/WXInputBase.h
new file mode 100644
index 0000000000..8c1e74aafc
--- /dev/null
+++ b/Source/Core/InputCommon/Src/WXInputBase.h
@@ -0,0 +1,28 @@
+// Copyright (C) 2003 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#ifndef WXINPUTBASE_H
+#define WXINPUTBASE_H
+
+#include <wx/wx.h>
+
+namespace InputCommon
+{
+const wxChar *WXKeyToString(int keycode);
+const wxChar *WXKeymodToString(int modifier);
+}
+#endif
diff --git a/Source/Core/InputCommon/Src/X11InputBase.h b/Source/Core/InputCommon/Src/X11InputBase.h
index eaf8475e50..13c6717f86 100644
--- a/Source/Core/InputCommon/Src/X11InputBase.h
+++ b/Source/Core/InputCommon/Src/X11InputBase.h
@@ -20,7 +20,7 @@
#include <X11/X.h>
#include <X11/keysym.h>
-#include "InputConfig.h"
+#include "Config.h"
#if defined(HAVE_WX) && HAVE_WX
#include <wx/wx.h>
#endif