169 lines
6.6 KiB
C++
169 lines
6.6 KiB
C++
/*
|
|
XInput Controller support for N-Rage`s Dinput8 Plugin
|
|
(C) 2002, 2006 Norbert Wladyka - N-Rage`s Dinput8 Plugin
|
|
(C) 2009 Daniel Rehren - XInput Controller support
|
|
|
|
N-Rage`s Dinput8 Plugin:
|
|
Author`s Email: norbert.wladyka@chello.at
|
|
Website: http://go.to/nrage
|
|
|
|
XInput Controller support:
|
|
Author's Email: rehren_007@hotmail.com
|
|
|
|
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; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
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 for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#ifndef _XINPUTCONTROLLER_H
|
|
#define _XINPUTCONTROLLER_H
|
|
|
|
//#include <wmsstd.h> <-- only needed for SAFE_RELEASE(x)
|
|
|
|
/* fixes undefined FILE, etc. type errors in MSVC 2010 build -- cxd4 */
|
|
#include <stdio.h>
|
|
|
|
#ifndef SAFE_RELEASE // when Windows Media Device M? is not present
|
|
#define SAFE_RELEASE(x) \
|
|
if(x != NULL) \
|
|
{ \
|
|
x->Release(); \
|
|
x = NULL; \
|
|
}
|
|
#endif
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Enum each PNP device using WMI and check each device ID to see if it contains
|
|
// "IG_" (ex. "VID_045E&PID_028E&IG_00"). If it does, then it's an XInput device
|
|
// Unfortunately this information can not be found by just using DirectInput
|
|
//-----------------------------------------------------------------------------
|
|
BOOL IsXInputDevice( const GUID* pGuidProductFromDirectInput );
|
|
//END conde from ...
|
|
|
|
/*
|
|
Xinput header for NRage Plugin, by tecnicors.
|
|
|
|
XInput Controller is going to take over the N64 control that matches its
|
|
number, ie. first XInput controller is first N64 player, etc.
|
|
*/
|
|
|
|
#include "commonIncludes.h"
|
|
#include <xinput.h>
|
|
|
|
//defines
|
|
#define N64_ANALOG_MAX 127
|
|
#define XC_ANALOG_MAX 32767
|
|
#define BUTTON_ANALOG_VALUE 60
|
|
|
|
//enums
|
|
namespace N64_BUTTONS
|
|
{
|
|
// Whith this we can asign buttons to the xinput struct
|
|
enum _N64_BUTTONS { A = 0x0080, B = 0x0040, Z = 0x0020, R = 0x1000, L = 0x2000, XAxis = 0x4000,
|
|
Start = 0x0010, DUp = 0x0008, DDown = 0x0004, DLeft = 0x0002, YAxis = 0x8000,
|
|
DRight = 0x0001, CUp = 0x0800, CDown = 0x0400, CLeft = 0x0200, CRight = 0x0100,
|
|
None = 0x0 };
|
|
}
|
|
|
|
//structures
|
|
typedef struct _XCONTROLLER // XInput controller struct
|
|
{
|
|
int nControl;
|
|
bool bConfigured;
|
|
|
|
struct _N64_BUTTONS // For button configurations
|
|
{
|
|
int iA, iB;
|
|
int iStart;
|
|
int iL, iR, iZ;
|
|
int iXAxis, iYAxis;
|
|
int iDUp, iDDown, iDLeft, iDRight;
|
|
int iCUp, iCDown, iCLeft, iCRight;
|
|
}stButtons;
|
|
|
|
struct _XINPUT_ANALOGS // For analog configurations
|
|
{
|
|
int iLeftTrigger, iRightTrigger;
|
|
unsigned int iRXAxis, iRYAxis, iLXAxis, iLYAxis;
|
|
}stAnalogs;
|
|
|
|
}XCONTROLLER;
|
|
|
|
typedef XCONTROLLER *LPXCONTROLLER;
|
|
|
|
extern int iXinputControlId;
|
|
|
|
//Initiates XInput library
|
|
bool InitXinput();
|
|
//Free the Xinput library
|
|
void FreeXinput();
|
|
// Sets the keys pressed for Xinput controller gController, into keys.
|
|
void GetXInputControllerKeys( const int indexController, LPDWORD Keys );
|
|
// Sets the default keys for Xinput controller gController.
|
|
void DefaultXInputControllerKeys( LPXCONTROLLER gController);
|
|
// Vibrates the XInput Control
|
|
void VibrateXInputController( DWORD nController, int LeftMotorVal = 65535, int RightMotorVal = 65535 );
|
|
// Initialize nControl XInput enabled controller
|
|
bool InitiateXInputController( LPXCONTROLLER gController, int nControl );
|
|
|
|
static DWORD(WINAPI * fnXInputGetState) (DWORD dwUserIndex, XINPUT_STATE* pState) = NULL;
|
|
static DWORD(WINAPI * fnXInputSetState) (DWORD dwUserIndex, XINPUT_VIBRATION* pVibration) = NULL;
|
|
|
|
// XController dialog
|
|
|
|
#define XC_DPAD 1
|
|
#define XC_LTBS 2
|
|
#define XC_RTBS 3
|
|
|
|
// Reads current XInput controller key config, and shows it in the dialog.
|
|
bool ReadXInputControllerKeys( HWND hDlg, LPXCONTROLLER gController );
|
|
// Stores dialog's button configuration into the XCONTROLLER struct.
|
|
void StoreXInputControllerKeys( HWND hDlg, LPXCONTROLLER gController );
|
|
// Fills N64 button comobox with its buttons.
|
|
inline void FillN64ButtonComboBox( HWND hDlg, int ComboBox )
|
|
{
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "None" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "A" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "B" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "Z" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "L" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "R" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "Start" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "C-Up" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "C-Left" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "C-Down" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "C-Right" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "D-Up" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "D-Left" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "D-Down" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "D-Right" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_SETCURSEL, 0, ( LPARAM )0 );
|
|
}
|
|
|
|
inline void FillN64AnalogComboBox( HWND hDlg, int ComboBox )
|
|
{
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "None" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "DPad" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "C Buttons" ));
|
|
if( ComboBox != IDC_XC_DPAD )
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_ADDSTRING, 0, ( LPARAM )_T( "Analog Stick" ));
|
|
SendDlgItemMessage( hDlg, ComboBox, CB_SETCURSEL, 0, ( LPARAM )0);
|
|
}
|
|
|
|
// Save/Load Keys from own config file
|
|
|
|
void SaveXInputConfigToFile( FILE *file, LPXCONTROLLER gController );
|
|
void LoadXInputConfigFromFile( FILE *file, LPXCONTROLLER gController );
|
|
|
|
#endif //_XINPUTCONTROLLER_H
|