mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-05-28 20:09:38 +08:00
Refactored GameInput initialization
This commit is contained in:
@@ -425,6 +425,7 @@
|
|||||||
<ClInclude Include="..\..\src\camera\SDL_syscamera.h" />
|
<ClInclude Include="..\..\src\camera\SDL_syscamera.h" />
|
||||||
<ClInclude Include="..\..\src\core\gdk\SDL_gdk.h" />
|
<ClInclude Include="..\..\src\core\gdk\SDL_gdk.h" />
|
||||||
<ClInclude Include="..\..\src\core\windows\SDL_directx.h" />
|
<ClInclude Include="..\..\src\core\windows\SDL_directx.h" />
|
||||||
|
<ClInclude Include="..\..\src\core\windows\SDL_gameinput.h" />
|
||||||
<ClInclude Include="..\..\src\core\windows\SDL_hid.h" />
|
<ClInclude Include="..\..\src\core\windows\SDL_hid.h" />
|
||||||
<ClInclude Include="..\..\src\core\windows\SDL_immdevice.h" />
|
<ClInclude Include="..\..\src\core\windows\SDL_immdevice.h" />
|
||||||
<ClInclude Include="..\..\src\core\windows\SDL_windows.h" />
|
<ClInclude Include="..\..\src\core\windows\SDL_windows.h" />
|
||||||
@@ -640,6 +641,7 @@
|
|||||||
<ClCompile Include="..\..\src\audio\SDL_wave.c" />
|
<ClCompile Include="..\..\src\audio\SDL_wave.c" />
|
||||||
<ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
|
<ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
|
||||||
<ClCompile Include="..\..\src\core\SDL_core_unsupported.c" />
|
<ClCompile Include="..\..\src\core\SDL_core_unsupported.c" />
|
||||||
|
<ClCompile Include="..\..\src\core\windows\SDL_gameinput.c"/>
|
||||||
<ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
|
<ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
|
||||||
<ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
|
<ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
|
||||||
<ClCompile Include="..\..\src\core\windows\SDL_windows.c" />
|
<ClCompile Include="..\..\src\core\windows\SDL_windows.c" />
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
<ClCompile Include="..\..\src\audio\SDL_wave.c" />
|
<ClCompile Include="..\..\src\audio\SDL_wave.c" />
|
||||||
<ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
|
<ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
|
||||||
<ClCompile Include="..\..\src\core\SDL_core_unsupported.c" />
|
<ClCompile Include="..\..\src\core\SDL_core_unsupported.c" />
|
||||||
|
<ClCompile Include="..\..\src\core\windows\SDL_gameinput.c" />
|
||||||
<ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
|
<ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
|
||||||
<ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
|
<ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
|
||||||
<ClCompile Include="..\..\src\core\windows\SDL_windows.c" />
|
<ClCompile Include="..\..\src\core\windows\SDL_windows.c" />
|
||||||
@@ -314,6 +315,7 @@
|
|||||||
<ClInclude Include="..\..\src\audio\wasapi\SDL_wasapi.h" />
|
<ClInclude Include="..\..\src\audio\wasapi\SDL_wasapi.h" />
|
||||||
<ClInclude Include="..\..\src\core\gdk\SDL_gdk.h" />
|
<ClInclude Include="..\..\src\core\gdk\SDL_gdk.h" />
|
||||||
<ClInclude Include="..\..\src\core\windows\SDL_directx.h" />
|
<ClInclude Include="..\..\src\core\windows\SDL_directx.h" />
|
||||||
|
<ClInclude Include="..\..\src\core\windows\SDL_gameinput.h" />
|
||||||
<ClInclude Include="..\..\src\core\windows\SDL_hid.h" />
|
<ClInclude Include="..\..\src\core\windows\SDL_hid.h" />
|
||||||
<ClInclude Include="..\..\src\core\windows\SDL_immdevice.h" />
|
<ClInclude Include="..\..\src\core\windows\SDL_immdevice.h" />
|
||||||
<ClInclude Include="..\..\src\core\windows\SDL_windows.h" />
|
<ClInclude Include="..\..\src\core\windows\SDL_windows.h" />
|
||||||
|
|||||||
@@ -336,6 +336,7 @@
|
|||||||
<ClInclude Include="..\..\src\camera\SDL_camera_c.h" />
|
<ClInclude Include="..\..\src\camera\SDL_camera_c.h" />
|
||||||
<ClInclude Include="..\..\src\camera\SDL_syscamera.h" />
|
<ClInclude Include="..\..\src\camera\SDL_syscamera.h" />
|
||||||
<ClInclude Include="..\..\src\core\windows\SDL_directx.h" />
|
<ClInclude Include="..\..\src\core\windows\SDL_directx.h" />
|
||||||
|
<ClInclude Include="..\..\src\core\windows\SDL_gameinput.h" />
|
||||||
<ClInclude Include="..\..\src\core\windows\SDL_hid.h" />
|
<ClInclude Include="..\..\src\core\windows\SDL_hid.h" />
|
||||||
<ClInclude Include="..\..\src\core\windows\SDL_immdevice.h" />
|
<ClInclude Include="..\..\src\core\windows\SDL_immdevice.h" />
|
||||||
<ClInclude Include="..\..\src\core\windows\SDL_windows.h" />
|
<ClInclude Include="..\..\src\core\windows\SDL_windows.h" />
|
||||||
@@ -538,6 +539,7 @@
|
|||||||
<ClCompile Include="..\..\src\audio\SDL_wave.c" />
|
<ClCompile Include="..\..\src\audio\SDL_wave.c" />
|
||||||
<ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
|
<ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
|
||||||
<ClCompile Include="..\..\src\core\SDL_core_unsupported.c" />
|
<ClCompile Include="..\..\src\core\SDL_core_unsupported.c" />
|
||||||
|
<ClCompile Include="..\..\src\core\windows\SDL_gameinput.c" />
|
||||||
<ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
|
<ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
|
||||||
<ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
|
<ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
|
||||||
<ClCompile Include="..\..\src\core\windows\SDL_windows.c" />
|
<ClCompile Include="..\..\src\core\windows\SDL_windows.c" />
|
||||||
|
|||||||
@@ -486,6 +486,12 @@
|
|||||||
<ClInclude Include="..\..\src\audio\SDL_audioresample.h">
|
<ClInclude Include="..\..\src\audio\SDL_audioresample.h">
|
||||||
<Filter>audio</Filter>
|
<Filter>audio</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\core\windows\SDL_directx.h">
|
||||||
|
<Filter>core\windows</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\core\windows\SDL_gameinput.h">
|
||||||
|
<Filter>core\windows</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\core\windows\SDL_hid.h">
|
<ClInclude Include="..\..\src\core\windows\SDL_hid.h">
|
||||||
<Filter>core\windows</Filter>
|
<Filter>core\windows</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -1028,6 +1034,9 @@
|
|||||||
<ClCompile Include="..\..\src\core\SDL_core_unsupported.c">
|
<ClCompile Include="..\..\src\core\SDL_core_unsupported.c">
|
||||||
<Filter>core</Filter>
|
<Filter>core</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\core\windows\SDL_gameinput.c">
|
||||||
|
<Filter>core\windows</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\core\windows\SDL_hid.c">
|
<ClCompile Include="..\..\src\core\windows\SDL_hid.c">
|
||||||
<Filter>core\windows</Filter>
|
<Filter>core\windows</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|||||||
@@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
#include "SDL_internal.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_GAMEINPUT_H
|
||||||
|
|
||||||
|
#include "SDL_windows.h"
|
||||||
|
#include "SDL_gameinput.h"
|
||||||
|
|
||||||
|
#ifdef SDL_PLATFORM_WIN32
|
||||||
|
#include <initguid.h>
|
||||||
|
// {11BE2A7E-4254-445A-9C09-FFC40F006918}
|
||||||
|
DEFINE_GUID(SDL_IID_GameInput, 0x11BE2A7E, 0x4254, 0x445A, 0x9C, 0x09, 0xFF, 0xC4, 0x0F, 0x00, 0x69, 0x18);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static SDL_SharedObject *g_hGameInputDLL;
|
||||||
|
static IGameInput *g_pGameInput;
|
||||||
|
static int g_nGameInputRefCount;
|
||||||
|
|
||||||
|
bool SDL_InitGameInput(IGameInput **ppGameInput)
|
||||||
|
{
|
||||||
|
if (g_nGameInputRefCount == 0) {
|
||||||
|
g_hGameInputDLL = SDL_LoadObject("gameinput.dll");
|
||||||
|
if (!g_hGameInputDLL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef HRESULT (WINAPI *GameInputCreate_t)(IGameInput * *gameInput);
|
||||||
|
GameInputCreate_t GameInputCreateFunc = (GameInputCreate_t)SDL_LoadFunction(g_hGameInputDLL, "GameInputCreate");
|
||||||
|
if (!GameInputCreateFunc) {
|
||||||
|
SDL_UnloadObject(g_hGameInputDLL);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
IGameInput *pGameInput = NULL;
|
||||||
|
HRESULT hr = GameInputCreateFunc(&pGameInput);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
SDL_UnloadObject(g_hGameInputDLL);
|
||||||
|
return WIN_SetErrorFromHRESULT("GameInputCreate failed", hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef SDL_PLATFORM_WIN32
|
||||||
|
hr = IGameInput_QueryInterface(pGameInput, &SDL_IID_GameInput, (void **)&g_pGameInput);
|
||||||
|
IGameInput_Release(pGameInput);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
SDL_UnloadObject(g_hGameInputDLL);
|
||||||
|
return WIN_SetErrorFromHRESULT("GameInput QueryInterface failed", hr);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// Assume that the version we get is compatible with the current SDK
|
||||||
|
// If that isn't the case, define the correct GUID for SDL_IID_GameInput above
|
||||||
|
g_pGameInput = pGameInput;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
++g_nGameInputRefCount;
|
||||||
|
|
||||||
|
if (ppGameInput) {
|
||||||
|
*ppGameInput = g_pGameInput;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDL_QuitGameInput(void)
|
||||||
|
{
|
||||||
|
SDL_assert(g_nGameInputRefCount > 0);
|
||||||
|
|
||||||
|
--g_nGameInputRefCount;
|
||||||
|
if (g_nGameInputRefCount == 0) {
|
||||||
|
if (g_pGameInput) {
|
||||||
|
IGameInput_Release(g_pGameInput);
|
||||||
|
g_pGameInput = NULL;
|
||||||
|
}
|
||||||
|
if (g_hGameInputDLL) {
|
||||||
|
SDL_UnloadObject(g_hGameInputDLL);
|
||||||
|
g_hGameInputDLL = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // HAVE_GAMEINPUT_H
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
#include "SDL_internal.h"
|
||||||
|
|
||||||
|
#ifndef SDL_gameinput_h_
|
||||||
|
#define SDL_gameinput_h_
|
||||||
|
|
||||||
|
#ifdef HAVE_GAMEINPUT_H
|
||||||
|
|
||||||
|
#define COBJMACROS
|
||||||
|
#include <gameinput.h>
|
||||||
|
|
||||||
|
extern bool SDL_InitGameInput(IGameInput **ppGameInput);
|
||||||
|
extern void SDL_QuitGameInput(void);
|
||||||
|
|
||||||
|
#endif // HAVE_GAMEINPUT_H
|
||||||
|
|
||||||
|
#endif // SDL_gameinput_h_
|
||||||
@@ -24,9 +24,7 @@
|
|||||||
|
|
||||||
#include "../SDL_sysjoystick.h"
|
#include "../SDL_sysjoystick.h"
|
||||||
#include "../usb_ids.h"
|
#include "../usb_ids.h"
|
||||||
|
#include "../../core/windows/SDL_gameinput.h"
|
||||||
#define COBJMACROS
|
|
||||||
#include <gameinput.h>
|
|
||||||
|
|
||||||
// Default value for SDL_HINT_JOYSTICK_GAMEINPUT
|
// Default value for SDL_HINT_JOYSTICK_GAMEINPUT
|
||||||
#if defined(SDL_PLATFORM_GDK)
|
#if defined(SDL_PLATFORM_GDK)
|
||||||
@@ -67,12 +65,10 @@ typedef struct joystick_hwdata
|
|||||||
} GAMEINPUT_InternalJoystickHwdata;
|
} GAMEINPUT_InternalJoystickHwdata;
|
||||||
|
|
||||||
static GAMEINPUT_InternalList g_GameInputList = { NULL };
|
static GAMEINPUT_InternalList g_GameInputList = { NULL };
|
||||||
static SDL_SharedObject *g_hGameInputDLL = NULL;
|
|
||||||
static IGameInput *g_pGameInput = NULL;
|
static IGameInput *g_pGameInput = NULL;
|
||||||
static GameInputCallbackToken g_GameInputCallbackToken = GAMEINPUT_INVALID_CALLBACK_TOKEN_VALUE;
|
static GameInputCallbackToken g_GameInputCallbackToken = GAMEINPUT_INVALID_CALLBACK_TOKEN_VALUE;
|
||||||
static Uint64 g_GameInputTimestampOffset;
|
static Uint64 g_GameInputTimestampOffset;
|
||||||
|
|
||||||
|
|
||||||
static bool GAMEINPUT_InternalIsGamepad(const GameInputDeviceInfo *info)
|
static bool GAMEINPUT_InternalIsGamepad(const GameInputDeviceInfo *info)
|
||||||
{
|
{
|
||||||
if (info->supportedInput & GameInputKindGamepad) {
|
if (info->supportedInput & GameInputKindGamepad) {
|
||||||
@@ -245,24 +241,8 @@ static bool GAMEINPUT_JoystickInit(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_hGameInputDLL) {
|
if (!SDL_InitGameInput(&g_pGameInput)) {
|
||||||
g_hGameInputDLL = SDL_LoadObject("gameinput.dll");
|
return false;
|
||||||
if (!g_hGameInputDLL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!g_pGameInput) {
|
|
||||||
typedef HRESULT (WINAPI *GameInputCreate_t)(IGameInput * *gameInput);
|
|
||||||
GameInputCreate_t GameInputCreateFunc = (GameInputCreate_t)SDL_LoadFunction(g_hGameInputDLL, "GameInputCreate");
|
|
||||||
if (!GameInputCreateFunc) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
hR = GameInputCreateFunc(&g_pGameInput);
|
|
||||||
if (FAILED(hR)) {
|
|
||||||
return SDL_SetError("GameInputCreate failure with HRESULT of %08lX", hR);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hR = IGameInput_RegisterDeviceCallback(g_pGameInput,
|
hR = IGameInput_RegisterDeviceCallback(g_pGameInput,
|
||||||
@@ -689,14 +669,9 @@ static void GAMEINPUT_JoystickQuit(void)
|
|||||||
GAMEINPUT_InternalRemoveByIndex(0);
|
GAMEINPUT_InternalRemoveByIndex(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
IGameInput_Release(g_pGameInput);
|
SDL_QuitGameInput();
|
||||||
g_pGameInput = NULL;
|
g_pGameInput = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_hGameInputDLL) {
|
|
||||||
SDL_UnloadObject(g_hGameInputDLL);
|
|
||||||
g_hGameInputDLL = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool GAMEINPUT_JoystickGetGamepadMapping(int device_index, SDL_GamepadMapping *out)
|
static bool GAMEINPUT_JoystickGetGamepadMapping(int device_index, SDL_GamepadMapping *out)
|
||||||
|
|||||||
@@ -27,9 +27,7 @@
|
|||||||
|
|
||||||
#ifdef HAVE_GAMEINPUT_H
|
#ifdef HAVE_GAMEINPUT_H
|
||||||
|
|
||||||
#define COBJMACROS
|
#include "../../core/windows/SDL_gameinput.h"
|
||||||
#include <gameinput.h>
|
|
||||||
|
|
||||||
#include "../../events/SDL_mouse_c.h"
|
#include "../../events/SDL_mouse_c.h"
|
||||||
#include "../../events/SDL_keyboard_c.h"
|
#include "../../events/SDL_keyboard_c.h"
|
||||||
#include "../../events/scancodes_windows.h"
|
#include "../../events/scancodes_windows.h"
|
||||||
@@ -61,7 +59,6 @@ typedef struct GAMEINPUT_Device
|
|||||||
|
|
||||||
struct WIN_GameInputData
|
struct WIN_GameInputData
|
||||||
{
|
{
|
||||||
void *hGameInputDLL;
|
|
||||||
IGameInput *pGameInput;
|
IGameInput *pGameInput;
|
||||||
GameInputCallbackToken gameinput_callback_token;
|
GameInputCallbackToken gameinput_callback_token;
|
||||||
int num_devices;
|
int num_devices;
|
||||||
@@ -237,20 +234,7 @@ bool WIN_InitGameInput(SDL_VideoDevice *_this)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
data->hGameInputDLL = SDL_LoadObject("gameinput.dll");
|
if (!SDL_InitGameInput(&data->pGameInput)) {
|
||||||
if (!data->hGameInputDLL) {
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef HRESULT (WINAPI *GameInputCreate_t)(IGameInput * *gameInput);
|
|
||||||
GameInputCreate_t GameInputCreateFunc = (GameInputCreate_t)SDL_LoadFunction(data->hGameInputDLL, "GameInputCreate");
|
|
||||||
if (!GameInputCreateFunc) {
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr = GameInputCreateFunc(&data->pGameInput);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
SDL_SetError("GameInputCreate failure with HRESULT of %08X", hr);
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -587,9 +571,9 @@ void WIN_QuitGameInput(SDL_VideoDevice *_this)
|
|||||||
data->pGameInput = NULL;
|
data->pGameInput = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->hGameInputDLL) {
|
if (data->pGameInput) {
|
||||||
SDL_UnloadObject(data->hGameInputDLL);
|
SDL_QuitGameInput();
|
||||||
data->hGameInputDLL = NULL;
|
data->pGameInput = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->lock) {
|
if (data->lock) {
|
||||||
|
|||||||
Reference in New Issue
Block a user