Restore the SDL2 joystick code
Modified to fit the original code better
This commit is contained in:
parent
fd855ee732
commit
c00262bcd8
3 changed files with 38 additions and 151 deletions
185
src/Input.cpp
185
src/Input.cpp
|
@ -4,167 +4,66 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define DIRECTINPUT_VERSION 0x500
|
#include "SDL.h"
|
||||||
#include <dinput.h>
|
|
||||||
|
|
||||||
#include "WindowsWrapper.h"
|
#include "WindowsWrapper.h"
|
||||||
|
|
||||||
typedef struct DirectInputPair
|
static SDL_Joystick *joystick;
|
||||||
{
|
|
||||||
LPDIRECTINPUTA lpDI;
|
|
||||||
LPDIRECTINPUTDEVICE2A device;
|
|
||||||
} DirectInputPair;
|
|
||||||
|
|
||||||
static LPDIRECTINPUTDEVICE2A joystick;
|
|
||||||
static LPDIRECTINPUTA lpDI;
|
|
||||||
|
|
||||||
static int joystick_neutral_x;
|
static int joystick_neutral_x;
|
||||||
static int joystick_neutral_y;
|
static int joystick_neutral_y;
|
||||||
|
|
||||||
void ReleaseDirectInput(void)
|
void ReleaseDirectInput(void)
|
||||||
{
|
{
|
||||||
|
// Close opened joystick (if exists)
|
||||||
if (joystick != NULL)
|
if (joystick != NULL)
|
||||||
{
|
{
|
||||||
joystick->Release();
|
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
|
||||||
|
SDL_JoystickClose(joystick);
|
||||||
joystick = NULL;
|
joystick = NULL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (lpDI != NULL)
|
BOOL HookAllDirectInputDevices(void);
|
||||||
{
|
|
||||||
lpDI->Release();
|
BOOL InitDirectInput(void)
|
||||||
lpDI = NULL;
|
{
|
||||||
}
|
SDL_InitSubSystem(SDL_INIT_JOYSTICK);
|
||||||
|
|
||||||
|
if (!HookAllDirectInputDevices())
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The original name for this function is unknown
|
// The original name for this function is unknown
|
||||||
BOOL SetDeviceAquire(BOOL aquire)
|
BOOL HookAllDirectInputDevices(void)
|
||||||
{
|
{
|
||||||
if (aquire == TRUE)
|
// Open first available joystick
|
||||||
|
for (int i = 0; i < SDL_NumJoysticks(); i++)
|
||||||
{
|
{
|
||||||
|
joystick = SDL_JoystickOpen(i);
|
||||||
|
|
||||||
|
// Break as soon as a joystick is properly opened
|
||||||
if (joystick != NULL)
|
if (joystick != NULL)
|
||||||
joystick->Acquire();
|
return TRUE;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
if (joystick != NULL)
|
|
||||||
joystick->Unacquire();
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL HookAllDirectInputDevices(HWND hWnd);
|
|
||||||
BOOL __stdcall EnumDevices_Callback(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef);
|
|
||||||
|
|
||||||
BOOL InitDirectInput(HINSTANCE hinst, HWND hWnd)
|
|
||||||
{
|
|
||||||
if (DirectInputCreateA(hinst, DIRECTINPUT_VERSION, &lpDI, NULL) != DI_OK)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (!HookAllDirectInputDevices(hWnd))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The original name for this function is unknown
|
|
||||||
BOOL HookAllDirectInputDevices(HWND hWnd)
|
|
||||||
{
|
|
||||||
DirectInputPair directinput_objects;
|
|
||||||
|
|
||||||
directinput_objects.device = NULL;
|
|
||||||
directinput_objects.lpDI = lpDI;
|
|
||||||
|
|
||||||
lpDI->AddRef();
|
|
||||||
lpDI->EnumDevices(4, EnumDevices_Callback, &directinput_objects, 1);
|
|
||||||
|
|
||||||
if (directinput_objects.lpDI != NULL)
|
|
||||||
{
|
|
||||||
directinput_objects.lpDI->Release();
|
|
||||||
directinput_objects.lpDI = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (directinput_objects.device == NULL)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
joystick = directinput_objects.device;
|
|
||||||
|
|
||||||
if (joystick->SetDataFormat(&c_dfDIJoystick) != DI_OK) // c_dfDIJoystick might be incorrect
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (joystick->SetCooperativeLevel(hWnd, DISCL_EXCLUSIVE | DISCL_BACKGROUND) != DI_OK)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
joystick->Acquire();
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The original name for this function is unknown
|
|
||||||
BOOL __stdcall EnumDevices_Callback(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef)
|
|
||||||
{
|
|
||||||
static int already_ran;
|
|
||||||
static DirectInputPair *directinput_objects;
|
|
||||||
|
|
||||||
if ((already_ran & 1) == 0)
|
|
||||||
{
|
|
||||||
already_ran |= 1;
|
|
||||||
directinput_objects = (DirectInputPair*)pvRef;
|
|
||||||
}
|
|
||||||
|
|
||||||
static LPDIRECTINPUTDEVICEA device;
|
|
||||||
if (directinput_objects->lpDI->CreateDevice(lpddi->guidInstance, &device, NULL))
|
|
||||||
{
|
|
||||||
directinput_objects->device = NULL;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static LPDIRECTINPUTDEVICE2A _joystick;
|
|
||||||
HRESULT res = device->QueryInterface(IID_IDirectInputDevice2A, (LPVOID*)&_joystick);
|
|
||||||
|
|
||||||
if (res < 0)
|
|
||||||
{
|
|
||||||
joystick = NULL;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (device != NULL)
|
|
||||||
{
|
|
||||||
device->Release();
|
|
||||||
device = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
directinput_objects->device = _joystick;
|
|
||||||
|
|
||||||
char string[0x100];
|
|
||||||
sprintf(string, "DeviceGUID = %x\n", lpddi->guidInstance);
|
|
||||||
OutputDebugStringA(string);
|
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL GetJoystickStatus(JOYSTICK_STATUS *status)
|
BOOL GetJoystickStatus(JOYSTICK_STATUS *status)
|
||||||
{
|
{
|
||||||
DIJOYSTATE joystate;
|
|
||||||
|
|
||||||
if (joystick == NULL)
|
if (joystick == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (joystick->Poll())
|
int numButtons = SDL_JoystickNumButtons(joystick);
|
||||||
return FALSE;
|
if (numButtons > 32)
|
||||||
|
numButtons = 32;
|
||||||
|
|
||||||
HRESULT res = joystick->GetDeviceState(sizeof(DIJOYSTATE), &joystate);
|
for (int i = 0; i < numButtons; ++i)
|
||||||
if (res)
|
|
||||||
{
|
{
|
||||||
if (res == DIERR_INPUTLOST)
|
if (SDL_JoystickGetButton(joystick, i) != 0)
|
||||||
SetDeviceAquire(0);
|
|
||||||
else
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < 32; ++i)
|
|
||||||
{
|
|
||||||
if (joystate.rgbButtons[i] & 0x80)
|
|
||||||
status->bButton[i] = TRUE;
|
status->bButton[i] = TRUE;
|
||||||
else
|
else
|
||||||
status->bButton[i] = FALSE;
|
status->bButton[i] = FALSE;
|
||||||
|
@ -175,14 +74,16 @@ BOOL GetJoystickStatus(JOYSTICK_STATUS *status)
|
||||||
status->bUp = FALSE;
|
status->bUp = FALSE;
|
||||||
status->bLeft = FALSE;
|
status->bLeft = FALSE;
|
||||||
|
|
||||||
if (joystate.lX < joystick_neutral_x - 10000)
|
const Sint16 joystick_x = SDL_JoystickGetAxis(joystick, 0);
|
||||||
|
if (joystick_x < joystick_neutral_x - 10000)
|
||||||
status->bLeft = TRUE;
|
status->bLeft = TRUE;
|
||||||
else if (joystate.lX > joystick_neutral_x + 10000)
|
else if (joystick_x > joystick_neutral_x + 10000)
|
||||||
status->bRight = TRUE;
|
status->bRight = TRUE;
|
||||||
|
|
||||||
if (joystate.lY < joystick_neutral_y - 10000)
|
const Sint16 joystick_y = SDL_JoystickGetAxis(joystick, 0);
|
||||||
|
if (joystick_y < joystick_neutral_y - 10000)
|
||||||
status->bUp = TRUE;
|
status->bUp = TRUE;
|
||||||
else if (joystate.lY > joystick_neutral_y + 10000)
|
else if (joystick_y > joystick_neutral_y + 10000)
|
||||||
status->bDown = TRUE;
|
status->bDown = TRUE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -190,25 +91,11 @@ BOOL GetJoystickStatus(JOYSTICK_STATUS *status)
|
||||||
|
|
||||||
BOOL ResetJoystickStatus(void)
|
BOOL ResetJoystickStatus(void)
|
||||||
{
|
{
|
||||||
DIJOYSTATE joystate;
|
|
||||||
|
|
||||||
if (joystick == NULL)
|
if (joystick == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (joystick->Poll())
|
joystick_neutral_x = SDL_JoystickGetAxis(joystick, 0);
|
||||||
return FALSE;
|
joystick_neutral_y = SDL_JoystickGetAxis(joystick, 1);
|
||||||
|
|
||||||
HRESULT res = joystick->GetDeviceState(sizeof(DIJOYSTATE), &joystate);
|
|
||||||
if (res)
|
|
||||||
{
|
|
||||||
if (res == DIERR_INPUTLOST)
|
|
||||||
SetDeviceAquire(0);
|
|
||||||
else
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
joystick_neutral_x = joystate.lX;
|
|
||||||
joystick_neutral_y = joystate.lY;
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,6 @@ struct JOYSTICK_STATUS
|
||||||
};
|
};
|
||||||
|
|
||||||
void ReleaseDirectInput(void);
|
void ReleaseDirectInput(void);
|
||||||
BOOL InitDirectInput(HINSTANCE hinst, HWND hWnd);
|
BOOL InitDirectInput(void);
|
||||||
BOOL GetJoystickStatus(JOYSTICK_STATUS *status);
|
BOOL GetJoystickStatus(JOYSTICK_STATUS *status);
|
||||||
BOOL ResetJoystickStatus(void);
|
BOOL ResetJoystickStatus(void);
|
||||||
|
|
|
@ -326,7 +326,7 @@ int main(int argc, char *argv[])
|
||||||
InitDirectSound(hWnd);
|
InitDirectSound(hWnd);
|
||||||
|
|
||||||
// Initialize joystick
|
// Initialize joystick
|
||||||
if (conf.bJoystick && InitDirectInput(info.info.win.hinstance, hWnd))
|
if (conf.bJoystick && InitDirectInput())
|
||||||
{
|
{
|
||||||
ResetJoystickStatus();
|
ResetJoystickStatus();
|
||||||
gbUseJoystick = TRUE;
|
gbUseJoystick = TRUE;
|
||||||
|
|
Loading…
Add table
Reference in a new issue