Updated to GameInput v1.1

The biggest change is that the C API is no longer available.

Here are more details:
https://www.nuget.org/packages/Microsoft.GameInput

Fixes https://github.com/libsdl-org/SDL/issues/12802
This commit is contained in:
Sam Lantinga
2025-04-11 11:58:12 -07:00
parent f35a2736b7
commit 8a57c83ff9
12 changed files with 202 additions and 133 deletions

View File

@@ -381,9 +381,11 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDeta
match spec.msvc_arch: match spec.msvc_arch:
case MsvcArch.X86: case MsvcArch.X86:
job.cflags.append("/clang:-m32") job.cflags.append("/clang:-m32")
job.cxxflags.append("/clang:-m32")
job.ldflags.append("/MACHINE:X86") job.ldflags.append("/MACHINE:X86")
case MsvcArch.X64: case MsvcArch.X64:
job.cflags.append("/clang:-m64") job.cflags.append("/clang:-m64")
job.cxxflags.append("/clang:-m64")
job.ldflags.append("/MACHINE:X64") job.ldflags.append("/MACHINE:X64")
case _: case _:
raise ValueError(f"Unsupported clang-cl architecture (arch={spec.msvc_arch})") raise ValueError(f"Unsupported clang-cl architecture (arch={spec.msvc_arch})")

View File

@@ -1893,11 +1893,13 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
set (USE_POSIX_SPAWN 1) set (USE_POSIX_SPAWN 1)
endif() endif()
elseif(WINDOWS) elseif(WINDOWS)
enable_language(CXX)
check_c_source_compiles(" check_c_source_compiles("
#include <windows.h> #include <windows.h>
int main(int argc, char **argv) { return 0; }" HAVE_WIN32_CC) int main(int argc, char **argv) { return 0; }" HAVE_WIN32_CC)
sdl_glob_sources("${SDL3_SOURCE_DIR}/src/core/windows/*.c") sdl_glob_sources("${SDL3_SOURCE_DIR}/src/core/windows/*.c")
sdl_glob_sources("${SDL3_SOURCE_DIR}/src/core/windows/*.cpp")
sdl_glob_sources("${SDL3_SOURCE_DIR}/src/main/windows/*.c") sdl_glob_sources("${SDL3_SOURCE_DIR}/src/main/windows/*.c")
sdl_glob_sources("${SDL3_SOURCE_DIR}/src/io/windows/*.c") sdl_glob_sources("${SDL3_SOURCE_DIR}/src/io/windows/*.c")
@@ -2008,6 +2010,7 @@ elseif(WINDOWS)
if(SDL_VIDEO) if(SDL_VIDEO)
set(SDL_VIDEO_DRIVER_WINDOWS 1) set(SDL_VIDEO_DRIVER_WINDOWS 1)
sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/windows/*.c") sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/windows/*.c")
sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/windows/*.cpp")
CheckOpenVR() CheckOpenVR()
@@ -2135,7 +2138,7 @@ elseif(WINDOWS)
set(SDL_JOYSTICK_WGI 1) set(SDL_JOYSTICK_WGI 1)
endif() endif()
if(HAVE_GAMEINPUT_H) if(HAVE_GAMEINPUT_H)
sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/gdk/*.c") sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/gdk/*.cpp")
set(SDL_JOYSTICK_GAMEINPUT 1) set(SDL_JOYSTICK_GAMEINPUT 1)
endif() endif()
set(HAVE_SDL_JOYSTICK TRUE) set(HAVE_SDL_JOYSTICK TRUE)

View File

@@ -645,7 +645,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_gameinput.cpp"/>
<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" />
@@ -710,7 +710,7 @@
<ClCompile Include="..\..\src\hidapi\SDL_hidapi.c" /> <ClCompile Include="..\..\src\hidapi\SDL_hidapi.c" />
<ClCompile Include="..\..\src\joystick\controller_type.c" /> <ClCompile Include="..\..\src\joystick\controller_type.c" />
<ClCompile Include="..\..\src\joystick\dummy\SDL_sysjoystick.c" /> <ClCompile Include="..\..\src\joystick\dummy\SDL_sysjoystick.c" />
<ClCompile Include="..\..\src\joystick\gdk\SDL_gameinputjoystick.c" /> <ClCompile Include="..\..\src\joystick\gdk\SDL_gameinputjoystick.cpp" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapijoystick.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapijoystick.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_8bitdo.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_8bitdo.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_combined.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_combined.c" />
@@ -891,7 +891,7 @@
<ClCompile Include="..\..\src\video\windows\SDL_windowsevents.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsevents.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowsframebuffer.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsframebuffer.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowskeyboard.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowskeyboard.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowsgameinput.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsgameinput.cpp" />
<ClCompile Include="..\..\src\video\windows\SDL_windowsmessagebox.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsmessagebox.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowsmodes.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsmodes.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowsmouse.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsmouse.c" />

View File

@@ -27,7 +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_gameinput.cpp" />
<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" />
@@ -61,7 +61,7 @@
<ClCompile Include="..\..\src\hidapi\SDL_hidapi.c" /> <ClCompile Include="..\..\src\hidapi\SDL_hidapi.c" />
<ClCompile Include="..\..\src\joystick\controller_type.c" /> <ClCompile Include="..\..\src\joystick\controller_type.c" />
<ClCompile Include="..\..\src\joystick\dummy\SDL_sysjoystick.c" /> <ClCompile Include="..\..\src\joystick\dummy\SDL_sysjoystick.c" />
<ClCompile Include="..\..\src\joystick\gdk\SDL_gameinputjoystick.c" /> <ClCompile Include="..\..\src\joystick\gdk\SDL_gameinputjoystick.cpp" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapijoystick.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapijoystick.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_8bitdo.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_8bitdo.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_combined.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_combined.c" />
@@ -193,7 +193,7 @@
<ClCompile Include="..\..\src\video\windows\SDL_windowsevents.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsevents.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowsframebuffer.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsframebuffer.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowskeyboard.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowskeyboard.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowsgameinput.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsgameinput.cpp" />
<ClCompile Include="..\..\src\video\windows\SDL_windowsmessagebox.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsmessagebox.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowsmodes.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsmodes.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowsmouse.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsmouse.c" />

View File

@@ -424,6 +424,16 @@
<ClCompile Include="..\..\src\camera\dummy\SDL_camera_dummy.c" /> <ClCompile Include="..\..\src\camera\dummy\SDL_camera_dummy.c" />
<ClCompile Include="..\..\src\camera\mediafoundation\SDL_camera_mediafoundation.c" /> <ClCompile Include="..\..\src\camera\mediafoundation\SDL_camera_mediafoundation.c" />
<ClCompile Include="..\..\src\camera\SDL_camera.c" /> <ClCompile Include="..\..\src\camera\SDL_camera.c" />
<ClCompile Include="..\..\src\core\windows\pch_cpp.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
</ClCompile>
<ClCompile Include="..\..\src\dialog\SDL_dialog.c" /> <ClCompile Include="..\..\src\dialog\SDL_dialog.c" />
<ClCompile Include="..\..\src\dialog\SDL_dialog_utils.c" /> <ClCompile Include="..\..\src\dialog\SDL_dialog_utils.c" />
<ClCompile Include="..\..\src\filesystem\SDL_filesystem.c" /> <ClCompile Include="..\..\src\filesystem\SDL_filesystem.c" />
@@ -543,7 +553,12 @@
<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_gameinput.cpp">
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
</ClCompile>
<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" />
@@ -580,7 +595,12 @@
<ClCompile Include="..\..\src\hidapi\SDL_hidapi.c" /> <ClCompile Include="..\..\src\hidapi\SDL_hidapi.c" />
<ClCompile Include="..\..\src\joystick\controller_type.c" /> <ClCompile Include="..\..\src\joystick\controller_type.c" />
<ClCompile Include="..\..\src\joystick\dummy\SDL_sysjoystick.c" /> <ClCompile Include="..\..\src\joystick\dummy\SDL_sysjoystick.c" />
<ClCompile Include="..\..\src\joystick\gdk\SDL_gameinputjoystick.c" /> <ClCompile Include="..\..\src\joystick\gdk\SDL_gameinputjoystick.cpp">
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
</ClCompile>
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapijoystick.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapijoystick.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_8bitdo.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_8bitdo.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_combined.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_combined.c" />
@@ -726,7 +746,12 @@
<ClCompile Include="..\..\src\video\windows\SDL_windowsevents.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsevents.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowsframebuffer.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsframebuffer.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowskeyboard.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowskeyboard.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowsgameinput.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsgameinput.cpp">
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)$(TargetName)_cpp.pch</PrecompiledHeaderOutputFile>
</ClCompile>
<ClCompile Include="..\..\src\video\windows\SDL_windowsmessagebox.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsmessagebox.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowsmodes.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsmodes.c" />
<ClCompile Include="..\..\src\video\windows\SDL_windowsmouse.c" /> <ClCompile Include="..\..\src\video\windows\SDL_windowsmouse.c" />

View File

@@ -537,9 +537,6 @@
<ClInclude Include="..\..\src\events\SDL_events_c.h"> <ClInclude Include="..\..\src\events\SDL_events_c.h">
<Filter>events</Filter> <Filter>events</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\src\events\SDL_eventfilter_c.h">
<Filter>events</Filter>
</ClInclude>
<ClInclude Include="..\..\src\events\SDL_keyboard_c.h"> <ClInclude Include="..\..\src\events\SDL_keyboard_c.h">
<Filter>events</Filter> <Filter>events</Filter>
</ClInclude> </ClInclude>
@@ -962,6 +959,7 @@
<ClInclude Include="..\..\include\SDL3\SDL_storage.h" /> <ClInclude Include="..\..\include\SDL3\SDL_storage.h" />
<ClInclude Include="..\..\include\SDL3\SDL_time.h" /> <ClInclude Include="..\..\include\SDL3\SDL_time.h" />
<ClInclude Include="..\..\src\events\SDL_categories_c.h" /> <ClInclude Include="..\..\src\events\SDL_categories_c.h" />
<ClInclude Include="..\..\src\events\SDL_eventwatch_c.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" /> <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
@@ -1049,7 +1047,7 @@
<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"> <ClCompile Include="..\..\src\core\windows\SDL_gameinput.cpp">
<Filter>core\windows</Filter> <Filter>core\windows</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\core\windows\SDL_hid.c"> <ClCompile Include="..\..\src\core\windows\SDL_hid.c">
@@ -1088,9 +1086,6 @@
<ClCompile Include="..\..\src\events\SDL_events.c"> <ClCompile Include="..\..\src\events\SDL_events.c">
<Filter>events</Filter> <Filter>events</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\events\SDL_eventfilter.c">
<Filter>events</Filter>
</ClCompile>
<ClCompile Include="..\..\src\events\SDL_keyboard.c"> <ClCompile Include="..\..\src\events\SDL_keyboard.c">
<Filter>events</Filter> <Filter>events</Filter>
</ClCompile> </ClCompile>
@@ -1184,7 +1179,7 @@
<ClCompile Include="..\..\src\joystick\dummy\SDL_sysjoystick.c"> <ClCompile Include="..\..\src\joystick\dummy\SDL_sysjoystick.c">
<Filter>joystick\dummy</Filter> <Filter>joystick\dummy</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\joystick\gdk\SDL_gameinputjoystick.c"> <ClCompile Include="..\..\src\joystick\gdk\SDL_gameinputjoystick.cpp">
<Filter>joystick\gdk</Filter> <Filter>joystick\gdk</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_8bitdo.c"> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_8bitdo.c">
@@ -1367,7 +1362,7 @@
<ClCompile Include="..\..\src\video\windows\SDL_windowskeyboard.c"> <ClCompile Include="..\..\src\video\windows\SDL_windowskeyboard.c">
<Filter>video\windows</Filter> <Filter>video\windows</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\video\windows\SDL_windowsgameinput.c"> <ClCompile Include="..\..\src\video\windows\SDL_windowsgameinput.cpp">
<Filter>video\windows</Filter> <Filter>video\windows</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\video\windows\SDL_windowsmessagebox.c"> <ClCompile Include="..\..\src\video\windows\SDL_windowsmessagebox.c">
@@ -1606,11 +1601,12 @@
<ClCompile Include="..\..\src\storage\generic\SDL_genericstorage.c" /> <ClCompile Include="..\..\src\storage\generic\SDL_genericstorage.c" />
<ClCompile Include="..\..\src\storage\steam\SDL_steamstorage.c" /> <ClCompile Include="..\..\src\storage\steam\SDL_steamstorage.c" />
<ClCompile Include="..\..\src\storage\SDL_storage.c" /> <ClCompile Include="..\..\src\storage\SDL_storage.c" />
<ClCompile Include="..\..\src\events\SDL_eventwatch.c" />
<ClCompile Include="..\..\src\core\windows\pch_cpp.cpp">
<Filter>core\windows</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="..\..\src\core\windows\version.rc" /> <ResourceCompile Include="..\..\src\core\windows\version.rc" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<MASM Include="..\..\src\stdlib\SDL_mslibc_x64.masm" />
</ItemGroup>
</Project> </Project>

View File

@@ -25,16 +25,11 @@
#include "SDL_windows.h" #include "SDL_windows.h"
#include "SDL_gameinput.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 SDL_SharedObject *g_hGameInputDLL;
static IGameInput *g_pGameInput; static IGameInput *g_pGameInput;
static int g_nGameInputRefCount; static int g_nGameInputRefCount;
bool SDL_InitGameInput(IGameInput **ppGameInput) bool SDL_InitGameInput(IGameInput **ppGameInput)
{ {
if (g_nGameInputRefCount == 0) { if (g_nGameInputRefCount == 0) {
@@ -43,7 +38,7 @@ bool SDL_InitGameInput(IGameInput **ppGameInput)
return false; return false;
} }
typedef HRESULT (WINAPI *GameInputCreate_t)(IGameInput * *gameInput); typedef HRESULT (WINAPI *GameInputCreate_t)(IGameInput **gameInput);
GameInputCreate_t GameInputCreateFunc = (GameInputCreate_t)SDL_LoadFunction(g_hGameInputDLL, "GameInputCreate"); GameInputCreate_t GameInputCreateFunc = (GameInputCreate_t)SDL_LoadFunction(g_hGameInputDLL, "GameInputCreate");
if (!GameInputCreateFunc) { if (!GameInputCreateFunc) {
SDL_UnloadObject(g_hGameInputDLL); SDL_UnloadObject(g_hGameInputDLL);
@@ -58,15 +53,19 @@ bool SDL_InitGameInput(IGameInput **ppGameInput)
} }
#ifdef SDL_PLATFORM_WIN32 #ifdef SDL_PLATFORM_WIN32
hr = IGameInput_QueryInterface(pGameInput, &SDL_IID_GameInput, (void **)&g_pGameInput); #if GAMEINPUT_API_VERSION >= 1
IGameInput_Release(pGameInput); hr = pGameInput->QueryInterface(IID_IGameInput, (void **)&g_pGameInput);
#else
// We require GameInput v1.1 or newer
hr = E_NOINTERFACE;
#endif
pGameInput->Release();
if (FAILED(hr)) { if (FAILED(hr)) {
SDL_UnloadObject(g_hGameInputDLL); SDL_UnloadObject(g_hGameInputDLL);
return WIN_SetErrorFromHRESULT("GameInput QueryInterface failed", hr); return WIN_SetErrorFromHRESULT("GameInput QueryInterface failed", hr);
} }
#else #else
// Assume that the version we get is compatible with the current SDK // 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; g_pGameInput = pGameInput;
#endif #endif
} }
@@ -85,7 +84,7 @@ void SDL_QuitGameInput(void)
--g_nGameInputRefCount; --g_nGameInputRefCount;
if (g_nGameInputRefCount == 0) { if (g_nGameInputRefCount == 0) {
if (g_pGameInput) { if (g_pGameInput) {
IGameInput_Release(g_pGameInput); g_pGameInput->Release();
g_pGameInput = NULL; g_pGameInput = NULL;
} }
if (g_hGameInputDLL) { if (g_hGameInputDLL) {

View File

@@ -25,9 +25,16 @@
#ifdef HAVE_GAMEINPUT_H #ifdef HAVE_GAMEINPUT_H
#define COBJMACROS
#include <gameinput.h> #include <gameinput.h>
#ifndef GAMEINPUT_API_VERSION
#define GAMEINPUT_API_VERSION 0
#endif
#if GAMEINPUT_API_VERSION == 1
using namespace GameInput::v1;
#endif
extern bool SDL_InitGameInput(IGameInput **ppGameInput); extern bool SDL_InitGameInput(IGameInput **ppGameInput);
extern void SDL_QuitGameInput(void); extern void SDL_QuitGameInput(void);

View File

@@ -24,6 +24,7 @@
#include "../SDL_sysjoystick.h" #include "../SDL_sysjoystick.h"
#include "../usb_ids.h" #include "../usb_ids.h"
#include "../../core/windows/SDL_windows.h"
#include "../../core/windows/SDL_gameinput.h" #include "../../core/windows/SDL_gameinput.h"
// Default value for SDL_HINT_JOYSTICK_GAMEINPUT // Default value for SDL_HINT_JOYSTICK_GAMEINPUT
@@ -66,7 +67,7 @@ typedef struct joystick_hwdata
static GAMEINPUT_InternalList g_GameInputList = { NULL }; static GAMEINPUT_InternalList g_GameInputList = { NULL };
static IGameInput *g_pGameInput = NULL; static IGameInput *g_pGameInput = NULL;
static GameInputCallbackToken g_GameInputCallbackToken = GAMEINPUT_INVALID_CALLBACK_TOKEN_VALUE; static GameInputCallbackToken g_GameInputCallbackToken = 0;
static Uint64 g_GameInputTimestampOffset; static Uint64 g_GameInputTimestampOffset;
static bool GAMEINPUT_InternalIsGamepad(const GameInputDeviceInfo *info) static bool GAMEINPUT_InternalIsGamepad(const GameInputDeviceInfo *info)
@@ -93,15 +94,22 @@ static bool GAMEINPUT_InternalAddOrFind(IGameInputDevice *pDevice)
SDL_AssertJoysticksLocked(); SDL_AssertJoysticksLocked();
info = IGameInputDevice_GetDeviceInfo(pDevice); #if GAMEINPUT_API_VERSION >= 1
if (info->capabilities & GameInputDeviceCapabilityWireless) { HRESULT hr = pDevice->GetDeviceInfo(&info);
if (FAILED(hr)) {
return WIN_SetErrorFromHRESULT("IGameInputDevice::GetDeviceInfo", hr);
}
#else
info = pDevice->GetDeviceInfo();
#endif
if (false /*info->capabilities & GameInputDeviceCapabilityWireless*/) {
bus = SDL_HARDWARE_BUS_BLUETOOTH; bus = SDL_HARDWARE_BUS_BLUETOOTH;
} else { } else {
bus = SDL_HARDWARE_BUS_USB; bus = SDL_HARDWARE_BUS_USB;
} }
vendor = info->vendorId; vendor = info->vendorId;
product = info->productId; product = info->productId;
version = (info->firmwareVersion.major << 8) | info->firmwareVersion.minor; //version = (info->firmwareVersion.major << 8) | info->firmwareVersion.minor;
if (SDL_JoystickHandledByAnotherDriver(&SDL_GAMEINPUT_JoystickDriver, vendor, product, version, "")) { if (SDL_JoystickHandledByAnotherDriver(&SDL_GAMEINPUT_JoystickDriver, vendor, product, version, "")) {
return true; return true;
@@ -130,18 +138,20 @@ static bool GAMEINPUT_InternalAddOrFind(IGameInputDevice *pDevice)
// Generate a device path // Generate a device path
for (idx = 0; idx < APP_LOCAL_DEVICE_ID_SIZE; ++idx) { for (idx = 0; idx < APP_LOCAL_DEVICE_ID_SIZE; ++idx) {
SDL_snprintf(tmp, SDL_arraysize(tmp), "%02hhX", info->deviceId.value[idx]); SDL_snprintf(tmp, SDL_arraysize(tmp), "%02hhX", info->deviceId.value[idx]);
SDL_strlcat(elem->path, tmp, SDL_arraysize(tmp)); SDL_strlcat(elem->path, tmp, SDL_arraysize(elem->path));
}
if (info->deviceStrings) {
// In theory we could get the manufacturer and product strings here, but they're NULL for all the controllers I've tested
} }
#if GAMEINPUT_API_VERSION >= 1
if (info->displayName) { if (info->displayName) {
// This could give us a product string, but it's NULL for all the controllers I've tested product_string = info->displayName;
} }
#else
if (info->displayName) {
product_string = info->displayName->data;
}
#endif
IGameInputDevice_AddRef(pDevice); pDevice->AddRef();
elem->device = pDevice; elem->device = pDevice;
elem->name = SDL_CreateJoystickName(vendor, product, manufacturer_string, product_string); elem->name = SDL_CreateJoystickName(vendor, product, manufacturer_string, product_string);
elem->guid = SDL_CreateJoystickGUID(bus, vendor, product, version, manufacturer_string, product_string, 'g', 0); elem->guid = SDL_CreateJoystickGUID(bus, vendor, product, version, manufacturer_string, product_string, 'g', 0);
@@ -168,7 +178,7 @@ static bool GAMEINPUT_InternalRemoveByIndex(int idx)
elem = g_GameInputList.devices[idx]; elem = g_GameInputList.devices[idx];
if (elem) { if (elem) {
IGameInputDevice_Release(elem->device); elem->device->Release();
SDL_free(elem->name); SDL_free(elem->name);
SDL_free(elem); SDL_free(elem);
} }
@@ -232,10 +242,11 @@ static void CALLBACK GAMEINPUT_InternalJoystickDeviceCallback(
} }
static void GAMEINPUT_JoystickDetect(void); static void GAMEINPUT_JoystickDetect(void);
static void GAMEINPUT_JoystickQuit(void);
static bool GAMEINPUT_JoystickInit(void) static bool GAMEINPUT_JoystickInit(void)
{ {
HRESULT hR; HRESULT hr;
if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_GAMEINPUT, SDL_GAMEINPUT_DEFAULT)) { if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_GAMEINPUT, SDL_GAMEINPUT_DEFAULT)) {
return true; return true;
@@ -245,21 +256,21 @@ static bool GAMEINPUT_JoystickInit(void)
return false; return false;
} }
hR = IGameInput_RegisterDeviceCallback(g_pGameInput, hr = g_pGameInput->RegisterDeviceCallback(NULL,
NULL,
GameInputKindController, GameInputKindController,
GameInputDeviceConnected, GameInputDeviceConnected,
GameInputBlockingEnumeration, GameInputBlockingEnumeration,
NULL, NULL,
GAMEINPUT_InternalJoystickDeviceCallback, GAMEINPUT_InternalJoystickDeviceCallback,
&g_GameInputCallbackToken); &g_GameInputCallbackToken);
if (FAILED(hR)) { if (FAILED(hr)) {
return SDL_SetError("IGameInput::RegisterDeviceCallback failure with HRESULT of %08lX", hR); GAMEINPUT_JoystickQuit();
return WIN_SetErrorFromHRESULT("IGameInput::RegisterDeviceCallback", hr);
} }
// Calculate the relative offset between SDL timestamps and GameInput timestamps // Calculate the relative offset between SDL timestamps and GameInput timestamps
Uint64 now = SDL_GetTicksNS(); Uint64 now = SDL_GetTicksNS();
uint64_t timestampUS = IGameInput_GetCurrentTimestamp(g_pGameInput); uint64_t timestampUS = g_pGameInput->GetCurrentTimestamp();
g_GameInputTimestampOffset = (SDL_NS_TO_US(now) - timestampUS); g_GameInputTimestampOffset = (SDL_NS_TO_US(now) - timestampUS);
GAMEINPUT_JoystickDetect(); GAMEINPUT_JoystickDetect();
@@ -292,7 +303,7 @@ static void GAMEINPUT_JoystickDetect(void)
elem->isAdded = true; elem->isAdded = true;
} }
if (elem->isDeleteRequested || !(IGameInputDevice_GetDeviceStatus(elem->device) & GameInputDeviceConnected)) { if (elem->isDeleteRequested || !(elem->device->GetDeviceStatus() & GameInputDeviceConnected)) {
SDL_PrivateJoystickRemoved(elem->device_instance); SDL_PrivateJoystickRemoved(elem->device_instance);
GAMEINPUT_InternalRemoveByIndex(idx--); GAMEINPUT_InternalRemoveByIndex(idx--);
} }
@@ -357,6 +368,7 @@ static SDL_JoystickID GAMEINPUT_JoystickGetDeviceInstanceID(int device_index)
static void GAMEINPUT_UpdatePowerInfo(SDL_Joystick *joystick, IGameInputDevice *device) static void GAMEINPUT_UpdatePowerInfo(SDL_Joystick *joystick, IGameInputDevice *device)
{ {
#if 0
GameInputBatteryState battery_state; GameInputBatteryState battery_state;
SDL_PowerState state; SDL_PowerState state;
int percent = 0; int percent = 0;
@@ -385,10 +397,10 @@ static void GAMEINPUT_UpdatePowerInfo(SDL_Joystick *joystick, IGameInputDevice *
percent = (int)SDL_roundf((battery_state.remainingCapacity / battery_state.fullChargeCapacity) * 100.0f); percent = (int)SDL_roundf((battery_state.remainingCapacity / battery_state.fullChargeCapacity) * 100.0f);
} }
SDL_SendJoystickPowerInfo(joystick, state, percent); SDL_SendJoystickPowerInfo(joystick, state, percent);
#endif
} }
#ifdef IGameInput_RegisterSystemButtonCallback #if GAMEINPUT_API_VERSION >= 1
static void CALLBACK GAMEINPUT_InternalSystemButtonCallback( static void CALLBACK GAMEINPUT_InternalSystemButtonCallback(
_In_ GameInputCallbackToken callbackToken, _In_ GameInputCallbackToken callbackToken,
_In_ void * context, _In_ void * context,
@@ -415,8 +427,7 @@ static void CALLBACK GAMEINPUT_InternalSystemButtonCallback(
SDL_UnlockJoysticks(); SDL_UnlockJoysticks();
} }
} }
#endif // GAMEINPUT_API_VERSION >= 1
#endif // IGameInput_RegisterSystemButtonCallback
static bool GAMEINPUT_JoystickOpen(SDL_Joystick *joystick, int device_index) static bool GAMEINPUT_JoystickOpen(SDL_Joystick *joystick, int device_index)
{ {
@@ -441,19 +452,15 @@ static bool GAMEINPUT_JoystickOpen(SDL_Joystick *joystick, int device_index)
joystick->nbuttons = 11; joystick->nbuttons = 11;
joystick->nhats = 1; joystick->nhats = 1;
#ifdef IGameInput_RegisterSystemButtonCallback #if GAMEINPUT_API_VERSION >= 1
if (info->supportedSystemButtons != GameInputSystemButtonNone) { if (info->supportedSystemButtons != GameInputSystemButtonNone) {
if (info->supportedSystemButtons & GameInputSystemButtonShare) { if (info->supportedSystemButtons & GameInputSystemButtonShare) {
++joystick->nbuttons; ++joystick->nbuttons;
} }
#if 1 // The C macro in GameInput.h version 10.0.26100 refers to a focus policy which I guess has been removed from the final API? g_pGameInput->RegisterSystemButtonCallback(elem->device, (GameInputSystemButtonGuide | GameInputSystemButtonShare), joystick, GAMEINPUT_InternalSystemButtonCallback, &hwdata->system_button_callback_token);
#undef IGameInput_RegisterSystemButtonCallback
#define IGameInput_RegisterSystemButtonCallback(This, device, buttonFilter, context, callbackFunc, callbackToken) ((This)->lpVtbl->RegisterSystemButtonCallback(This, device, buttonFilter, context, callbackFunc, callbackToken))
#endif
IGameInput_RegisterSystemButtonCallback(g_pGameInput, elem->device, (GameInputSystemButtonGuide | GameInputSystemButtonShare), joystick, GAMEINPUT_InternalSystemButtonCallback, &hwdata->system_button_callback_token);
} }
#endif // IGameInput_RegisterSystemButtonCallback #endif // GAMEINPUT_API_VERSION >= 1
} else { } else {
joystick->naxes = info->controllerAxisCount; joystick->naxes = info->controllerAxisCount;
joystick->nbuttons = info->controllerButtonCount; joystick->nbuttons = info->controllerButtonCount;
@@ -467,6 +474,7 @@ static bool GAMEINPUT_JoystickOpen(SDL_Joystick *joystick, int device_index)
SDL_SetBooleanProperty(SDL_GetJoystickProperties(joystick), SDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN, true); SDL_SetBooleanProperty(SDL_GetJoystickProperties(joystick), SDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN, true);
} }
#if 0
if (info->supportedInput & GameInputKindTouch) { if (info->supportedInput & GameInputKindTouch) {
SDL_PrivateJoystickAddTouchpad(joystick, info->touchPointCount); SDL_PrivateJoystickAddTouchpad(joystick, info->touchPointCount);
} }
@@ -482,6 +490,7 @@ static bool GAMEINPUT_JoystickOpen(SDL_Joystick *joystick, int device_index)
} else { } else {
joystick->connection_state = SDL_JOYSTICK_CONNECTION_WIRED; joystick->connection_state = SDL_JOYSTICK_CONNECTION_WIRED;
} }
#endif
return true; return true;
} }
@@ -492,7 +501,7 @@ static bool GAMEINPUT_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequenc
GameInputRumbleParams *params = &hwdata->rumbleParams; GameInputRumbleParams *params = &hwdata->rumbleParams;
params->lowFrequency = (float)low_frequency_rumble / (float)SDL_MAX_UINT16; params->lowFrequency = (float)low_frequency_rumble / (float)SDL_MAX_UINT16;
params->highFrequency = (float)high_frequency_rumble / (float)SDL_MAX_UINT16; params->highFrequency = (float)high_frequency_rumble / (float)SDL_MAX_UINT16;
IGameInputDevice_SetRumbleState(hwdata->devref->device, params); hwdata->devref->device->SetRumbleState(params);
return true; return true;
} }
@@ -503,7 +512,7 @@ static bool GAMEINPUT_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left
GameInputRumbleParams *params = &hwdata->rumbleParams; GameInputRumbleParams *params = &hwdata->rumbleParams;
params->leftTrigger = (float)left_rumble / (float)SDL_MAX_UINT16; params->leftTrigger = (float)left_rumble / (float)SDL_MAX_UINT16;
params->rightTrigger = (float)right_rumble / (float)SDL_MAX_UINT16; params->rightTrigger = (float)right_rumble / (float)SDL_MAX_UINT16;
IGameInputDevice_SetRumbleState(hwdata->devref->device, params); hwdata->devref->device->SetRumbleState(params);
return true; return true;
} }
@@ -531,15 +540,15 @@ static void GAMEINPUT_JoystickUpdate(SDL_Joystick *joystick)
IGameInputReading *reading = NULL; IGameInputReading *reading = NULL;
Uint64 timestamp; Uint64 timestamp;
GameInputGamepadState state; GameInputGamepadState state;
HRESULT hR; HRESULT hr;
hR = IGameInput_GetCurrentReading(g_pGameInput, info->supportedInput, device, &reading); hr = g_pGameInput->GetCurrentReading(info->supportedInput, device, &reading);
if (FAILED(hR)) { if (FAILED(hr)) {
// don't SetError here since there can be a legitimate case when there's no reading avail // don't SetError here since there can be a legitimate case when there's no reading avail
return; return;
} }
timestamp = SDL_US_TO_NS(IGameInputReading_GetTimestamp(reading) + g_GameInputTimestampOffset); timestamp = SDL_US_TO_NS(reading->GetTimestamp() + g_GameInputTimestampOffset);
if (GAMEINPUT_InternalIsGamepad(info)) { if (GAMEINPUT_InternalIsGamepad(info)) {
static WORD s_XInputButtons[] = { static WORD s_XInputButtons[] = {
@@ -557,7 +566,7 @@ static void GAMEINPUT_JoystickUpdate(SDL_Joystick *joystick)
}; };
Uint8 btnidx = 0, hat = 0; Uint8 btnidx = 0, hat = 0;
if (IGameInputReading_GetGamepadState(reading, &state)) { if (reading->GetGamepadState(&state)) {
for (btnidx = 0; btnidx < SDL_arraysize(s_XInputButtons); ++btnidx) { for (btnidx = 0; btnidx < SDL_arraysize(s_XInputButtons); ++btnidx) {
WORD button_mask = s_XInputButtons[btnidx]; WORD button_mask = s_XInputButtons[btnidx];
if (!button_mask) { if (!button_mask) {
@@ -599,7 +608,7 @@ static void GAMEINPUT_JoystickUpdate(SDL_Joystick *joystick)
if (button_state) { if (button_state) {
uint32_t i; uint32_t i;
uint32_t button_count = IGameInputReading_GetControllerButtonState(reading, info->controllerButtonCount, button_state); uint32_t button_count = reading->GetControllerButtonState(info->controllerButtonCount, button_state);
for (i = 0; i < button_count; ++i) { for (i = 0; i < button_count; ++i) {
SDL_SendJoystickButton(timestamp, joystick, (Uint8)i, button_state[i]); SDL_SendJoystickButton(timestamp, joystick, (Uint8)i, button_state[i]);
} }
@@ -609,7 +618,7 @@ static void GAMEINPUT_JoystickUpdate(SDL_Joystick *joystick)
#define CONVERT_AXIS(v) (Sint16)((v)*65535.0f - 32768.0f) #define CONVERT_AXIS(v) (Sint16)((v)*65535.0f - 32768.0f)
if (axis_state) { if (axis_state) {
uint32_t i; uint32_t i;
uint32_t axis_count = IGameInputReading_GetControllerAxisState(reading, info->controllerAxisCount, axis_state); uint32_t axis_count = reading->GetControllerAxisState(info->controllerAxisCount, axis_state);
for (i = 0; i < axis_count; ++i) { for (i = 0; i < axis_count; ++i) {
SDL_SendJoystickAxis(timestamp, joystick, (Uint8)i, CONVERT_AXIS(axis_state[i])); SDL_SendJoystickAxis(timestamp, joystick, (Uint8)i, CONVERT_AXIS(axis_state[i]));
} }
@@ -619,7 +628,7 @@ static void GAMEINPUT_JoystickUpdate(SDL_Joystick *joystick)
if (switch_state) { if (switch_state) {
uint32_t i; uint32_t i;
uint32_t switch_count = IGameInputReading_GetControllerSwitchState(reading, info->controllerSwitchCount, switch_state); uint32_t switch_count = reading->GetControllerSwitchState(info->controllerSwitchCount, switch_state);
for (i = 0; i < switch_count; ++i) { for (i = 0; i < switch_count; ++i) {
Uint8 hat; Uint8 hat;
switch (switch_state[i]) { switch (switch_state[i]) {
@@ -658,6 +667,7 @@ static void GAMEINPUT_JoystickUpdate(SDL_Joystick *joystick)
} }
} }
#if 0
if (info->supportedInput & GameInputKindTouch) { if (info->supportedInput & GameInputKindTouch) {
GameInputTouchState *touch_state = SDL_stack_alloc(GameInputTouchState, info->touchPointCount); GameInputTouchState *touch_state = SDL_stack_alloc(GameInputTouchState, info->touchPointCount);
if (touch_state) { if (touch_state) {
@@ -679,8 +689,9 @@ static void GAMEINPUT_JoystickUpdate(SDL_Joystick *joystick)
// FIXME: How do we interpret the motion data? // FIXME: How do we interpret the motion data?
} }
} }
#endif
IGameInputReading_Release(reading); reading->Release();
// FIXME: We can poll this at a much lower rate // FIXME: We can poll this at a much lower rate
GAMEINPUT_UpdatePowerInfo(joystick, device); GAMEINPUT_UpdatePowerInfo(joystick, device);
@@ -691,7 +702,11 @@ static void GAMEINPUT_JoystickClose(SDL_Joystick* joystick)
GAMEINPUT_InternalJoystickHwdata *hwdata = joystick->hwdata; GAMEINPUT_InternalJoystickHwdata *hwdata = joystick->hwdata;
if (hwdata->system_button_callback_token) { if (hwdata->system_button_callback_token) {
IGameInput_UnregisterCallback(g_pGameInput, hwdata->system_button_callback_token, 5000); #if GAMEINPUT_API_VERSION >= 1
g_pGameInput->UnregisterCallback(hwdata->system_button_callback_token);
#else
g_pGameInput->UnregisterCallback(hwdata->system_button_callback_token, 10000);
#endif
} }
SDL_free(hwdata); SDL_free(hwdata);
@@ -702,8 +717,14 @@ static void GAMEINPUT_JoystickQuit(void)
{ {
if (g_pGameInput) { if (g_pGameInput) {
// free the callback // free the callback
IGameInput_UnregisterCallback(g_pGameInput, g_GameInputCallbackToken, /*timeoutInUs:*/ 10000); if (g_GameInputCallbackToken) {
g_GameInputCallbackToken = GAMEINPUT_INVALID_CALLBACK_TOKEN_VALUE; #if GAMEINPUT_API_VERSION >= 1
g_pGameInput->UnregisterCallback(g_GameInputCallbackToken);
#else
g_pGameInput->UnregisterCallback(g_GameInputCallbackToken, 10000);
#endif
g_GameInputCallbackToken = 0;
}
// free the list // free the list
while (g_GameInputList.count > 0) { while (g_GameInputList.count > 0) {
@@ -738,7 +759,7 @@ static bool GAMEINPUT_JoystickGetGamepadMapping(int device_index, SDL_GamepadMap
out->back.kind = EMappingKind_Button; out->back.kind = EMappingKind_Button;
out->back.target = SDL_GAMEPAD_BUTTON_BACK; out->back.target = SDL_GAMEPAD_BUTTON_BACK;
#ifdef IGameInput_RegisterSystemButtonCallback #if GAMEINPUT_API_VERSION >= 1
if (elem->info->supportedSystemButtons & GameInputSystemButtonGuide) { if (elem->info->supportedSystemButtons & GameInputSystemButtonGuide) {
out->guide.kind = EMappingKind_Button; out->guide.kind = EMappingKind_Button;
out->guide.target = SDL_GAMEPAD_BUTTON_GUIDE; out->guide.target = SDL_GAMEPAD_BUTTON_GUIDE;
@@ -748,7 +769,7 @@ static bool GAMEINPUT_JoystickGetGamepadMapping(int device_index, SDL_GamepadMap
out->misc1.kind = EMappingKind_Button; out->misc1.kind = EMappingKind_Button;
out->misc1.target = SDL_GAMEPAD_BUTTON_GAMEINPUT_SHARE; out->misc1.target = SDL_GAMEPAD_BUTTON_GAMEINPUT_SHARE;
} }
#endif #endif // GAMEINPUT_API_VERSION >= 1
out->start.kind = EMappingKind_Button; out->start.kind = EMappingKind_Button;
out->start.target = SDL_GAMEPAD_BUTTON_START; out->start.target = SDL_GAMEPAD_BUTTON_START;

View File

@@ -22,16 +22,14 @@
#include "SDL_windowsvideo.h" #include "SDL_windowsvideo.h"
// GameInput currently has a bug with keys stuck on focus change, and crashes on initialization on some systems, so we'll disable it until these issues are fixed.
#undef HAVE_GAMEINPUT_H
#ifdef HAVE_GAMEINPUT_H #ifdef HAVE_GAMEINPUT_H
#include "../../core/windows/SDL_gameinput.h" #include "../../core/windows/SDL_gameinput.h"
extern "C" {
#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"
}
#define MAX_GAMEINPUT_BUTTONS 7 // GameInputMouseWheelTiltRight is the highest button #define MAX_GAMEINPUT_BUTTONS 7 // GameInputMouseWheelTiltRight is the highest button
@@ -75,7 +73,14 @@ static bool GAMEINPUT_InternalAddOrFind(WIN_GameInputData *data, IGameInputDevic
const GameInputDeviceInfo *info; const GameInputDeviceInfo *info;
bool result = false; bool result = false;
info = IGameInputDevice_GetDeviceInfo(pDevice); #if GAMEINPUT_API_VERSION >= 1
HRESULT hr = pDevice->GetDeviceInfo(&info);
if (FAILED(hr)) {
return WIN_SetErrorFromHRESULT("IGameInputDevice_GetDeviceInfo", hr);
}
#else
info = pDevice->GetDeviceInfo();
#endif
SDL_LockMutex(data->lock); SDL_LockMutex(data->lock);
{ {
@@ -100,15 +105,11 @@ static bool GAMEINPUT_InternalAddOrFind(WIN_GameInputData *data, IGameInputDevic
goto done; goto done;
} }
if (info->deviceStrings) {
// In theory we could get the manufacturer and product strings here, but they're NULL for all the devices I've tested
}
if (info->displayName) { if (info->displayName) {
// This could give us a product string, but it's NULL for all the devices I've tested // This could give us a product string, but it's NULL for all the devices I've tested
} }
IGameInputDevice_AddRef(pDevice); pDevice->AddRef();
device->pDevice = pDevice; device->pDevice = pDevice;
device->instance_id = SDL_GetNextObjectID(); device->instance_id = SDL_GetNextObjectID();
device->info = info; device->info = info;
@@ -147,15 +148,15 @@ static bool GAMEINPUT_InternalRemoveByIndex(WIN_GameInputData *data, int idx)
SDL_RemoveKeyboard(device->instance_id, true); SDL_RemoveKeyboard(device->instance_id, true);
} }
if (device->last_mouse_reading) { if (device->last_mouse_reading) {
IGameInputReading_Release(device->last_mouse_reading); device->last_mouse_reading->Release();
device->last_mouse_reading = NULL; device->last_mouse_reading = NULL;
} }
if (device->last_keyboard_reading) { if (device->last_keyboard_reading) {
IGameInputReading_Release(device->last_keyboard_reading); device->last_keyboard_reading->Release();
device->last_keyboard_reading = NULL; device->last_keyboard_reading = NULL;
} }
} }
IGameInputDevice_Release(device->pDevice); device->pDevice->Release();
SDL_free(device->name); SDL_free(device->name);
SDL_free(device); SDL_free(device);
} }
@@ -217,6 +218,8 @@ bool WIN_InitGameInput(SDL_VideoDevice *_this)
{ {
WIN_GameInputData *data; WIN_GameInputData *data;
HRESULT hr; HRESULT hr;
Uint64 now;
uint64_t timestampUS;
bool result = false; bool result = false;
if (_this->internal->gameinput_context) { if (_this->internal->gameinput_context) {
@@ -238,22 +241,21 @@ bool WIN_InitGameInput(SDL_VideoDevice *_this)
goto done; goto done;
} }
hr = IGameInput_RegisterDeviceCallback(data->pGameInput, hr = data->pGameInput->RegisterDeviceCallback(NULL,
NULL, (GameInputKindMouse | GameInputKindKeyboard),
(GameInputKindMouse | GameInputKindKeyboard), GameInputDeviceConnected,
GameInputDeviceConnected, GameInputBlockingEnumeration,
GameInputBlockingEnumeration, data,
data, GAMEINPUT_InternalDeviceCallback,
GAMEINPUT_InternalDeviceCallback, &data->gameinput_callback_token);
&data->gameinput_callback_token);
if (FAILED(hr)) { if (FAILED(hr)) {
SDL_SetError("IGameInput::RegisterDeviceCallback failure with HRESULT of %08X", hr); WIN_SetErrorFromHRESULT("IGameInput::RegisterDeviceCallback", hr);
goto done; goto done;
} }
// Calculate the relative offset between SDL timestamps and GameInput timestamps // Calculate the relative offset between SDL timestamps and GameInput timestamps
Uint64 now = SDL_GetTicksNS(); now = SDL_GetTicksNS();
uint64_t timestampUS = IGameInput_GetCurrentTimestamp(data->pGameInput); timestampUS = data->pGameInput->GetCurrentTimestamp();
data->timestamp_offset = (SDL_NS_TO_US(now) - timestampUS); data->timestamp_offset = (SDL_NS_TO_US(now) - timestampUS);
result = true; result = true;
@@ -268,12 +270,12 @@ done:
static void GAMEINPUT_InitialMouseReading(WIN_GameInputData *data, SDL_Window *window, GAMEINPUT_Device *device, IGameInputReading *reading) static void GAMEINPUT_InitialMouseReading(WIN_GameInputData *data, SDL_Window *window, GAMEINPUT_Device *device, IGameInputReading *reading)
{ {
GameInputMouseState state; GameInputMouseState state;
if (SUCCEEDED(IGameInputReading_GetMouseState(reading, &state))) { if (reading->GetMouseState(&state)) {
Uint64 timestamp = SDL_US_TO_NS(IGameInputReading_GetTimestamp(reading) + data->timestamp_offset); Uint64 timestamp = SDL_US_TO_NS(reading->GetTimestamp() + data->timestamp_offset);
SDL_MouseID mouseID = device->instance_id; SDL_MouseID mouseID = device->instance_id;
for (int i = 0; i < MAX_GAMEINPUT_BUTTONS; ++i) { for (int i = 0; i < MAX_GAMEINPUT_BUTTONS; ++i) {
const GameInputMouseButtons mask = (1 << i); const GameInputMouseButtons mask = GameInputMouseButtons(1 << i);
bool down = ((state.buttons & mask) != 0); bool down = ((state.buttons & mask) != 0);
SDL_SendMouseButton(timestamp, window, mouseID, GAMEINPUT_button_map[i], down); SDL_SendMouseButton(timestamp, window, mouseID, GAMEINPUT_button_map[i], down);
} }
@@ -284,9 +286,8 @@ static void GAMEINPUT_HandleMouseDelta(WIN_GameInputData *data, SDL_Window *wind
{ {
GameInputMouseState last; GameInputMouseState last;
GameInputMouseState state; GameInputMouseState state;
if (SUCCEEDED(IGameInputReading_GetMouseState(last_reading, &last)) && if (last_reading->GetMouseState(&last) && reading->GetMouseState(&state)) {
SUCCEEDED(IGameInputReading_GetMouseState(reading, &state))) { Uint64 timestamp = SDL_US_TO_NS(reading->GetTimestamp() + data->timestamp_offset);
Uint64 timestamp = SDL_US_TO_NS(IGameInputReading_GetTimestamp(reading) + data->timestamp_offset);
SDL_MouseID mouseID = device->instance_id; SDL_MouseID mouseID = device->instance_id;
GameInputMouseState delta; GameInputMouseState delta;
@@ -301,7 +302,7 @@ static void GAMEINPUT_HandleMouseDelta(WIN_GameInputData *data, SDL_Window *wind
} }
if (delta.buttons) { if (delta.buttons) {
for (int i = 0; i < MAX_GAMEINPUT_BUTTONS; ++i) { for (int i = 0; i < MAX_GAMEINPUT_BUTTONS; ++i) {
const GameInputMouseButtons mask = (1 << i); const GameInputMouseButtons mask = GameInputMouseButtons(1 << i);
if (delta.buttons & mask) { if (delta.buttons & mask) {
bool down = ((state.buttons & mask) != 0); bool down = ((state.buttons & mask) != 0);
SDL_SendMouseButton(timestamp, window, mouseID, GAMEINPUT_button_map[i], down); SDL_SendMouseButton(timestamp, window, mouseID, GAMEINPUT_button_map[i], down);
@@ -337,7 +338,7 @@ static bool KeysHaveScancode(const GameInputKeyState *keys, uint32_t count, SDL_
static void GAMEINPUT_InitialKeyboardReading(WIN_GameInputData *data, SDL_Window *window, GAMEINPUT_Device *device, IGameInputReading *reading) static void GAMEINPUT_InitialKeyboardReading(WIN_GameInputData *data, SDL_Window *window, GAMEINPUT_Device *device, IGameInputReading *reading)
{ {
Uint64 timestamp = SDL_US_TO_NS(IGameInputReading_GetTimestamp(reading) + data->timestamp_offset); Uint64 timestamp = SDL_US_TO_NS(reading->GetTimestamp() + data->timestamp_offset);
SDL_KeyboardID keyboardID = device->instance_id; SDL_KeyboardID keyboardID = device->instance_id;
uint32_t max_keys = device->info->keyboardInfo->maxSimultaneousKeys; uint32_t max_keys = device->info->keyboardInfo->maxSimultaneousKeys;
@@ -346,7 +347,7 @@ static void GAMEINPUT_InitialKeyboardReading(WIN_GameInputData *data, SDL_Window
return; return;
} }
uint32_t num_keys = IGameInputReading_GetKeyState(reading, max_keys, keys); uint32_t num_keys = reading->GetKeyState(max_keys, keys);
if (!num_keys) { if (!num_keys) {
// FIXME: We probably need to track key state by keyboardID // FIXME: We probably need to track key state by keyboardID
SDL_ResetKeyboard(); SDL_ResetKeyboard();
@@ -382,7 +383,7 @@ static void DumpKeys(const char *prefix, GameInputKeyState *keys, uint32_t count
static void GAMEINPUT_HandleKeyboardDelta(WIN_GameInputData *data, SDL_Window *window, GAMEINPUT_Device *device, IGameInputReading *last_reading, IGameInputReading *reading) static void GAMEINPUT_HandleKeyboardDelta(WIN_GameInputData *data, SDL_Window *window, GAMEINPUT_Device *device, IGameInputReading *last_reading, IGameInputReading *reading)
{ {
Uint64 timestamp = SDL_US_TO_NS(IGameInputReading_GetTimestamp(reading) + data->timestamp_offset); Uint64 timestamp = SDL_US_TO_NS(reading->GetTimestamp() + data->timestamp_offset);
SDL_KeyboardID keyboardID = device->instance_id; SDL_KeyboardID keyboardID = device->instance_id;
uint32_t max_keys = device->info->keyboardInfo->maxSimultaneousKeys; uint32_t max_keys = device->info->keyboardInfo->maxSimultaneousKeys;
@@ -394,8 +395,8 @@ static void GAMEINPUT_HandleKeyboardDelta(WIN_GameInputData *data, SDL_Window *w
uint32_t index_last = 0; uint32_t index_last = 0;
uint32_t index_keys = 0; uint32_t index_keys = 0;
uint32_t num_last = IGameInputReading_GetKeyState(last_reading, max_keys, last); uint32_t num_last = last_reading->GetKeyState(max_keys, last);
uint32_t num_keys = IGameInputReading_GetKeyState(reading, max_keys, keys); uint32_t num_keys = reading->GetKeyState(max_keys, keys);
#ifdef DEBUG_KEYS #ifdef DEBUG_KEYS
SDL_Log("Timestamp: %llu", timestamp); SDL_Log("Timestamp: %llu", timestamp);
DumpKeys("Last keys:", last, num_last); DumpKeys("Last keys:", last, num_last);
@@ -463,20 +464,20 @@ void WIN_UpdateGameInput(SDL_VideoDevice *_this)
if (data->enabled_input & GameInputKindMouse) { if (data->enabled_input & GameInputKindMouse) {
if (device->last_mouse_reading) { if (device->last_mouse_reading) {
HRESULT hr; HRESULT hr;
while (SUCCEEDED(hr = IGameInput_GetNextReading(data->pGameInput, device->last_mouse_reading, GameInputKindMouse, device->pDevice, &reading))) { while (SUCCEEDED(hr = data->pGameInput->GetNextReading(device->last_mouse_reading, GameInputKindMouse, device->pDevice, &reading))) {
GAMEINPUT_HandleMouseDelta(data, window, device, device->last_mouse_reading, reading); GAMEINPUT_HandleMouseDelta(data, window, device, device->last_mouse_reading, reading);
IGameInputReading_Release(device->last_mouse_reading); device->last_mouse_reading->Release();
device->last_mouse_reading = reading; device->last_mouse_reading = reading;
} }
if (hr != GAMEINPUT_E_READING_NOT_FOUND) { if (hr != GAMEINPUT_E_READING_NOT_FOUND) {
if (SUCCEEDED(IGameInput_GetCurrentReading(data->pGameInput, GameInputKindMouse, device->pDevice, &reading))) { if (SUCCEEDED(data->pGameInput->GetCurrentReading(GameInputKindMouse, device->pDevice, &reading))) {
GAMEINPUT_HandleMouseDelta(data, window, device, device->last_mouse_reading, reading); GAMEINPUT_HandleMouseDelta(data, window, device, device->last_mouse_reading, reading);
IGameInputReading_Release(device->last_mouse_reading); device->last_mouse_reading->Release();
device->last_mouse_reading = reading; device->last_mouse_reading = reading;
} }
} }
} else { } else {
if (SUCCEEDED(IGameInput_GetCurrentReading(data->pGameInput, GameInputKindMouse, device->pDevice, &reading))) { if (SUCCEEDED(data->pGameInput->GetCurrentReading(GameInputKindMouse, device->pDevice, &reading))) {
GAMEINPUT_InitialMouseReading(data, window, device, reading); GAMEINPUT_InitialMouseReading(data, window, device, reading);
device->last_mouse_reading = reading; device->last_mouse_reading = reading;
} }
@@ -487,26 +488,26 @@ void WIN_UpdateGameInput(SDL_VideoDevice *_this)
if (window->text_input_active) { if (window->text_input_active) {
// Reset raw input while text input is active // Reset raw input while text input is active
if (device->last_keyboard_reading) { if (device->last_keyboard_reading) {
IGameInputReading_Release(device->last_keyboard_reading); device->last_keyboard_reading->Release();
device->last_keyboard_reading = NULL; device->last_keyboard_reading = NULL;
} }
} else { } else {
if (device->last_keyboard_reading) { if (device->last_keyboard_reading) {
HRESULT hr; HRESULT hr;
while (SUCCEEDED(hr = IGameInput_GetNextReading(data->pGameInput, device->last_keyboard_reading, GameInputKindKeyboard, device->pDevice, &reading))) { while (SUCCEEDED(hr = data->pGameInput->GetNextReading(device->last_keyboard_reading, GameInputKindKeyboard, device->pDevice, &reading))) {
GAMEINPUT_HandleKeyboardDelta(data, window, device, device->last_keyboard_reading, reading); GAMEINPUT_HandleKeyboardDelta(data, window, device, device->last_keyboard_reading, reading);
IGameInputReading_Release(device->last_keyboard_reading); device->last_keyboard_reading->Release();
device->last_keyboard_reading = reading; device->last_keyboard_reading = reading;
} }
if (hr != GAMEINPUT_E_READING_NOT_FOUND) { if (hr != GAMEINPUT_E_READING_NOT_FOUND) {
if (SUCCEEDED(IGameInput_GetCurrentReading(data->pGameInput, GameInputKindKeyboard, device->pDevice, &reading))) { if (SUCCEEDED(data->pGameInput->GetCurrentReading(GameInputKindKeyboard, device->pDevice, &reading))) {
GAMEINPUT_HandleKeyboardDelta(data, window, device, device->last_keyboard_reading, reading); GAMEINPUT_HandleKeyboardDelta(data, window, device, device->last_keyboard_reading, reading);
IGameInputReading_Release(device->last_keyboard_reading); device->last_keyboard_reading->Release();
device->last_keyboard_reading = reading; device->last_keyboard_reading = reading;
} }
} }
} else { } else {
if (SUCCEEDED(IGameInput_GetCurrentReading(data->pGameInput, GameInputKindKeyboard, device->pDevice, &reading))) { if (SUCCEEDED(data->pGameInput->GetCurrentReading(GameInputKindKeyboard, device->pDevice, &reading))) {
GAMEINPUT_InitialKeyboardReading(data, window, device, reading); GAMEINPUT_InitialKeyboardReading(data, window, device, reading);
device->last_keyboard_reading = reading; device->last_keyboard_reading = reading;
} }
@@ -534,12 +535,12 @@ bool WIN_UpdateGameInputEnabled(SDL_VideoDevice *_this)
GAMEINPUT_Device *device = data->devices[i]; GAMEINPUT_Device *device = data->devices[i];
if (device->last_mouse_reading && !raw_mouse_enabled) { if (device->last_mouse_reading && !raw_mouse_enabled) {
IGameInputReading_Release(device->last_mouse_reading); device->last_mouse_reading->Release();
device->last_mouse_reading = NULL; device->last_mouse_reading = NULL;
} }
if (device->last_keyboard_reading && !raw_keyboard_enabled) { if (device->last_keyboard_reading && !raw_keyboard_enabled) {
IGameInputReading_Release(device->last_keyboard_reading); device->last_keyboard_reading->Release();
device->last_keyboard_reading = NULL; device->last_keyboard_reading = NULL;
} }
} }
@@ -559,9 +560,13 @@ void WIN_QuitGameInput(SDL_VideoDevice *_this)
if (data->pGameInput) { if (data->pGameInput) {
// free the callback // free the callback
if (data->gameinput_callback_token != GAMEINPUT_INVALID_CALLBACK_TOKEN_VALUE) { if (data->gameinput_callback_token) {
IGameInput_UnregisterCallback(data->pGameInput, data->gameinput_callback_token, /*timeoutInUs:*/ 10000); #if GAMEINPUT_API_VERSION >= 1
data->gameinput_callback_token = GAMEINPUT_INVALID_CALLBACK_TOKEN_VALUE; data->pGameInput->UnregisterCallback(data->gameinput_callback_token);
#else
data->pGameInput->UnregisterCallback(data->gameinput_callback_token, 10000);
#endif
data->gameinput_callback_token = 0;
} }
// free the list // free the list
@@ -569,7 +574,7 @@ void WIN_QuitGameInput(SDL_VideoDevice *_this)
GAMEINPUT_InternalRemoveByIndex(data, 0); GAMEINPUT_InternalRemoveByIndex(data, 0);
} }
IGameInput_Release(data->pGameInput); data->pGameInput->Release();
data->pGameInput = NULL; data->pGameInput = NULL;
} }

View File

@@ -22,8 +22,17 @@
typedef struct WIN_GameInputData WIN_GameInputData; typedef struct WIN_GameInputData WIN_GameInputData;
// Set up for C function definitions, even when using C++
#ifdef __cplusplus
extern "C" {
#endif
extern bool WIN_InitGameInput(SDL_VideoDevice *_this); extern bool WIN_InitGameInput(SDL_VideoDevice *_this);
extern bool WIN_UpdateGameInputEnabled(SDL_VideoDevice *_this); extern bool WIN_UpdateGameInputEnabled(SDL_VideoDevice *_this);
extern void WIN_UpdateGameInput(SDL_VideoDevice *_this); extern void WIN_UpdateGameInput(SDL_VideoDevice *_this);
extern void WIN_QuitGameInput(SDL_VideoDevice *_this); extern void WIN_QuitGameInput(SDL_VideoDevice *_this);
// Ends C function definitions when using C++
#ifdef __cplusplus
}
#endif

View File

@@ -28,8 +28,10 @@
#include "../SDL_sysvideo.h" #include "../SDL_sysvideo.h"
#ifdef HAVE_DXGI_H #ifdef HAVE_DXGI_H
#ifndef __cplusplus
#define CINTERFACE #define CINTERFACE
#define COBJMACROS #define COBJMACROS
#endif
#include <dxgi.h> #include <dxgi.h>
#endif #endif