Make gameinput.cpp c++98-compatible

This commit is contained in:
Anonymous Maarten
2026-07-28 03:49:08 +02:00
committed by Anonymous Maarten
parent b048e8e6f8
commit 5924f36dc6
3 changed files with 46 additions and 27 deletions

View File

@@ -2348,21 +2348,16 @@ elseif(WINDOWS OR CYGWIN)
set(HAVE_GAMEINPUT_H 1)
sdl_include_directories(PRIVATE SYSTEM "${SDL3_SOURCE_DIR}/src/core/windows/gameinput")
if("cxx_std_11" IN_LIST CMAKE_CXX_COMPILE_FEATURES)
sdl_sources("${SDL3_SOURCE_DIR}/src/core/windows/gameinput/gameinput.cpp")
sdl_compile_features(cxx_std_11)
if(USE_GCC OR USE_CLANG)
# Avoid a dependency on libstdc++-X.dll for `__gxx_personality_seh0`
check_c_compiler_flag(-fno-exceptions COMPILER_SUPPORTS_FNO_EXCEPTIONS)
if(COMPILER_SUPPORTS_FNO_EXCEPTIONS)
set_property(SOURCE "${SDL3_SOURCE_DIR}/src/core/windows/gameinput/gameinput.cpp" APPEND PROPERTY COMPILE_OPTIONS "-fno-exceptions")
set_property(SOURCE "${SDL3_SOURCE_DIR}/src/core/windows/gameinput/gameinput.cpp" PROPERTY SKIP_PRECOMPILE_HEADERS 1)
endif()
sdl_sources("${SDL3_SOURCE_DIR}/src/core/windows/gameinput/gameinput.cpp")
if(USE_GCC OR USE_CLANG)
# Avoid a dependency on libstdc++-X.dll for `__gxx_personality_seh0`
check_c_compiler_flag(-fno-exceptions COMPILER_SUPPORTS_FNO_EXCEPTIONS)
if(COMPILER_SUPPORTS_FNO_EXCEPTIONS)
set_property(SOURCE "${SDL3_SOURCE_DIR}/src/core/windows/gameinput/gameinput.cpp" APPEND PROPERTY COMPILE_OPTIONS "-fno-exceptions")
set_property(SOURCE "${SDL3_SOURCE_DIR}/src/core/windows/gameinput/gameinput.cpp" PROPERTY SKIP_PRECOMPILE_HEADERS 1)
endif()
set(SDL_GAMEINPUT_DYNAMIC 0)
else()
set(SDL_GAMEINPUT_DYNAMIC 1)
endif()
set(SDL_GAMEINPUT_DYNAMIC 0)
check_include_file(dxgi1_5.h HAVE_DXGI1_5_H)
check_include_file(dxgi1_6.h HAVE_DXGI1_6_H)

View File

@@ -37,6 +37,9 @@
#include <stdint.h>
// Start SDL modifications
// !! File has been modified for compatibility with pre-c++11 toolchains
#ifndef RRF_SUBKEY_WOW6432KEY
#define RRF_SUBKEY_WOW6432KEY 0x00020000
#endif
@@ -45,6 +48,11 @@
#define wcscpy_s(DST, DST_SIZE, SRC) SDL_wcslcpy(DST, SRC, DST_SIZE)
#define wcscat_s(DST, DST_SIZE, SRC) SDL_wcslcat(DST, SRC, DST_SIZE)
#if __cplusplus < 2011003L
#define noexcept
#define nullptr NULL
#endif
// Additional changes:
// - Removed unused `static uint32_t g_productType = PRODUCT_UNDEFINED;`
// - Removed unused `static HMODULE g_ntdllDll = nullptr;`
@@ -102,6 +110,13 @@ template <typename T>
class Vector
{
public:
Vector()
: m_data(nullptr)
, m_count(0)
, m_capacity(0)
{
}
~Vector()
{
if (m_data != nullptr)
@@ -163,9 +178,9 @@ public:
}
private:
T* m_data = nullptr;
size_t m_count = 0;
size_t m_capacity = 0;
T* m_data;
size_t m_count;
size_t m_capacity;
};
template <typename T>
@@ -244,8 +259,8 @@ private:
Vector<T> m_string;
};
using WString = String<wchar_t>;
using AString = String<char>;
typedef String<wchar_t> WString;
typedef String<char> AString;
//
@@ -344,10 +359,11 @@ static HRESULT GetApplicationDirectory(
static HRESULT GetRedistDirectory(
_Inout_ WString* redistDir) noexcept
{
constexpr const wchar_t* RedistDirRegPath = L"SOFTWARE\\Microsoft\\GameInput";
constexpr const wchar_t* RedistDirValueName = L"RedistDir";
static const wchar_t* RedistDirRegPath = L"SOFTWARE\\Microsoft\\GameInput";
static const wchar_t* RedistDirValueName = L"RedistDir";
decltype(RegGetValueW)* regGetValue = nullptr;
typedef LONG (WINAPI *RegGetValueW_t)(HKEY,LPCWSTR,LPCWSTR,DWORD,LPDWORD,PVOID,LPDWORD);
RegGetValueW_t regGetValue = nullptr;
RETURN_IF_FAILED(LoadSystemModuleProc(
&g_advapi32Dll,
L"advapi32.dll",
@@ -386,21 +402,24 @@ static HRESULT GetFileVersion(
{
*version = 0;
decltype(GetFileVersionInfoSizeW)* getFileVersionInfoSize = nullptr;
typedef DWORD (WINAPI *GetFileVersionInfoSizeW_t)(LPCWSTR,LPDWORD);
GetFileVersionInfoSizeW_t getFileVersionInfoSize = nullptr;
RETURN_IF_FAILED(LoadSystemModuleProc(
&g_versionDll,
L"version.dll",
"GetFileVersionInfoSizeW",
&getFileVersionInfoSize));
decltype(GetFileVersionInfoW)* getFileVersionInfo = nullptr;
typedef BOOL (WINAPI *GetFileVersionInfoW_t)(LPCWSTR,DWORD,DWORD,LPVOID);
GetFileVersionInfoW_t getFileVersionInfo = nullptr;
RETURN_IF_FAILED(LoadSystemModuleProc(
&g_versionDll,
L"version.dll",
"GetFileVersionInfoW",
&getFileVersionInfo));
decltype(VerQueryValueW)* verQueryValue = nullptr;
typedef BOOL (WINAPI *VerQueryValueW_t)(LPCVOID,LPCWSTR,LPVOID*,PUINT);
VerQueryValueW_t verQueryValue = nullptr;
RETURN_IF_FAILED(LoadSystemModuleProc(
&g_versionDll,
L"version.dll",
@@ -586,7 +605,7 @@ static HRESULT GameInputCreateWithVersion(
RETURN_IF_FAILED(LoadGameInputDll(&g_gameInputDll));
}
using GameInputInitializeFn = HRESULT (*)(
typedef HRESULT (*GameInputInitializeFn)(
_In_ REFIID riid,
_COM_Outptr_ LPVOID* ppv);
@@ -602,7 +621,7 @@ static HRESULT GameInputCreateWithVersion(
// did not find it via above query, we must be running an old version of GameInput
// which only supports the v0 API. Don't attempt to use it for newer API versions.
using GameInputCreateFn = HRESULT (*)(
typedef HRESULT (*GameInputCreateFn)(
_COM_Outptr_ LPVOID* ppv);
GameInputCreateFn gameInputCreate = nullptr;

View File

@@ -568,12 +568,17 @@ interface IGameInputForceFeedbackEffect;
interface IGameInputMapper;
typedef uint64_t GameInputCallbackToken;
// start SDL modifications
#if 0
// end SDL modifications
constexpr GUID GAMEINPUT_HAPTIC_LOCATION_NONE = { 0x00000000, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } };
constexpr GUID GAMEINPUT_HAPTIC_LOCATION_GRIP_LEFT = { 0x08c707c2, 0x66bb, 0x406c, { 0xa8, 0x4a, 0xdf, 0xe0, 0x85, 0x12, 0x0a, 0x92 } };
constexpr GUID GAMEINPUT_HAPTIC_LOCATION_GRIP_RIGHT = { 0x155a0b77, 0x8bb2, 0x40db, { 0x86, 0x90, 0xb6, 0xd4, 0x11, 0x26, 0xdf, 0xc1 } };
constexpr GUID GAMEINPUT_HAPTIC_LOCATION_TRIGGER_LEFT = { 0x8de4d896, 0x5559, 0x4081, { 0x86, 0xe5, 0x17, 0x24, 0xcc, 0x07, 0xc6, 0xbc } };
constexpr GUID GAMEINPUT_HAPTIC_LOCATION_TRIGGER_RIGHT = { 0xff0cb557, 0x3af5, 0x406b, { 0x8b, 0x0f, 0x55, 0x5a, 0x2d, 0x92, 0xa2, 0x20 } };
// start SDL modifications
#endif
// end SDL modifications
const uint32_t GAMEINPUT_HAPTIC_MAX_LOCATIONS = 8;
const uint32_t GAMEINPUT_HAPTIC_MAX_AUDIO_ENDPOINT_ID_SIZE = 256;