summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/Src/XInput.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/InputCommon/Src/XInput.cpp')
-rw-r--r--Source/Core/InputCommon/Src/XInput.cpp136
1 files changed, 136 insertions, 0 deletions
diff --git a/Source/Core/InputCommon/Src/XInput.cpp b/Source/Core/InputCommon/Src/XInput.cpp
new file mode 100644
index 0000000000..6e0d4605a7
--- /dev/null
+++ b/Source/Core/InputCommon/Src/XInput.cpp
@@ -0,0 +1,136 @@
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+// 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 <windows.h>
+#include <XInput.h> // 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[0].state.Gamepad.bLeftTrigger;
+
+ case InputCommon::XI_TRIGGER_R:
+ return g_Controllers[0].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