diff --git a/Source/Core/InputCommon/InputCommon.vcproj b/Source/Core/InputCommon/InputCommon.vcproj index aa67c3656a..b86cd2561d 100644 --- a/Source/Core/InputCommon/InputCommon.vcproj +++ b/Source/Core/InputCommon/InputCommon.vcproj @@ -441,23 +441,19 @@ > - - diff --git a/Source/Core/InputCommon/Src/InputCommon.h b/Source/Core/InputCommon/Src/InputCommon.h index d29ed674c6..5b930fb217 100644 --- a/Source/Core/InputCommon/Src/InputCommon.h +++ b/Source/Core/InputCommon/Src/InputCommon.h @@ -4,6 +4,26 @@ namespace InputCommon { +enum EButtonType +{ + CTL_AXIS = 0, + CTL_HAT, + CTL_BUTTON, + CTL_KEY, +}; + +enum ETriggerType +{ + CTL_TRIGGER_SDL = 0, + CTL_TRIGGER_XINPUT, +}; + +enum EXInputTrigger +{ + XI_TRIGGER_L = 0, + XI_TRIGGER_R, +}; + void Init(); void Shutdown(); } diff --git a/Source/Core/InputCommon/Src/SConscript b/Source/Core/InputCommon/Src/SConscript index 13ee418d0d..1df5cf64a3 100644 --- a/Source/Core/InputCommon/Src/SConscript +++ b/Source/Core/InputCommon/Src/SConscript @@ -6,7 +6,7 @@ files = [ 'Configuration.cpp', 'EventHandler.cpp', 'InputCommon.cpp', - 'SDL.cpp', + 'SDL_Util.cpp', ] if env['HAVE_X11']: diff --git a/Source/Core/InputCommon/Src/SDL.cpp b/Source/Core/InputCommon/Src/SDL_Util.cpp similarity index 94% rename from Source/Core/InputCommon/Src/SDL.cpp rename to Source/Core/InputCommon/Src/SDL_Util.cpp index 572d68d407..3ca4a834e6 100644 --- a/Source/Core/InputCommon/Src/SDL.cpp +++ b/Source/Core/InputCommon/Src/SDL_Util.cpp @@ -1,219 +1,222 @@ - -// Project description -// ------------------- -// Name: SDL Input -// Description: Common SDL Input Functions -// -// Author: Falcon4ever (nJoy@falcon4ever.com, www.multigesture.net), JPeterson etc -// Copyright (C) 2003 Dolphin Project. -// - -// -// Licensetype: GNU General Public License (GPL) -// -// 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/ -// - - -#define _SDL_MAIN_ // Avoid certain declarations in SDL.h -#include "SDL.h" // Local -#include "XInput.h" - -namespace InputCommon -{ - - -// Search attached devices. Populate joyinfo for all attached physical devices. -// ----------------------- -bool SearchDevices(std::vector &_joyinfo, int &_NumPads, int &_NumGoodPads) -{ - if (!SDL_WasInit(0)) -#if SDL_VERSION_ATLEAST(1, 3, 0) - if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC) < 0) -#else - if (SDL_Init(SDL_INIT_JOYSTICK) < 0) -#endif - { - PanicAlert("Could not initialize SDL: %s", SDL_GetError()); - return false; - } - - // Get device status - int numjoy = SDL_NumJoysticks(); - for (int i = 0; i < numjoy; i++ ) - { - CONTROLLER_INFO Tmp; - - Tmp.joy = SDL_JoystickOpen(i); - Tmp.ID = i; - Tmp.NumAxes = SDL_JoystickNumAxes(Tmp.joy); - Tmp.NumButtons = SDL_JoystickNumButtons(Tmp.joy); - Tmp.NumBalls = SDL_JoystickNumBalls(Tmp.joy); - Tmp.NumHats = SDL_JoystickNumHats(Tmp.joy); - Tmp.Name = SDL_JoystickName(i); - - // Check if the device is okay - if ( Tmp.NumAxes == 0 - && Tmp.NumBalls == 0 - && Tmp.NumButtons == 0 - && Tmp.NumHats == 0 - ) - { - Tmp.Good = false; - } - else - { - _NumGoodPads++; - Tmp.Good = true; - } - - _joyinfo.push_back(Tmp); - - // We have now read the values we need so we close the device -// if (SDL_JoystickOpened(i)) SDL_JoystickClose(_joyinfo[i].joy); - } - - _NumPads = (int)_joyinfo.size(); - - return true; -} - - -// Avoid extreme axis values -// --------------------- -/* Function: We have to avoid very big values to becuse some triggers are -0x8000 in the - unpressed state (and then go from -0x8000 to 0x8000 as they are fully pressed) */ -bool AvoidValues(int value, bool NoTriggerFilter) -{ - // Avoid detecting very small or very big (for triggers) values - if( (value > -0x2000 && value < 0x2000) // Small values - || ((value < -0x6000 || value > 0x6000) && !NoTriggerFilter)) // Big values - return true; // Avoid - else - return false; // Keep -} - - -// Detect a pressed button -// --------------------- -void GetButton(SDL_Joystick *joy, int ControllerID, int buttons, int axes, int hats, - int &KeyboardKey, int &value, int &type, int &pressed, bool &Succeed, bool &Stop, - bool LeftRight, bool Axis, bool XInput, bool Button, bool Hat, bool NoTriggerFilter) -{ - // It needs the wxWidgets excape keycode - static const int WXK_ESCAPE = 27; - - // Update the internal status - SDL_JoystickUpdate(); - - // For the triggers we accept both a digital or an analog button - if(Axis) - { - for(int i = 0; i < axes; i++) - { - value = SDL_JoystickGetAxis(joy, i); - - if(AvoidValues(value, NoTriggerFilter)) continue; // Avoid values - - pressed = i + (LeftRight ? 1000 : 0); // Identify the analog triggers - type = InputCommon::CTL_AXIS; - Succeed = true; - } - } - - // Check for a hat - if(Hat) - { - for(int i = 0; i < hats; i++) - { - value = SDL_JoystickGetHat(joy, i); - if(value) - { - pressed = i; - type = InputCommon::CTL_HAT; - Succeed = true; - } - } - } - - // Check for a button - if(Button) - { - for(int i = 0; i < buttons; i++) - { - // Some kind of bug in SDL 1.3 would give button 9 and 10 (nonexistent) the value 48 on the 360 pad - if (SDL_JoystickGetButton(joy, i) > 1) continue; - - if(SDL_JoystickGetButton(joy, i)) - { - pressed = i; - type = InputCommon::CTL_BUTTON; - Succeed = true; - } - } - } - - // Check for a XInput trigger - #ifdef _WIN32 - if(XInput && LeftRight) - { - for(int i = 0; i <= InputCommon::XI_TRIGGER_R; i++) - { - if(XInput::GetXI(ControllerID, i)) - { - pressed = i + 1000; - type = InputCommon::CTL_AXIS; - Succeed = true; - } - } - } - #endif - - // Check for keyboard action - if (KeyboardKey) - { - if(Button) - { - // Todo: Add a separate keyboard vector to remove this restriction - if(KeyboardKey >= buttons) - { - pressed = KeyboardKey; - type = InputCommon::CTL_BUTTON; - Succeed = true; - KeyboardKey = 0; - if(pressed == WXK_ESCAPE) pressed = -1; // Check for the escape key - } - // Else show the error message - else - { - pressed = KeyboardKey; - KeyboardKey = -1; - Stop = true; - } - } - // Only accept the escape key - else if (KeyboardKey == WXK_ESCAPE) - { - Succeed = true; - KeyboardKey = 0; - pressed = -1; - } - } -} - - -} // InputCommon - + +// Project description +// ------------------- +// Name: SDL Input +// Description: Common SDL Input Functions +// +// Author: Falcon4ever (nJoy@falcon4ever.com, www.multigesture.net), JPeterson etc +// Copyright (C) 2003 Dolphin Project. +// + +// +// Licensetype: GNU General Public License (GPL) +// +// 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/ +// + + +#define _SDL_MAIN_ // Avoid certain declarations in SDL.h +#include "InputCommon.h" +#include "SDL_Util.h" // Local +#ifdef _WIN32 +#include "XInput_Util.h" +#endif + +namespace InputCommon +{ + + +// Search attached devices. Populate joyinfo for all attached physical devices. +// ----------------------- +bool SearchDevices(std::vector &_joyinfo, int &_NumPads, int &_NumGoodPads) +{ + if (!SDL_WasInit(0)) +#if SDL_VERSION_ATLEAST(1, 3, 0) + if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC) < 0) +#else + if (SDL_Init(SDL_INIT_JOYSTICK) < 0) +#endif + { + PanicAlert("Could not initialize SDL: %s", SDL_GetError()); + return false; + } + + // Get device status + int numjoy = SDL_NumJoysticks(); + for (int i = 0; i < numjoy; i++ ) + { + CONTROLLER_INFO Tmp; + + Tmp.joy = SDL_JoystickOpen(i); + Tmp.ID = i; + Tmp.NumAxes = SDL_JoystickNumAxes(Tmp.joy); + Tmp.NumButtons = SDL_JoystickNumButtons(Tmp.joy); + Tmp.NumBalls = SDL_JoystickNumBalls(Tmp.joy); + Tmp.NumHats = SDL_JoystickNumHats(Tmp.joy); + Tmp.Name = SDL_JoystickName(i); + + // Check if the device is okay + if ( Tmp.NumAxes == 0 + && Tmp.NumBalls == 0 + && Tmp.NumButtons == 0 + && Tmp.NumHats == 0 + ) + { + Tmp.Good = false; + } + else + { + _NumGoodPads++; + Tmp.Good = true; + } + + _joyinfo.push_back(Tmp); + + // We have now read the values we need so we close the device +// if (SDL_JoystickOpened(i)) SDL_JoystickClose(_joyinfo[i].joy); + } + + _NumPads = (int)_joyinfo.size(); + + return true; +} + + +// Avoid extreme axis values +// --------------------- +/* Function: We have to avoid very big values to becuse some triggers are -0x8000 in the + unpressed state (and then go from -0x8000 to 0x8000 as they are fully pressed) */ +bool AvoidValues(int value, bool NoTriggerFilter) +{ + // Avoid detecting very small or very big (for triggers) values + if( (value > -0x2000 && value < 0x2000) // Small values + || ((value < -0x6000 || value > 0x6000) && !NoTriggerFilter)) // Big values + return true; // Avoid + else + return false; // Keep +} + + +// Detect a pressed button +// --------------------- +void GetButton(SDL_Joystick *joy, int ControllerID, int buttons, int axes, int hats, + int &KeyboardKey, int &value, int &type, int &pressed, bool &Succeed, bool &Stop, + bool LeftRight, bool Axis, bool XInput, bool Button, bool Hat, bool NoTriggerFilter) +{ + // It needs the wxWidgets excape keycode + static const int WXK_ESCAPE = 27; + + // Update the internal status + SDL_JoystickUpdate(); + + // For the triggers we accept both a digital or an analog button + if(Axis) + { + for(int i = 0; i < axes; i++) + { + value = SDL_JoystickGetAxis(joy, i); + + if(AvoidValues(value, NoTriggerFilter)) continue; // Avoid values + + pressed = i + (LeftRight ? 1000 : 0); // Identify the analog triggers + type = InputCommon::CTL_AXIS; + Succeed = true; + } + } + + // Check for a hat + if(Hat) + { + for(int i = 0; i < hats; i++) + { + value = SDL_JoystickGetHat(joy, i); + if(value) + { + pressed = i; + type = InputCommon::CTL_HAT; + Succeed = true; + } + } + } + + // Check for a button + if(Button) + { + for(int i = 0; i < buttons; i++) + { + // Some kind of bug in SDL 1.3 would give button 9 and 10 (nonexistent) the value 48 on the 360 pad + if (SDL_JoystickGetButton(joy, i) > 1) continue; + + if(SDL_JoystickGetButton(joy, i)) + { + pressed = i; + type = InputCommon::CTL_BUTTON; + Succeed = true; + } + } + } + + // Check for a XInput trigger + #ifdef _WIN32 + if(XInput && LeftRight) + { + for(int i = 0; i <= InputCommon::XI_TRIGGER_R; i++) + { + if(XInput::GetXI(ControllerID, i)) + { + pressed = i + 1000; + type = InputCommon::CTL_AXIS; + Succeed = true; + } + } + } + #endif + + // Check for keyboard action + if (KeyboardKey) + { + if(Button) + { + // Todo: Add a separate keyboard vector to remove this restriction + if(KeyboardKey >= buttons) + { + pressed = KeyboardKey; + type = InputCommon::CTL_BUTTON; + Succeed = true; + KeyboardKey = 0; + if(pressed == WXK_ESCAPE) pressed = -1; // Check for the escape key + } + // Else show the error message + else + { + pressed = KeyboardKey; + KeyboardKey = -1; + Stop = true; + } + } + // Only accept the escape key + else if (KeyboardKey == WXK_ESCAPE) + { + Succeed = true; + KeyboardKey = 0; + pressed = -1; + } + } +} + + +} // InputCommon + diff --git a/Source/Core/InputCommon/Src/SDL.h b/Source/Core/InputCommon/Src/SDL_Util.h similarity index 91% rename from Source/Core/InputCommon/Src/SDL.h rename to Source/Core/InputCommon/Src/SDL_Util.h index 8495deae6d..1dcebb8186 100644 --- a/Source/Core/InputCommon/Src/SDL.h +++ b/Source/Core/InputCommon/Src/SDL_Util.h @@ -1,98 +1,78 @@ -// 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 _SDL_h -#define _SDL_h - - -#include // System -#include -#include - -#ifdef _WIN32 -#include // Externals -#include -#if SDL_VERSION_ATLEAST(1, 3, 0) - #include -#endif -#else -#include -#include -#if SDL_VERSION_ATLEAST(1, 3, 0) - #include -#endif -#endif - -#include "Common.h" // Common - - -namespace InputCommon -{ - -enum EButtonType -{ - CTL_AXIS = 0, - CTL_HAT, - CTL_BUTTON, - CTL_KEY, -}; - -enum ETriggerType -{ - CTL_TRIGGER_SDL = 0, - CTL_TRIGGER_XINPUT, -}; - -enum EXInputTrigger -{ - XI_TRIGGER_L = 0, - XI_TRIGGER_R, -}; - -struct CONTROLLER_INFO // CONNECTED WINDOWS DEVICES INFO -{ - int NumAxes; // Amount of Axes - int NumButtons; // Amount of Buttons - int NumBalls; // Amount of Balls - int NumHats; // Amount of Hats (POV) - std::string Name; // Joypad/stickname - int ID; // SDL joystick device ID - bool Good; // Pad is good (it has at least one button or axis) - SDL_Joystick *joy; // SDL joystick device -}; - - -// General functions -bool SearchDevices(std::vector &_joyinfo, int &NumPads, int &NumGoodPads); -void GetButton(SDL_Joystick*, int,int,int,int, int&,int&,int&,int&,bool&,bool&, bool,bool,bool,bool,bool,bool); - -// Value conversion -float Deg2Rad(float Deg); -float Rad2Deg(float Rad); -int Pad_Convert(int _val); -float SquareDistance(float deg); -bool IsDeadZone(float DeadZone, int x, int y); -void Square2Circle(int &_x, int &_y, int _Diagonal, bool Circle2Square = false); -void RadiusAdjustment(s8 &_x, s8 &_y, int _Radius); -// Input configuration -std::string VKToString(int keycode); - - -} // InputCommon - - -#endif // _SDL_h +// 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 _SDL_h +#define _SDL_h + + +#include // System +#include +#include + +#ifdef _WIN32 +#include // Externals +#include +#if SDL_VERSION_ATLEAST(1, 3, 0) + #include +#endif +#else +#include +#include +#if SDL_VERSION_ATLEAST(1, 3, 0) + #include +#endif +#endif + +#include "Common.h" // Common + + +namespace InputCommon +{ + +struct CONTROLLER_INFO // CONNECTED WINDOWS DEVICES INFO +{ + int NumAxes; // Amount of Axes + int NumButtons; // Amount of Buttons + int NumBalls; // Amount of Balls + int NumHats; // Amount of Hats (POV) + std::string Name; // Joypad/stickname + int ID; // SDL joystick device ID + bool Good; // Pad is good (it has at least one button or axis) + SDL_Joystick *joy; // SDL joystick device +}; + + +// General functions +bool SearchDevices(std::vector &_joyinfo, int &NumPads, int &NumGoodPads); +void GetButton(SDL_Joystick*, int,int,int,int, int&,int&,int&,int&,bool&,bool&, bool,bool,bool,bool,bool,bool); + +// Value conversion +float Deg2Rad(float Deg); +float Rad2Deg(float Rad); +int Pad_Convert(int _val); +float SquareDistance(float deg); +bool IsDeadZone(float DeadZone, int x, int y); +void Square2Circle(int &_x, int &_y, int _Diagonal, bool Circle2Square = false); +void RadiusAdjustment(s8 &_x, s8 &_y, int _Radius); +// Input configuration +std::string VKToString(int keycode); + + +} // InputCommon + + +#endif // _SDL_h diff --git a/Source/Core/InputCommon/Src/XInput.cpp b/Source/Core/InputCommon/Src/XInput_Util.cpp similarity index 95% rename from Source/Core/InputCommon/Src/XInput.cpp rename to Source/Core/InputCommon/Src/XInput_Util.cpp index 3ba09c3aa2..e022c2d96a 100644 --- a/Source/Core/InputCommon/Src/XInput.cpp +++ b/Source/Core/InputCommon/Src/XInput_Util.cpp @@ -1,136 +1,124 @@ - -// -// Licensetype: GNU General Public License (GPL) -// -// 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/ -// - - - - -// File description -/* ------------------- - Function: This file will get the status of the analog triggers of any connected XInput device. - This code was made with the help of SimpleController.cpp in the June 2008 Microsoft DirectX SDK - Samples. - -///////////////////////////////////////////////////// */ - -#ifdef _WIN32 - - -// Includes -// ------------------- -#include -#include // XInput API - -#include "SDL.h" // Local - - - -namespace XInput -{ - - - -// Declarations -// ------------------- - -#define MAX_CONTROLLERS 4 // XInput handles up to 4 controllers - -struct CONTROLER_STATE -{ - XINPUT_STATE state; - bool bConnected; -}; -CONTROLER_STATE g_Controllers[MAX_CONTROLLERS]; - - - - -// Init -// ------------------- -/* Function: Calculate the number of connected XInput devices - Todo: Implement this to figure out if there are multiple XInput controllers connected, - we currently only try to connect to XInput device 0 */ -void Init() -{ - // Init state - //ZeroMemory( g_Controllers, sizeof( CONTROLER_STATE ) * MAX_CONTROLLERS ); - - // Declaration - DWORD dwResult; - - // Calculate the number of connected XInput devices - for( DWORD i = 0; i < MAX_CONTROLLERS; i++ ) - { - // Simply get the state of the controller from XInput. - dwResult = XInputGetState( i, &g_Controllers[i].state ); - - if( dwResult == ERROR_SUCCESS ) - g_Controllers[i].bConnected = true; - else - g_Controllers[i].bConnected = false; - } - -} - - - - -// Get the trigger status -// ------------------- -int GetXI(int Controller, int Button) -{ - // Update the internal status - DWORD dwResult; - dwResult = XInputGetState(Controller, &g_Controllers[Controller].state); - - if (dwResult != ERROR_SUCCESS) return -1; - - switch (Button) - { - case InputCommon::XI_TRIGGER_L: - return g_Controllers[Controller].state.Gamepad.bLeftTrigger; - - case InputCommon::XI_TRIGGER_R: - return g_Controllers[Controller].state.Gamepad.bRightTrigger; - - default: - return 0; - } -} - - - - -// Check if a certain controller is connected -// ------------------- -bool IsConnected(int Controller) -{ - DWORD dwResult = XInputGetState( Controller, &g_Controllers[Controller].state ); - - // Update the connected status - if( dwResult == ERROR_SUCCESS ) - return true; - else - return false; -} - - -} // XInput - + +// +// Licensetype: GNU General Public License (GPL) +// +// 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/ +// + + + + +// File description +/* ------------------- + Function: This file will get the status of the analog triggers of any connected XInput device. + This code was made with the help of SimpleController.cpp in the June 2008 Microsoft DirectX SDK + Samples. + +///////////////////////////////////////////////////// */ + +#ifdef _WIN32 + + +// Includes +// ------------------- +#include +#include // XInput API +#include "InputCommon.h" + +namespace XInput +{ + +// Declarations +// ------------------- + +#define MAX_CONTROLLERS 4 // XInput handles up to 4 controllers + +struct CONTROLER_STATE +{ + XINPUT_STATE state; + bool bConnected; +}; +CONTROLER_STATE g_Controllers[MAX_CONTROLLERS]; + + +// Init +// ------------------- +/* Function: Calculate the number of connected XInput devices + Todo: Implement this to figure out if there are multiple XInput controllers connected, + we currently only try to connect to XInput device 0 */ +void Init() +{ + // Init state + //ZeroMemory( g_Controllers, sizeof( CONTROLER_STATE ) * MAX_CONTROLLERS ); + + // Declaration + DWORD dwResult; + + // Calculate the number of connected XInput devices + for( DWORD i = 0; i < MAX_CONTROLLERS; i++ ) + { + // Simply get the state of the controller from XInput. + dwResult = XInputGetState( i, &g_Controllers[i].state ); + + if( dwResult == ERROR_SUCCESS ) + g_Controllers[i].bConnected = true; + else + g_Controllers[i].bConnected = false; + } + +} + + +// Get the trigger status +// ------------------- +int GetXI(int Controller, int Button) +{ + // Update the internal status + DWORD dwResult; + dwResult = XInputGetState(Controller, &g_Controllers[Controller].state); + + if (dwResult != ERROR_SUCCESS) return -1; + + switch (Button) + { + case InputCommon::XI_TRIGGER_L: + return g_Controllers[Controller].state.Gamepad.bLeftTrigger; + + case InputCommon::XI_TRIGGER_R: + return g_Controllers[Controller].state.Gamepad.bRightTrigger; + + default: + return 0; + } +} + + +// Check if a certain controller is connected +// ------------------- +bool IsConnected(int Controller) +{ + DWORD dwResult = XInputGetState( Controller, &g_Controllers[Controller].state ); + + // Update the connected status + if( dwResult == ERROR_SUCCESS ) + return true; + else + return false; +} + +} // XInput + #endif \ No newline at end of file diff --git a/Source/Core/InputCommon/Src/XInput.h b/Source/Core/InputCommon/Src/XInput_Util.h similarity index 95% rename from Source/Core/InputCommon/Src/XInput.h rename to Source/Core/InputCommon/Src/XInput_Util.h index 30ba93c79e..fd4b23bb98 100644 --- a/Source/Core/InputCommon/Src/XInput.h +++ b/Source/Core/InputCommon/Src/XInput_Util.h @@ -1,46 +1,43 @@ - -// -// Licensetype: GNU General Public License (GPL) -// -// 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/ -// - - -#ifdef _WIN32 - - -// Includes -// ---------- -#include - - - - -namespace XInput -{ - - -// Declarations -// ---------- -void Init(); -int GetXI(int Controller, int Button); -bool IsConnected(int Controller); - - -} // XInput - -#endif - + +// +// Licensetype: GNU General Public License (GPL) +// +// 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/ +// + + +#ifdef _WIN32 + + +// Includes +// ---------- +#include + + +namespace XInput +{ + +// Declarations +// ---------- +void Init(); +int GetXI(int Controller, int Button); +bool IsConnected(int Controller); + + +} // XInput + +#endif + diff --git a/Source/Plugins/Plugin_GCPad/Src/GCPad.h b/Source/Plugins/Plugin_GCPad/Src/GCPad.h index 625e653bb2..b9ec787b36 100644 --- a/Source/Plugins/Plugin_GCPad/Src/GCPad.h +++ b/Source/Plugins/Plugin_GCPad/Src/GCPad.h @@ -22,9 +22,10 @@ #include // System #include -#include "../../../Core/InputCommon/Src/SDL.h" // Core +#include "../../../Core/InputCommon/Src/InputCommon.h" // Core +#include "../../../Core/InputCommon/Src/SDL_Util.h" #ifdef _WIN32 - #include "../../../Core/InputCommon/Src/XInput.h" + #include "../../../Core/InputCommon/Src/XInput_Util.h" #elif defined(HAVE_X11) && HAVE_X11 #include #include diff --git a/Source/Plugins/Plugin_Wiimote/Src/ConfigPadDlg.cpp b/Source/Plugins/Plugin_Wiimote/Src/ConfigPadDlg.cpp index 1d62de21f4..0b6e85ee19 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/ConfigPadDlg.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/ConfigPadDlg.cpp @@ -23,12 +23,6 @@ #include "Config.h" #include "EmuDefinitions.h" // for joyinfo -enum TriggerType -{ - CTL_TRIGGER_SDL = 0, - CTL_TRIGGER_XINPUT -}; - BEGIN_EVENT_TABLE(WiimotePadConfigDialog,wxDialog) EVT_CLOSE(WiimotePadConfigDialog::OnClose) diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.h b/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.h index 7f17c6996e..64709be80e 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.h +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.h @@ -21,8 +21,11 @@ #include #include -#include "../../../Core/InputCommon/Src/SDL.h" // Core -#include "../../../Core/InputCommon/Src/XInput.h" +#include "../../../Core/InputCommon/Src/InputCommon.h" // Core +#include "../../../Core/InputCommon/Src/SDL_Util.h" +#ifdef _WIN32 +#include "../../../Core/InputCommon/Src/XInput_Util.h" +#endif #include "Common.h" #include "pluginspecs_wiimote.h" diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuDynamics.cpp b/Source/Plugins/Plugin_Wiimote/Src/EmuDynamics.cpp index d04a3178b9..36c0597db4 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuDynamics.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuDynamics.cpp @@ -18,8 +18,6 @@ #include #include -#include "../../../Core/InputCommon/Src/SDL.h" // Core -#include "../../../Core/InputCommon/Src/XInput.h" #include "Common.h" // Common #include "MathUtil.h" diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp index 2f5e411361..b7c10c4afb 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp @@ -18,9 +18,6 @@ #include #include -#include "../../../Core/InputCommon/Src/SDL.h" // Core -#include "../../../Core/InputCommon/Src/XInput.h" - #include "Common.h" // Common #include "StringUtil.h" // for ArrayToString() #include "IniFile.h" diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h index e18cdaa05d..3afca7ec3c 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h @@ -21,8 +21,6 @@ #include -#include "../../../Core/InputCommon/Src/SDL.h" // Core - #include "wiimote_hid.h" #include "EmuDefinitions.h" #include "ChunkFile.h" diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuPad.cpp b/Source/Plugins/Plugin_Wiimote/Src/EmuPad.cpp index 23629ec90b..ad6d306341 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuPad.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuPad.cpp @@ -19,9 +19,6 @@ #include #include -#include "../../../Core/InputCommon/Src/SDL.h" // Core -#include "../../../Core/InputCommon/Src/XInput.h" - #include "Common.h" // Common #include "StringUtil.h" // for ArrayToString() #include "IniFile.h" diff --git a/Source/Plugins/Plugin_Wiimote/Src/Rumble.cpp b/Source/Plugins/Plugin_Wiimote/Src/Rumble.cpp index 42818dfa79..6d4195fb91 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/Rumble.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/Rumble.cpp @@ -16,10 +16,7 @@ // http://code.google.com/p/dolphin-emu/ // - -#include "../../../Core/InputCommon/Src/SDL.h" // Core #include "EmuDefinitions.h" - #ifdef _WIN32 #include "XInput.h" #endif