diff options
| author | Shawn Hoffman <godisgovernment@gmail.com> | 2009-11-14 17:08:32 +0000 |
|---|---|---|
| committer | Shawn Hoffman <godisgovernment@gmail.com> | 2009-11-14 17:08:32 +0000 |
| commit | 06aa62504cdb00bb04f5bfae106a1b3656d1682a (patch) | |
| tree | dbd0a773b3bde61e36b158fc74c4259ca92e93f1 /Source/Core/InputCommon/Src | |
| parent | 18305c7c49421e7f635c57e67b434f8f5003bfdc (diff) | |
revert to r4531, but keep the changes from the following revisions: 4533,4550-4551,4556-4559
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4566 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/InputCommon/Src')
| -rw-r--r-- | Source/Core/InputCommon/Src/SDL.cpp | 254 | ||||
| -rw-r--r-- | Source/Core/InputCommon/Src/SDL.h | 24 |
2 files changed, 42 insertions, 236 deletions
diff --git a/Source/Core/InputCommon/Src/SDL.cpp b/Source/Core/InputCommon/Src/SDL.cpp index 0edfe524cb..0caf01ccd3 100644 --- a/Source/Core/InputCommon/Src/SDL.cpp +++ b/Source/Core/InputCommon/Src/SDL.cpp @@ -35,63 +35,46 @@ #define _SDL_MAIN_ // Avoid certain declarations in SDL.h #include "SDL.h" // Local #include "XInput.h" -#ifdef _WIN32 -#include <windows.h> -#include <dinput.h> -#pragma comment(lib, "dxguid.lib") -#pragma comment(lib, "dinput8.lib") -#endif +// Definitions +// ------------------- +int g_LastPad = 0; + + + namespace InputCommon { // Definitions // ------------------- -int g_LastPad = 0; -int NumDIDevices = 0; -// Reset and search for devices -// ----------------------- -bool SearchDevicesReset(std::vector<CONTROLLER_INFO> &_joyinfo, int &_NumPads) -{ - // This is needed to update SDL_NumJoysticks - if (SDL_WasInit(0)) - SDL_Quit(); - - return SearchDevices(_joyinfo, _NumPads); -} -// Initialize if not previously initialized + + +// Search attached devices. Populate joyinfo for all attached physical devices. // ----------------------- -bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &_NumPads) +bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads) { - // Init Joystick + Haptic (force feedback) subsystem on SDL 1.3 if (!SDL_WasInit(0)) - { -#if SDL_VERSION_ATLEAST(1, 3, 0) && !defined(_WIN32) - NOTICE_LOG(PAD, "SDL_Init | HAPTIC"); +#if SDL_VERSION_ATLEAST(1, 3, 0) if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC) < 0) #else - //NOTICE_LOG(PAD, "SDL_Init"); if (SDL_Init(SDL_INIT_JOYSTICK) < 0) #endif { PanicAlert("Could not initialize SDL: %s", SDL_GetError()); return false; } - } - // Clear joyinfo - _joyinfo.clear(); // Get device status int numjoy = SDL_NumJoysticks(); for (int i = 0; i < numjoy; i++ ) - { + { CONTROLLER_INFO Tmp; Tmp.joy = SDL_JoystickOpen(i); @@ -103,160 +86,39 @@ bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &_NumPads) Tmp.Name = SDL_JoystickName(i); // Check if the device is okay - if ( !( Tmp.NumAxes == 0 + if ( Tmp.NumAxes == 0 && Tmp.NumBalls == 0 && Tmp.NumButtons == 0 - && Tmp.NumHats == 0) + && Tmp.NumHats == 0 ) { - _joyinfo.push_back(Tmp); + Tmp.Good = false; } else { - //if (SDL_JoystickOpened(i)) SDL_JoystickClose(Tmp.joy); - } - } - - _NumPads = (int)_joyinfo.size(); - return true; -} + _NumGoodPads++; + Tmp.Good = true; + } + _joyinfo.push_back(Tmp); -// Show the current pad status -// ----------------- -std::string ShowStatus(int Slot, int Device, CONTROLLER_MAPPING PadMapping[], CONTROLLER_STATE PadState[], - std::vector<InputCommon::CONTROLLER_INFO> joyinfo) -{ - CONTROLLER_MAPPING_NEW _PadMapping[4]; - CONTROLLER_STATE_NEW _PadState[4]; - for (int i = 0; i < 4; i++) - { - _PadMapping[i].ID = PadMapping[i].ID; - _PadMapping[i].Name = PadMapping[i].Name; - _PadState[i].joy = PadState[i].joy; - } - return DoShowStatus(Slot, Device, _PadMapping, _PadState, joyinfo); -} -std::string DoShowStatus(int Slot, int Device, - CONTROLLER_MAPPING_NEW PadMapping[], CONTROLLER_STATE_NEW PadState[], - std::vector<InputCommon::CONTROLLER_INFO> joyinfo) -{ - // Save the physical device - int ID = PadMapping[Slot].ID; - // Make local shortcut - SDL_Joystick *joy = PadState[Slot].joy; - - // Make shortcuts for all pads - SDL_Joystick *joy0 = PadState[0].joy; - SDL_Joystick *joy1 = PadState[1].joy; - SDL_Joystick *joy2 = PadState[2].joy; - SDL_Joystick *joy3 = PadState[3].joy; - - // Temporary storage - std::string - StrAllHandles, StrAllName, - StrHandles, StrId, StrName, - StrAxes, StrHats, StrBut; - int value; - - // All devices - int numjoy = SDL_NumJoysticks(); - for (int i = 0; i < numjoy; i++ ) - { - SDL_Joystick *AllJoy = SDL_JoystickOpen(i); - StrAllHandles += StringFromFormat(" %i:%06i", i, AllJoy); - StrAllName += StringFromFormat("Name %i: %s\n", i, SDL_JoystickName(i)); + // We have now read the values we need so we close the device + if (SDL_JoystickOpened(i)) SDL_JoystickClose(_joyinfo[i].joy); } - // Get handles - for(int i = 0; i < joyinfo.size(); i++) - { - StrHandles += StringFromFormat(" %i:%06i", i, joyinfo.at(i).joy); - StrId += StringFromFormat(" %i:%i", i, joyinfo.at(i).ID); - StrName += StringFromFormat("Name %i:%s\n", i, joyinfo.at(i).Name.c_str()); - } - - // Get status - int Axes = joyinfo[Device].NumAxes; - int Balls = joyinfo[Device].NumBalls; - int Hats = joyinfo[Device].NumHats; - int Buttons = joyinfo[Device].NumButtons; - - // Update the internal values - SDL_JoystickUpdate(); - - // Go through all axes and read out their values - for(int i = 0; i < Axes; i++) - { - value = SDL_JoystickGetAxis(joy, i); - StrAxes += StringFromFormat(" %i:%06i", i, value); - } - for(int i = 0;i < Hats; i++) - { - value = SDL_JoystickGetHat(joy, i); - StrHats += StringFromFormat(" %i:%i", i, value); - } - for(int i = 0;i < Buttons; i++) - { - value = SDL_JoystickGetButton(joy, i); - StrBut += StringFromFormat(" %i:%i", i+1, value); - } + _NumPads = (int)_joyinfo.size(); - return StringFromFormat( - "All devices:\n" - "Handles: %s\n" - "%s" - - "\nAll pads:\n" - "Handles: %s\n" - "ID: %s\n" - "%s" - - "\nAll slots:\n" - "ID: %i %i %i %i\n" - "Name: '%s' '%s' '%s' '%s'\n" - //"Controllertype: %i %i %i %i\n" - //"SquareToCircle: %i %i %i %i\n\n" - #ifdef _WIN32 - "Handles: %i %i %i %i\n" - //"XInput: %i %i %i\n" - #endif - - "\nThis pad:\n" - "Handle: %06i\n" - "ID: %i\n" - //"Slot: %i\n" - "Axes: %s\n" - "Hats: %s\n" - "But: %s\n" - "Device: Ax: %i Balls:%i Hats:%i But:%i", - StrAllHandles.c_str(), StrAllName.c_str(), - StrHandles.c_str(), StrId.c_str(), StrName.c_str(), - - PadMapping[0].ID, PadMapping[1].ID, PadMapping[2].ID, PadMapping[3].ID, - PadMapping[0].Name.c_str(), PadMapping[1].Name.c_str(), PadMapping[2].Name.c_str(), PadMapping[3].Name.c_str(), - //PadMapping[0].controllertype, PadMapping[1].controllertype, PadMapping[2].controllertype, PadMapping[3].controllertype, - //PadMapping[0].bSquareToCircle, PadMapping[1].bSquareToCircle, PadMapping[2].bSquareToCircle, PadMapping[3].bSquareToCircle, - #ifdef _WIN32 - joy0, joy1, joy2, joy3, - //PadState[PadMapping[0].ID].joy, PadState[PadMapping[1].ID].joy, PadState[PadMapping[2].ID].joy, PadState[PadMapping[3].ID].joy, - //XInput::IsConnected(0), XInput::GetXI(0, InputCommon::XI_TRIGGER_L), XInput::GetXI(0, InputCommon::XI_TRIGGER_R), - joy, - #endif - //Slot, - ID, - StrAxes.c_str(), StrHats.c_str(), StrBut.c_str(), - Axes, Balls, Hats, Buttons - ); + return true; } + // Supporting functions -// ==================== +// ---------------- // Read current joystick status -/* -------------------- +/* ---------------- The value PadMapping[].buttons[] is the number of the assigned joypad button, PadState[].buttons[] is the status of the button, it becomes 0 (no pressed) or 1 (pressed) */ @@ -278,15 +140,10 @@ void ReadButton(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int Input: The virtual device 0, 1, 2 or 3 Function: Updates the PadState struct with the current pad status. The input value "controller" is for a virtual controller 0 to 3. */ -void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping) -{ - if (SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE) return; - //NOTICE_LOG(PAD, "SDL_JoystickEventState: %s", (SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE) ? "SDL_ENABLE" : "SDL_IGNORE"); - +void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int Controller, int NumButtons) +{ // Update the gamepad status SDL_JoystickUpdate(); - // Read info - int NumButtons = SDL_JoystickNumButtons(_PadState.joy); // Update axis states. It doesn't hurt much if we happen to ask for nonexisting axises here. _PadState.axis[CTL_MAIN_X] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.axis[CTL_MAIN_X]); @@ -349,13 +206,12 @@ void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping) } #ifdef SHOW_PAD_STATUS - /* // Show the status of all connected pads //ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); - //if ((g_LastPad == 0 && _PadMapping.ID == 0) || Controller < g_LastPad) Console->ClearScreen(); + //if ((g_LastPad == 0 && Controller == 0) || Controller < g_LastPad) Console->ClearScreen(); g_LastPad = Controller; NOTICE_LOG(CONSOLE, - "Pad | Number:%i Handle:%i\n" + "Pad | Number:%i Enabled:%i Handle:%i\n" "Main Stick | X:%03i Y:%03i\n" "C Stick | X:%03i Y:%03i\n" "Trigger | Type:%s DigitalL:%i DigitalR:%i AnalogL:%03i AnalogR:%03i HalfPress:%i\n" @@ -363,7 +219,7 @@ void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping) "D-Pad | Type:%s Hat:%i U:%i D:%i\n" "======================================================\n", - _PadMapping.ID, _PadState.joy, + Controller, _PadMapping.enabled, _PadState.joy, _PadState.axis[InputCommon::CTL_MAIN_X], _PadState.axis[InputCommon::CTL_MAIN_Y], _PadState.axis[InputCommon::CTL_SUB_X], _PadState.axis[InputCommon::CTL_SUB_Y], @@ -379,7 +235,6 @@ void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping) _PadState.dpad, _PadState.dpad2[InputCommon::CTL_D_PAD_UP], _PadState.dpad2[InputCommon::CTL_D_PAD_DOWN] ); - */ #endif } @@ -408,23 +263,18 @@ bool AvoidValues(int value, bool NoTriggerFilter) // Detect a pressed button // --------------------- -void GetButton(SDL_Joystick *joy, int ControllerID, +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; - // Save info - int buttons = SDL_JoystickNumButtons(joy); - int axes = SDL_JoystickNumAxes(joy);; - int hats = SDL_JoystickNumHats(joy);; - // Update the internal status SDL_JoystickUpdate(); // For the triggers we accept both a digital or an analog button - if (Axis) + if(Axis) { for(int i = 0; i < axes; i++) { @@ -439,7 +289,7 @@ void GetButton(SDL_Joystick *joy, int ControllerID, } // Check for a hat - if (Hat) + if(Hat) { for(int i = 0; i < hats; i++) { @@ -520,41 +370,5 @@ void GetButton(SDL_Joystick *joy, int ControllerID, -// ********************************************** - - - -// Search for DirectInput devices -// ---------------- -#ifdef _WIN32 -BOOL CALLBACK EnumDICallback(const DIDEVICEINSTANCE* pInst, VOID* pContext) -{ - NumDIDevices++; - return true; -} -#endif -int SearchDIDevices() -{ - #ifdef _WIN32 - LPDIRECTINPUT8 g_pObject; - LPDIRECTINPUTDEVICE8 g_pDevice; - DIPROPDWORD dipdw; - HRESULT hr; - NumDIDevices = 0; - - // Register with the DirectInput subsystem and get a pointer to a IDirectInput interface we can use. - if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&g_pObject, NULL))) - return 0; - - // Look for a device - if (FAILED(hr = g_pObject->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumDICallback, NULL, DIEDFL_ATTACHEDONLY))) - return 0; - return NumDIDevices; - #else - return 0; - #endif -} - - } // InputCommon diff --git a/Source/Core/InputCommon/Src/SDL.h b/Source/Core/InputCommon/Src/SDL.h index e49b8aab33..40c121f96f 100644 --- a/Source/Core/InputCommon/Src/SDL.h +++ b/Source/Core/InputCommon/Src/SDL.h @@ -53,7 +53,7 @@ #endif #include "Common.h" // Common -#include "StringUtil.h" + namespace InputCommon @@ -62,7 +62,7 @@ namespace InputCommon // Settings // ---------- -// Show a status window with the detected devices etc +// Show a status window with the detected axes, buttons and so on //#define SHOW_PAD_STATUS @@ -82,7 +82,7 @@ struct CONTROLLER_STATE // GC PAD INFO/STATE int dpad; // Automatic SDL D-Pad (8 directions + neutral) int dpad2[4]; // D-pad using buttons int axis[6]; // 2 x 2 Axes (Main & Sub) - int halfpress; // L and R triggers half pressed + int halfpress; // Halfpress... you know, like not fully pressed ;)... SDL_Joystick *joy; // SDL joystick device }; @@ -95,7 +95,6 @@ struct CONTROLLER_MAPPING // GC PAD MAPPING int halfpress; // (See above) int deadzone; // Deadzone... what else? int ID; // SDL joystick device ID - std::string Name; // SDL joystick device name int controllertype; // Hat: Hat or custom buttons int triggertype; // Triggers range std::string SRadius, SDiagonal, SRadiusC, SDiagonalC; @@ -112,6 +111,7 @@ struct CONTROLLER_INFO // CONNECTED WINDOWS DEVICES INFO 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 }; enum @@ -220,7 +220,6 @@ struct CONTROLLER_MAPPING_NEW // GC PAD MAPPING int DeadZoneL; // Analog 1 Deadzone int DeadZoneR; // Analog 2 Deadzone int ID; // SDL joystick device ID - std::string Name; // SDL joystick device name int controllertype; // D-Pad type: Hat or custom buttons int triggertype; // SDL or XInput trigger std::string SDiagonal; @@ -237,14 +236,9 @@ struct CONTROLLER_MAPPING_NEW // GC PAD MAPPING // --------- // General functions -bool SearchDevicesReset(std::vector<CONTROLLER_INFO> &_joyinfo, int &NumPads); -bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &NumPads); -std::string ShowStatus(int Slot, int Device, CONTROLLER_MAPPING PadMapping[], CONTROLLER_STATE PadState[], - std::vector<InputCommon::CONTROLLER_INFO> joyinfo); -std::string DoShowStatus(int Slot, int Device, CONTROLLER_MAPPING_NEW PadMapping[], CONTROLLER_STATE_NEW PadState[], - std::vector<InputCommon::CONTROLLER_INFO> joyinfo); -void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping); -void GetButton(SDL_Joystick*, int, int&,int&,int&,int&,bool&,bool&, bool,bool,bool,bool,bool,bool); +bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &NumPads, int &NumGoodPads); +void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int controller, int NumButtons); +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); @@ -262,9 +256,7 @@ std::string VKToString(int keycode); extern int g_LastPad; #endif -// DirectInput -extern int NumDIDevices; -int SearchDIDevices(); + } // InputCommon |
