mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-09-30 23:18:29 +00:00
Fix support for Windows XP and up (#13904)
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -50,6 +50,7 @@ compile_commands.json
|
|||||||
*.pc
|
*.pc
|
||||||
test/*.test
|
test/*.test
|
||||||
wayland-generated-protocols
|
wayland-generated-protocols
|
||||||
|
CMakeSettings.json
|
||||||
|
|
||||||
# for CLion
|
# for CLion
|
||||||
.idea
|
.idea
|
||||||
@@ -98,6 +99,7 @@ src/render/direct3d12/D3D12_*_One.h
|
|||||||
src/render/direct3d12/D3D12_*_Series.h
|
src/render/direct3d12/D3D12_*_Series.h
|
||||||
src/gpu/d3d12/D3D12_*_One.h
|
src/gpu/d3d12/D3D12_*_One.h
|
||||||
src/gpu/d3d12/D3D12_*_Series.h
|
src/gpu/d3d12/D3D12_*_Series.h
|
||||||
|
out/
|
||||||
|
|
||||||
# for Android
|
# for Android
|
||||||
android-project/local.properties
|
android-project/local.properties
|
||||||
|
@@ -2172,7 +2172,7 @@ elseif(WINDOWS)
|
|||||||
else()
|
else()
|
||||||
set(PROCESSOR_ARCH "x86")
|
set(PROCESSOR_ARCH "x86")
|
||||||
endif()
|
endif()
|
||||||
sdl_link_directories("$<BUILD_INTERFACE:$$ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH}>")
|
sdl_link_directories("$<BUILD_INTERFACE:$ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH}>")
|
||||||
sdl_include_directories(PRIVATE SYSTEM "$<BUILD_INTERFACE:$ENV{DXSDK_DIR}\\Include>")
|
sdl_include_directories(PRIVATE SYSTEM "$<BUILD_INTERFACE:$ENV{DXSDK_DIR}\\Include>")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
@@ -2183,7 +2183,8 @@ elseif(WINDOWS)
|
|||||||
check_c_source_compiles("
|
check_c_source_compiles("
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <xinput.h>
|
#include <xinput.h>
|
||||||
int main(int argc, char **argv) { return 0; }" HAVE_XINPUT_H)
|
int main(int argc, char **argv) { return 0; }" HAVE_XINPUT_H
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# headers needed elsewhere
|
# headers needed elsewhere
|
||||||
@@ -2206,12 +2207,18 @@ elseif(WINDOWS)
|
|||||||
check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
|
check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
|
||||||
check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
|
check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
|
||||||
check_include_file(sensorsapi.h HAVE_SENSORSAPI_H)
|
check_include_file(sensorsapi.h HAVE_SENSORSAPI_H)
|
||||||
check_include_file(shellscalingapi.h HAVE_SHELLSCALINGAPI_H)
|
check_c_source_compiles("
|
||||||
|
#include <shellscalingapi.h>
|
||||||
|
static void *ptr = GetDpiForMonitor;
|
||||||
|
int main (int argc, char **argv) { return 0; }
|
||||||
|
" HAVE_SHELLSCALINGAPI_H
|
||||||
|
)
|
||||||
check_c_source_compiles("
|
check_c_source_compiles("
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <mfapi.h>
|
#include <mfapi.h>
|
||||||
#include <mfidl.h>
|
#include <mfidl.h>
|
||||||
#include <mfreadwrite.h>
|
#include <mfreadwrite.h>
|
||||||
|
static MFVideoPrimaries primaries = MFVideoPrimaries_DCI_P3;
|
||||||
int main(int argc, char **argv) { return 0; }
|
int main(int argc, char **argv) { return 0; }
|
||||||
" HAVE_MFAPI_H
|
" HAVE_MFAPI_H
|
||||||
)
|
)
|
||||||
@@ -2255,7 +2262,7 @@ elseif(WINDOWS)
|
|||||||
set(SDL_VIDEO_RENDER_D3D11 1)
|
set(SDL_VIDEO_RENDER_D3D11 1)
|
||||||
set(HAVE_RENDER_D3D11 TRUE)
|
set(HAVE_RENDER_D3D11 TRUE)
|
||||||
endif()
|
endif()
|
||||||
if(SDL_RENDER_D3D12)
|
if(SDL_RENDER_D3D12 AND HAVE_DXGI1_6_H)
|
||||||
set(SDL_VIDEO_RENDER_D3D12 1)
|
set(SDL_VIDEO_RENDER_D3D12 1)
|
||||||
set(HAVE_RENDER_D3D12 TRUE)
|
set(HAVE_RENDER_D3D12 TRUE)
|
||||||
endif()
|
endif()
|
||||||
@@ -3462,15 +3469,7 @@ endif()
|
|||||||
sdl_glob_sources(${SDL3_SOURCE_DIR}/src/tray/*.c)
|
sdl_glob_sources(${SDL3_SOURCE_DIR}/src/tray/*.c)
|
||||||
|
|
||||||
if(SDL_GPU)
|
if(SDL_GPU)
|
||||||
if(HAVE_D3D11_H)
|
if(HAVE_DXGI1_6_H)
|
||||||
sdl_glob_sources(
|
|
||||||
"${SDL3_SOURCE_DIR}/src/gpu/d3d11/*.c"
|
|
||||||
"${SDL3_SOURCE_DIR}/src/gpu/d3d11/*.h"
|
|
||||||
)
|
|
||||||
set(SDL_GPU_D3D11 1)
|
|
||||||
set(HAVE_SDL_GPU TRUE)
|
|
||||||
endif()
|
|
||||||
if(WINDOWS)
|
|
||||||
sdl_glob_sources(
|
sdl_glob_sources(
|
||||||
"${SDL3_SOURCE_DIR}/src/gpu/d3d12/*.c"
|
"${SDL3_SOURCE_DIR}/src/gpu/d3d12/*.c"
|
||||||
"${SDL3_SOURCE_DIR}/src/gpu/d3d12/*.h"
|
"${SDL3_SOURCE_DIR}/src/gpu/d3d12/*.h"
|
||||||
@@ -3486,7 +3485,7 @@ if(SDL_GPU)
|
|||||||
set(SDL_GPU_VULKAN 1)
|
set(SDL_GPU_VULKAN 1)
|
||||||
set(HAVE_SDL_GPU TRUE)
|
set(HAVE_SDL_GPU TRUE)
|
||||||
endif()
|
endif()
|
||||||
if(SDL_RENDER_GPU)
|
if(SDL_RENDER_GPU AND HAVE_SDL_GPU)
|
||||||
set(SDL_VIDEO_RENDER_GPU 1)
|
set(SDL_VIDEO_RENDER_GPU 1)
|
||||||
set(HAVE_RENDER_GPU TRUE)
|
set(HAVE_RENDER_GPU TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
@@ -1,183 +1,193 @@
|
|||||||
if(MSVC)
|
if(MSVC)
|
||||||
function(SDL_Preseed_CMakeCache)
|
function(SDL_Preseed_CMakeCache)
|
||||||
set(COMPILER_SUPPORTS_W3 "1" CACHE INTERNAL "Test /W3")
|
check_c_source_compiles("
|
||||||
set(COMPILER_SUPPORTS_FDIAGNOSTICS_COLOR_ALWAYS "" CACHE INTERNAL "Test COMPILER_SUPPORTS_FDIAGNOSTICS_COLOR_ALWAYS")
|
#include <sdkddkver.h>
|
||||||
set(HAVE_ALLOCA_H "" CACHE INTERNAL "Have include alloca.h")
|
#if _WIN32_WINNT < 0x0A00
|
||||||
set(HAVE_AUDIOCLIENT_H "1" CACHE INTERNAL "Have include audioclient.h")
|
#error Preseeding is only supported for MSVC supporting Windows 10 or higher
|
||||||
set(HAVE_D3D11_H "1" CACHE INTERNAL "Have include d3d11_1.h")
|
#endif
|
||||||
set(HAVE_D3D9_H "1" CACHE INTERNAL "Have include d3d9.h")
|
int main(int argc, char **argv) { return 0; }
|
||||||
set(HAVE_DDRAW_H "1" CACHE INTERNAL "Have include ddraw.h")
|
" CAN_PRESEED
|
||||||
set(HAVE_DINPUT_H "1" CACHE INTERNAL "Have include dinput.h")
|
)
|
||||||
set(HAVE_DSOUND_H "1" CACHE INTERNAL "Have include dsound.h")
|
if(CAN_PRESEED)
|
||||||
set(HAVE_DXGI_H "1" CACHE INTERNAL "Have include dxgi.h")
|
set(COMPILER_SUPPORTS_W3 "1" CACHE INTERNAL "Test /W3")
|
||||||
set(HAVE_LIBM "" CACHE INTERNAL "Have library m")
|
set(COMPILER_SUPPORTS_FDIAGNOSTICS_COLOR_ALWAYS "" CACHE INTERNAL "Test COMPILER_SUPPORTS_FDIAGNOSTICS_COLOR_ALWAYS")
|
||||||
set(HAVE_MALLOC "1" CACHE INTERNAL "Have include malloc.h")
|
set(HAVE_ALLOCA_H "" CACHE INTERNAL "Have include alloca.h")
|
||||||
set(HAVE_MMDEVICEAPI_H "1" CACHE INTERNAL "Have include mmdeviceapi.h")
|
set(HAVE_AUDIOCLIENT_H "1" CACHE INTERNAL "Have include audioclient.h")
|
||||||
set(HAVE_SENSORSAPI_H "1" CACHE INTERNAL "Have include sensorsapi.h")
|
set(HAVE_D3D11_H "1" CACHE INTERNAL "Have include d3d11_1.h")
|
||||||
set(HAVE_SHELLSCALINGAPI_H "1" CACHE INTERNAL "Have include shellscalingapi.h")
|
set(HAVE_D3D9_H "1" CACHE INTERNAL "Have include d3d9.h")
|
||||||
set(HAVE_TPCSHRD_H "1" CACHE INTERNAL "Have include tpcshrd.h")
|
set(HAVE_DDRAW_H "1" CACHE INTERNAL "Have include ddraw.h")
|
||||||
set(HAVE_WIN32_CC "1" CACHE INTERNAL "Test HAVE_WIN32_CC")
|
set(HAVE_DINPUT_H "1" CACHE INTERNAL "Have include dinput.h")
|
||||||
set(HAVE_XINPUT_H "1" CACHE INTERNAL "Test HAVE_XINPUT_H")
|
set(HAVE_DSOUND_H "1" CACHE INTERNAL "Have include dsound.h")
|
||||||
set(LIBC_HAS_ABS "1" CACHE INTERNAL "Have symbol abs")
|
set(HAVE_DXGI_H "1" CACHE INTERNAL "Have include dxgi.h")
|
||||||
set(LIBC_HAS_ACOS "1" CACHE INTERNAL "Have symbol acos")
|
set(HAVE_LIBM "" CACHE INTERNAL "Have library m")
|
||||||
set(LIBC_HAS_ACOSF "1" CACHE INTERNAL "Have symbol acosf")
|
set(HAVE_MALLOC "1" CACHE INTERNAL "Have include malloc.h")
|
||||||
set(LIBC_HAS_ASIN "1" CACHE INTERNAL "Have symbol asin")
|
set(HAVE_MMDEVICEAPI_H "1" CACHE INTERNAL "Have include mmdeviceapi.h")
|
||||||
set(LIBC_HAS_ASINF "1" CACHE INTERNAL "Have symbol asinf")
|
set(HAVE_SENSORSAPI_H "1" CACHE INTERNAL "Have include sensorsapi.h")
|
||||||
set(LIBC_HAS_ATAN "1" CACHE INTERNAL "Have symbol atan")
|
set(HAVE_SHELLSCALINGAPI_H "1" CACHE INTERNAL "Have include shellscalingapi.h")
|
||||||
set(LIBC_HAS_ATAN2 "1" CACHE INTERNAL "Have symbol atan2")
|
set(HAVE_TPCSHRD_H "1" CACHE INTERNAL "Have include tpcshrd.h")
|
||||||
set(LIBC_HAS_ATAN2F "1" CACHE INTERNAL "Have symbol atan2f")
|
set(HAVE_WIN32_CC "1" CACHE INTERNAL "Test HAVE_WIN32_CC")
|
||||||
set(LIBC_HAS_ATANF "1" CACHE INTERNAL "Have symbol atanf")
|
set(HAVE_XINPUT_H "1" CACHE INTERNAL "Test HAVE_XINPUT_H")
|
||||||
set(LIBC_HAS_ATOF "1" CACHE INTERNAL "Have symbol atof")
|
set(LIBC_HAS_ABS "1" CACHE INTERNAL "Have symbol abs")
|
||||||
set(LIBC_HAS_ATOI "1" CACHE INTERNAL "Have symbol atoi")
|
set(LIBC_HAS_ACOS "1" CACHE INTERNAL "Have symbol acos")
|
||||||
set(LIBC_HAS_BCOPY "" CACHE INTERNAL "Have symbol bcopy")
|
set(LIBC_HAS_ACOSF "1" CACHE INTERNAL "Have symbol acosf")
|
||||||
set(LIBC_HAS_CALLOC "1" CACHE INTERNAL "Have symbol calloc")
|
set(LIBC_HAS_ASIN "1" CACHE INTERNAL "Have symbol asin")
|
||||||
set(LIBC_HAS_CEIL "1" CACHE INTERNAL "Have symbol ceil")
|
set(LIBC_HAS_ASINF "1" CACHE INTERNAL "Have symbol asinf")
|
||||||
set(LIBC_HAS_CEILF "1" CACHE INTERNAL "Have symbol ceilf")
|
set(LIBC_HAS_ATAN "1" CACHE INTERNAL "Have symbol atan")
|
||||||
set(LIBC_HAS_COPYSIGN "1" CACHE INTERNAL "Have symbol copysign")
|
set(LIBC_HAS_ATAN2 "1" CACHE INTERNAL "Have symbol atan2")
|
||||||
set(LIBC_HAS_COPYSIGNF "1" CACHE INTERNAL "Have symbol copysignf")
|
set(LIBC_HAS_ATAN2F "1" CACHE INTERNAL "Have symbol atan2f")
|
||||||
set(LIBC_HAS_COS "1" CACHE INTERNAL "Have symbol cos")
|
set(LIBC_HAS_ATANF "1" CACHE INTERNAL "Have symbol atanf")
|
||||||
set(LIBC_HAS_COSF "1" CACHE INTERNAL "Have symbol cosf")
|
set(LIBC_HAS_ATOF "1" CACHE INTERNAL "Have symbol atof")
|
||||||
set(LIBC_HAS_EXP "1" CACHE INTERNAL "Have symbol exp")
|
set(LIBC_HAS_ATOI "1" CACHE INTERNAL "Have symbol atoi")
|
||||||
set(LIBC_HAS_EXPF "1" CACHE INTERNAL "Have symbol expf")
|
set(LIBC_HAS_BCOPY "" CACHE INTERNAL "Have symbol bcopy")
|
||||||
set(LIBC_HAS_FABS "1" CACHE INTERNAL "Have symbol fabs")
|
set(LIBC_HAS_CALLOC "1" CACHE INTERNAL "Have symbol calloc")
|
||||||
set(LIBC_HAS_FABSF "1" CACHE INTERNAL "Have symbol fabsf")
|
set(LIBC_HAS_CEIL "1" CACHE INTERNAL "Have symbol ceil")
|
||||||
set(LIBC_HAS_FLOAT_H "1" CACHE INTERNAL "Have include float.h")
|
set(LIBC_HAS_CEILF "1" CACHE INTERNAL "Have symbol ceilf")
|
||||||
set(LIBC_HAS_FLOOR "1" CACHE INTERNAL "Have symbol floor")
|
set(LIBC_HAS_COPYSIGN "1" CACHE INTERNAL "Have symbol copysign")
|
||||||
set(LIBC_HAS_FLOORF "1" CACHE INTERNAL "Have symbol floorf")
|
set(LIBC_HAS_COPYSIGNF "1" CACHE INTERNAL "Have symbol copysignf")
|
||||||
set(LIBC_HAS_FMOD "1" CACHE INTERNAL "Have symbol fmod")
|
set(LIBC_HAS_COS "1" CACHE INTERNAL "Have symbol cos")
|
||||||
set(LIBC_HAS_FMODF "1" CACHE INTERNAL "Have symbol fmodf")
|
set(LIBC_HAS_COSF "1" CACHE INTERNAL "Have symbol cosf")
|
||||||
set(LIBC_HAS_FOPEN64 "" CACHE INTERNAL "Have symbol fopen64")
|
set(LIBC_HAS_EXP "1" CACHE INTERNAL "Have symbol exp")
|
||||||
set(LIBC_HAS_FREE "1" CACHE INTERNAL "Have symbol free")
|
set(LIBC_HAS_EXPF "1" CACHE INTERNAL "Have symbol expf")
|
||||||
set(LIBC_HAS_FSEEKO "" CACHE INTERNAL "Have symbol fseeko")
|
set(LIBC_HAS_FABS "1" CACHE INTERNAL "Have symbol fabs")
|
||||||
set(LIBC_HAS_FSEEKO64 "" CACHE INTERNAL "Have symbol fseeko64")
|
set(LIBC_HAS_FABSF "1" CACHE INTERNAL "Have symbol fabsf")
|
||||||
set(LIBC_HAS_GETENV "1" CACHE INTERNAL "Have symbol getenv")
|
set(LIBC_HAS_FLOAT_H "1" CACHE INTERNAL "Have include float.h")
|
||||||
set(LIBC_HAS_ICONV_H "" CACHE INTERNAL "Have include iconv.h")
|
set(LIBC_HAS_FLOOR "1" CACHE INTERNAL "Have symbol floor")
|
||||||
set(LIBC_HAS_INDEX "" CACHE INTERNAL "Have symbol index")
|
set(LIBC_HAS_FLOORF "1" CACHE INTERNAL "Have symbol floorf")
|
||||||
set(LIBC_HAS_INTTYPES_H "1" CACHE INTERNAL "Have include inttypes.h")
|
set(LIBC_HAS_FMOD "1" CACHE INTERNAL "Have symbol fmod")
|
||||||
set(LIBC_HAS_ISINF "1" CACHE INTERNAL "Have include isinf(double)")
|
set(LIBC_HAS_FMODF "1" CACHE INTERNAL "Have symbol fmodf")
|
||||||
set(LIBC_ISINF_HANDLES_FLOAT "1" CACHE INTERNAL "Have include isinf(float)")
|
set(LIBC_HAS_FOPEN64 "" CACHE INTERNAL "Have symbol fopen64")
|
||||||
set(LIBC_HAS_ISINFF "" CACHE INTERNAL "Have include isinff(float)")
|
set(LIBC_HAS_FREE "1" CACHE INTERNAL "Have symbol free")
|
||||||
set(LIBC_HAS_ISNAN "1" CACHE INTERNAL "Have include isnan(double)")
|
set(LIBC_HAS_FSEEKO "" CACHE INTERNAL "Have symbol fseeko")
|
||||||
set(LIBC_ISNAN_HANDLES_FLOAT "1" CACHE INTERNAL "Have include isnan(float)")
|
set(LIBC_HAS_FSEEKO64 "" CACHE INTERNAL "Have symbol fseeko64")
|
||||||
set(LIBC_HAS_ISNANF "" CACHE INTERNAL "Have include isnanf(float)")
|
set(LIBC_HAS_GETENV "1" CACHE INTERNAL "Have symbol getenv")
|
||||||
set(LIBC_HAS_ITOA "1" CACHE INTERNAL "Have symbol itoa")
|
set(LIBC_HAS_ICONV_H "" CACHE INTERNAL "Have include iconv.h")
|
||||||
set(LIBC_HAS_LIMITS_H "1" CACHE INTERNAL "Have include limits.h")
|
set(LIBC_HAS_INDEX "" CACHE INTERNAL "Have symbol index")
|
||||||
set(LIBC_HAS_LOG "1" CACHE INTERNAL "Have symbol log")
|
set(LIBC_HAS_INTTYPES_H "1" CACHE INTERNAL "Have include inttypes.h")
|
||||||
set(LIBC_HAS_LOG10 "1" CACHE INTERNAL "Have symbol log10")
|
set(LIBC_HAS_ISINF "1" CACHE INTERNAL "Have include isinf(double)")
|
||||||
set(LIBC_HAS_LOG10F "1" CACHE INTERNAL "Have symbol log10f")
|
set(LIBC_ISINF_HANDLES_FLOAT "1" CACHE INTERNAL "Have include isinf(float)")
|
||||||
set(LIBC_HAS_LOGF "1" CACHE INTERNAL "Have symbol logf")
|
set(LIBC_HAS_ISINFF "" CACHE INTERNAL "Have include isinff(float)")
|
||||||
set(LIBC_HAS_LROUND "1" CACHE INTERNAL "Have symbol lround")
|
set(LIBC_HAS_ISNAN "1" CACHE INTERNAL "Have include isnan(double)")
|
||||||
set(LIBC_HAS_LROUNDF "1" CACHE INTERNAL "Have symbol lroundf")
|
set(LIBC_ISNAN_HANDLES_FLOAT "1" CACHE INTERNAL "Have include isnan(float)")
|
||||||
set(LIBC_HAS_MALLOC "1" CACHE INTERNAL "Have symbol malloc")
|
set(LIBC_HAS_ISNANF "" CACHE INTERNAL "Have include isnanf(float)")
|
||||||
set(LIBC_HAS_MALLOC_H "1" CACHE INTERNAL "Have include malloc.h")
|
set(LIBC_HAS_ITOA "1" CACHE INTERNAL "Have symbol itoa")
|
||||||
set(LIBC_HAS_MATH_H "1" CACHE INTERNAL "Have include math.h")
|
set(LIBC_HAS_LIMITS_H "1" CACHE INTERNAL "Have include limits.h")
|
||||||
set(LIBC_HAS_MEMCMP "1" CACHE INTERNAL "Have symbol memcmp")
|
set(LIBC_HAS_LOG "1" CACHE INTERNAL "Have symbol log")
|
||||||
set(LIBC_HAS_MEMCPY "1" CACHE INTERNAL "Have symbol memcpy")
|
set(LIBC_HAS_LOG10 "1" CACHE INTERNAL "Have symbol log10")
|
||||||
set(LIBC_HAS_MEMMOVE "1" CACHE INTERNAL "Have symbol memmove")
|
set(LIBC_HAS_LOG10F "1" CACHE INTERNAL "Have symbol log10f")
|
||||||
set(LIBC_HAS_MEMORY_H "1" CACHE INTERNAL "Have include memory.h")
|
set(LIBC_HAS_LOGF "1" CACHE INTERNAL "Have symbol logf")
|
||||||
set(LIBC_HAS_MEMSET "1" CACHE INTERNAL "Have symbol memset")
|
set(LIBC_HAS_LROUND "1" CACHE INTERNAL "Have symbol lround")
|
||||||
set(LIBC_HAS_MODF "1" CACHE INTERNAL "Have symbol modf")
|
set(LIBC_HAS_LROUNDF "1" CACHE INTERNAL "Have symbol lroundf")
|
||||||
set(LIBC_HAS_MODFF "1" CACHE INTERNAL "Have symbol modff")
|
set(LIBC_HAS_MALLOC "1" CACHE INTERNAL "Have symbol malloc")
|
||||||
set(LIBC_HAS_POW "1" CACHE INTERNAL "Have symbol pow")
|
set(LIBC_HAS_MALLOC_H "1" CACHE INTERNAL "Have include malloc.h")
|
||||||
set(LIBC_HAS_POWF "1" CACHE INTERNAL "Have symbol powf")
|
set(LIBC_HAS_MATH_H "1" CACHE INTERNAL "Have include math.h")
|
||||||
set(LIBC_HAS_PUTENV "1" CACHE INTERNAL "Have symbol putenv")
|
set(LIBC_HAS_MEMCMP "1" CACHE INTERNAL "Have symbol memcmp")
|
||||||
set(LIBC_HAS_REALLOC "1" CACHE INTERNAL "Have symbol realloc")
|
set(LIBC_HAS_MEMCPY "1" CACHE INTERNAL "Have symbol memcpy")
|
||||||
set(LIBC_HAS_RINDEX "" CACHE INTERNAL "Have symbol rindex")
|
set(LIBC_HAS_MEMMOVE "1" CACHE INTERNAL "Have symbol memmove")
|
||||||
set(LIBC_HAS_ROUND "1" CACHE INTERNAL "Have symbol round")
|
set(LIBC_HAS_MEMORY_H "1" CACHE INTERNAL "Have include memory.h")
|
||||||
set(LIBC_HAS_ROUNDF "1" CACHE INTERNAL "Have symbol roundf")
|
set(LIBC_HAS_MEMSET "1" CACHE INTERNAL "Have symbol memset")
|
||||||
set(LIBC_HAS_SCALBN "1" CACHE INTERNAL "Have symbol scalbn")
|
set(LIBC_HAS_MODF "1" CACHE INTERNAL "Have symbol modf")
|
||||||
set(LIBC_HAS_SCALBNF "1" CACHE INTERNAL "Have symbol scalbnf")
|
set(LIBC_HAS_MODFF "1" CACHE INTERNAL "Have symbol modff")
|
||||||
set(LIBC_HAS_SETENV "" CACHE INTERNAL "Have symbol setenv")
|
set(LIBC_HAS_POW "1" CACHE INTERNAL "Have symbol pow")
|
||||||
set(LIBC_HAS_SIGNAL_H "1" CACHE INTERNAL "Have include signal.h")
|
set(LIBC_HAS_POWF "1" CACHE INTERNAL "Have symbol powf")
|
||||||
set(LIBC_HAS_SIN "1" CACHE INTERNAL "Have symbol sin")
|
set(LIBC_HAS_PUTENV "1" CACHE INTERNAL "Have symbol putenv")
|
||||||
set(LIBC_HAS_SINF "1" CACHE INTERNAL "Have symbol sinf")
|
set(LIBC_HAS_REALLOC "1" CACHE INTERNAL "Have symbol realloc")
|
||||||
set(LIBC_HAS_SQR "" CACHE INTERNAL "Have symbol sqr")
|
set(LIBC_HAS_RINDEX "" CACHE INTERNAL "Have symbol rindex")
|
||||||
set(LIBC_HAS_SQRT "1" CACHE INTERNAL "Have symbol sqrt")
|
set(LIBC_HAS_ROUND "1" CACHE INTERNAL "Have symbol round")
|
||||||
set(LIBC_HAS_SQRTF "1" CACHE INTERNAL "Have symbol sqrtf")
|
set(LIBC_HAS_ROUNDF "1" CACHE INTERNAL "Have symbol roundf")
|
||||||
set(LIBC_HAS_SSCANF "1" CACHE INTERNAL "Have symbol sscanf")
|
set(LIBC_HAS_SCALBN "1" CACHE INTERNAL "Have symbol scalbn")
|
||||||
set(LIBC_HAS_STDARG_H "1" CACHE INTERNAL "Have include stdarg.h")
|
set(LIBC_HAS_SCALBNF "1" CACHE INTERNAL "Have symbol scalbnf")
|
||||||
set(LIBC_HAS_STDBOOL_H "1" CACHE INTERNAL "Have include stdbool.h")
|
set(LIBC_HAS_SETENV "" CACHE INTERNAL "Have symbol setenv")
|
||||||
set(LIBC_HAS_STDDEF_H "1" CACHE INTERNAL "Have include stddef.h")
|
set(LIBC_HAS_SIGNAL_H "1" CACHE INTERNAL "Have include signal.h")
|
||||||
set(LIBC_HAS_STDINT_H "1" CACHE INTERNAL "Have include stdint.h")
|
set(LIBC_HAS_SIN "1" CACHE INTERNAL "Have symbol sin")
|
||||||
set(LIBC_HAS_STDIO_H "1" CACHE INTERNAL "Have include stdio.h")
|
set(LIBC_HAS_SINF "1" CACHE INTERNAL "Have symbol sinf")
|
||||||
set(LIBC_HAS_STDLIB_H "1" CACHE INTERNAL "Have include stdlib.h")
|
set(LIBC_HAS_SQR "" CACHE INTERNAL "Have symbol sqr")
|
||||||
set(LIBC_HAS_STRCHR "1" CACHE INTERNAL "Have symbol strchr")
|
set(LIBC_HAS_SQRT "1" CACHE INTERNAL "Have symbol sqrt")
|
||||||
set(LIBC_HAS_STRCMP "1" CACHE INTERNAL "Have symbol strcmp")
|
set(LIBC_HAS_SQRTF "1" CACHE INTERNAL "Have symbol sqrtf")
|
||||||
set(LIBC_HAS_STRINGS_H "" CACHE INTERNAL "Have include strings.h")
|
set(LIBC_HAS_SSCANF "1" CACHE INTERNAL "Have symbol sscanf")
|
||||||
set(LIBC_HAS_STRING_H "1" CACHE INTERNAL "Have include string.h")
|
set(LIBC_HAS_STDARG_H "1" CACHE INTERNAL "Have include stdarg.h")
|
||||||
set(LIBC_HAS_STRLCAT "" CACHE INTERNAL "Have symbol strlcat")
|
set(LIBC_HAS_STDBOOL_H "1" CACHE INTERNAL "Have include stdbool.h")
|
||||||
set(LIBC_HAS_STRLCPY "" CACHE INTERNAL "Have symbol strlcpy")
|
set(LIBC_HAS_STDDEF_H "1" CACHE INTERNAL "Have include stddef.h")
|
||||||
set(LIBC_HAS_STRLEN "1" CACHE INTERNAL "Have symbol strlen")
|
set(LIBC_HAS_STDINT_H "1" CACHE INTERNAL "Have include stdint.h")
|
||||||
set(LIBC_HAS_STRNCMP "1" CACHE INTERNAL "Have symbol strncmp")
|
set(LIBC_HAS_STDIO_H "1" CACHE INTERNAL "Have include stdio.h")
|
||||||
set(LIBC_HAS_STRNLEN "1" CACHE INTERNAL "Have symbol strnlen")
|
set(LIBC_HAS_STDLIB_H "1" CACHE INTERNAL "Have include stdlib.h")
|
||||||
set(LIBC_HAS_STRNSTR "" CACHE INTERNAL "Have symbol strnstr")
|
set(LIBC_HAS_STRCHR "1" CACHE INTERNAL "Have symbol strchr")
|
||||||
set(LIBC_HAS_STRPBRK "1" CACHE INTERNAL "Have symbol strpbrk")
|
set(LIBC_HAS_STRCMP "1" CACHE INTERNAL "Have symbol strcmp")
|
||||||
set(LIBC_HAS_STRRCHR "1" CACHE INTERNAL "Have symbol strrchr")
|
set(LIBC_HAS_STRINGS_H "" CACHE INTERNAL "Have include strings.h")
|
||||||
set(LIBC_HAS_STRSTR "1" CACHE INTERNAL "Have symbol strstr")
|
set(LIBC_HAS_STRING_H "1" CACHE INTERNAL "Have include string.h")
|
||||||
set(LIBC_HAS_STRTOD "1" CACHE INTERNAL "Have symbol strtod")
|
set(LIBC_HAS_STRLCAT "" CACHE INTERNAL "Have symbol strlcat")
|
||||||
set(LIBC_HAS_STRTOK_R "" CACHE INTERNAL "Have symbol strtok_r")
|
set(LIBC_HAS_STRLCPY "" CACHE INTERNAL "Have symbol strlcpy")
|
||||||
set(LIBC_HAS_STRTOL "1" CACHE INTERNAL "Have symbol strtol")
|
set(LIBC_HAS_STRLEN "1" CACHE INTERNAL "Have symbol strlen")
|
||||||
set(LIBC_HAS_STRTOLL "1" CACHE INTERNAL "Have symbol strtoll")
|
set(LIBC_HAS_STRNCMP "1" CACHE INTERNAL "Have symbol strncmp")
|
||||||
set(LIBC_HAS_STRTOUL "1" CACHE INTERNAL "Have symbol strtoul")
|
set(LIBC_HAS_STRNLEN "1" CACHE INTERNAL "Have symbol strnlen")
|
||||||
set(LIBC_HAS_STRTOULL "1" CACHE INTERNAL "Have symbol strtoull")
|
set(LIBC_HAS_STRNSTR "" CACHE INTERNAL "Have symbol strnstr")
|
||||||
set(LIBC_HAS_SYS_TYPES_H "1" CACHE INTERNAL "Have include sys/types.h")
|
set(LIBC_HAS_STRPBRK "1" CACHE INTERNAL "Have symbol strpbrk")
|
||||||
set(LIBC_HAS_TAN "1" CACHE INTERNAL "Have symbol tan")
|
set(LIBC_HAS_STRRCHR "1" CACHE INTERNAL "Have symbol strrchr")
|
||||||
set(LIBC_HAS_TANF "1" CACHE INTERNAL "Have symbol tanf")
|
set(LIBC_HAS_STRSTR "1" CACHE INTERNAL "Have symbol strstr")
|
||||||
set(LIBC_HAS_TIME_H "1" CACHE INTERNAL "Have include time.h")
|
set(LIBC_HAS_STRTOD "1" CACHE INTERNAL "Have symbol strtod")
|
||||||
set(LIBC_HAS_TRUNC "1" CACHE INTERNAL "Have symbol trunc")
|
set(LIBC_HAS_STRTOK_R "" CACHE INTERNAL "Have symbol strtok_r")
|
||||||
set(LIBC_HAS_TRUNCF "1" CACHE INTERNAL "Have symbol truncf")
|
set(LIBC_HAS_STRTOL "1" CACHE INTERNAL "Have symbol strtol")
|
||||||
set(LIBC_HAS_UNSETENV "" CACHE INTERNAL "Have symbol unsetenv")
|
set(LIBC_HAS_STRTOLL "1" CACHE INTERNAL "Have symbol strtoll")
|
||||||
set(LIBC_HAS_VSNPRINTF "1" CACHE INTERNAL "Have symbol vsnprintf")
|
set(LIBC_HAS_STRTOUL "1" CACHE INTERNAL "Have symbol strtoul")
|
||||||
set(LIBC_HAS_VSSCANF "1" CACHE INTERNAL "Have symbol vsscanf")
|
set(LIBC_HAS_STRTOULL "1" CACHE INTERNAL "Have symbol strtoull")
|
||||||
set(LIBC_HAS_WCHAR_H "1" CACHE INTERNAL "Have include wchar.h")
|
set(LIBC_HAS_SYS_TYPES_H "1" CACHE INTERNAL "Have include sys/types.h")
|
||||||
set(LIBC_HAS_WCSCMP "1" CACHE INTERNAL "Have symbol wcscmp")
|
set(LIBC_HAS_TAN "1" CACHE INTERNAL "Have symbol tan")
|
||||||
set(LIBC_HAS_WCSDUP "1" CACHE INTERNAL "Have symbol wcsdup")
|
set(LIBC_HAS_TANF "1" CACHE INTERNAL "Have symbol tanf")
|
||||||
set(LIBC_HAS_WCSLCAT "" CACHE INTERNAL "Have symbol wcslcat")
|
set(LIBC_HAS_TIME_H "1" CACHE INTERNAL "Have include time.h")
|
||||||
set(LIBC_HAS_WCSLCPY "" CACHE INTERNAL "Have symbol wcslcpy")
|
set(LIBC_HAS_TRUNC "1" CACHE INTERNAL "Have symbol trunc")
|
||||||
set(LIBC_HAS_WCSLEN "1" CACHE INTERNAL "Have symbol wcslen")
|
set(LIBC_HAS_TRUNCF "1" CACHE INTERNAL "Have symbol truncf")
|
||||||
set(LIBC_HAS_WCSNCMP "1" CACHE INTERNAL "Have symbol wcsncmp")
|
set(LIBC_HAS_UNSETENV "" CACHE INTERNAL "Have symbol unsetenv")
|
||||||
set(LIBC_HAS_WCSNLEN "1" CACHE INTERNAL "Have symbol wcsnlen")
|
set(LIBC_HAS_VSNPRINTF "1" CACHE INTERNAL "Have symbol vsnprintf")
|
||||||
set(LIBC_HAS_WCSSTR "1" CACHE INTERNAL "Have symbol wcsstr")
|
set(LIBC_HAS_VSSCANF "1" CACHE INTERNAL "Have symbol vsscanf")
|
||||||
set(LIBC_HAS_WCSTOL "1" CACHE INTERNAL "Have symbol wcstol")
|
set(LIBC_HAS_WCHAR_H "1" CACHE INTERNAL "Have include wchar.h")
|
||||||
set(LIBC_HAS__EXIT "1" CACHE INTERNAL "Have symbol _Exit")
|
set(LIBC_HAS_WCSCMP "1" CACHE INTERNAL "Have symbol wcscmp")
|
||||||
set(LIBC_HAS__I64TOA "1" CACHE INTERNAL "Have symbol _i64toa")
|
set(LIBC_HAS_WCSDUP "1" CACHE INTERNAL "Have symbol wcsdup")
|
||||||
set(LIBC_HAS__LTOA "1" CACHE INTERNAL "Have symbol _ltoa")
|
set(LIBC_HAS_WCSLCAT "" CACHE INTERNAL "Have symbol wcslcat")
|
||||||
set(LIBC_HAS__STRREV "1" CACHE INTERNAL "Have symbol _strrev")
|
set(LIBC_HAS_WCSLCPY "" CACHE INTERNAL "Have symbol wcslcpy")
|
||||||
set(LIBC_HAS__UI64TOA "1" CACHE INTERNAL "Have symbol _ui64toa")
|
set(LIBC_HAS_WCSLEN "1" CACHE INTERNAL "Have symbol wcslen")
|
||||||
set(LIBC_HAS__UITOA "" CACHE INTERNAL "Have symbol _uitoa")
|
set(LIBC_HAS_WCSNCMP "1" CACHE INTERNAL "Have symbol wcsncmp")
|
||||||
set(LIBC_HAS__ULTOA "1" CACHE INTERNAL "Have symbol _ultoa")
|
set(LIBC_HAS_WCSNLEN "1" CACHE INTERNAL "Have symbol wcsnlen")
|
||||||
set(LIBC_HAS__WCSDUP "1" CACHE INTERNAL "Have symbol _wcsdup")
|
set(LIBC_HAS_WCSSTR "1" CACHE INTERNAL "Have symbol wcsstr")
|
||||||
set(LIBC_IS_GLIBC "" CACHE INTERNAL "Have symbol __GLIBC__")
|
set(LIBC_HAS_WCSTOL "1" CACHE INTERNAL "Have symbol wcstol")
|
||||||
set(_ALLOCA_IN_MALLOC_H "" CACHE INTERNAL "Have symbol _alloca")
|
set(LIBC_HAS__EXIT "1" CACHE INTERNAL "Have symbol _Exit")
|
||||||
|
set(LIBC_HAS__I64TOA "1" CACHE INTERNAL "Have symbol _i64toa")
|
||||||
|
set(LIBC_HAS__LTOA "1" CACHE INTERNAL "Have symbol _ltoa")
|
||||||
|
set(LIBC_HAS__STRREV "1" CACHE INTERNAL "Have symbol _strrev")
|
||||||
|
set(LIBC_HAS__UI64TOA "1" CACHE INTERNAL "Have symbol _ui64toa")
|
||||||
|
set(LIBC_HAS__UITOA "" CACHE INTERNAL "Have symbol _uitoa")
|
||||||
|
set(LIBC_HAS__ULTOA "1" CACHE INTERNAL "Have symbol _ultoa")
|
||||||
|
set(LIBC_HAS__WCSDUP "1" CACHE INTERNAL "Have symbol _wcsdup")
|
||||||
|
set(LIBC_IS_GLIBC "" CACHE INTERNAL "Have symbol __GLIBC__")
|
||||||
|
set(_ALLOCA_IN_MALLOC_H "" CACHE INTERNAL "Have symbol _alloca")
|
||||||
|
|
||||||
if(CHECK_CPU_ARCHITECTURE_X86)
|
if(CHECK_CPU_ARCHITECTURE_X86)
|
||||||
set(COMPILER_SUPPORTS_AVX "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_AVX")
|
set(COMPILER_SUPPORTS_AVX "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_AVX")
|
||||||
set(COMPILER_SUPPORTS_AVX2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_AVX2")
|
set(COMPILER_SUPPORTS_AVX2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_AVX2")
|
||||||
set(COMPILER_SUPPORTS_MMX "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_MMX")
|
set(COMPILER_SUPPORTS_MMX "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_MMX")
|
||||||
set(COMPILER_SUPPORTS_SSE "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE")
|
set(COMPILER_SUPPORTS_SSE "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE")
|
||||||
set(COMPILER_SUPPORTS_SSE2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE2")
|
set(COMPILER_SUPPORTS_SSE2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE2")
|
||||||
set(COMPILER_SUPPORTS_SSE3 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE3")
|
set(COMPILER_SUPPORTS_SSE3 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE3")
|
||||||
set(COMPILER_SUPPORTS_SSE4_1 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE4_1")
|
set(COMPILER_SUPPORTS_SSE4_1 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE4_1")
|
||||||
set(COMPILER_SUPPORTS_SSE4_2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE4_2")
|
set(COMPILER_SUPPORTS_SSE4_2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE4_2")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CHECK_CPU_ARCHITECTURE_X64)
|
if(CHECK_CPU_ARCHITECTURE_X64)
|
||||||
set(COMPILER_SUPPORTS_AVX "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_AVX")
|
set(COMPILER_SUPPORTS_AVX "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_AVX")
|
||||||
set(COMPILER_SUPPORTS_AVX2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_AVX2")
|
set(COMPILER_SUPPORTS_AVX2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_AVX2")
|
||||||
set(COMPILER_SUPPORTS_MMX "" CACHE INTERNAL "Test COMPILER_SUPPORTS_MMX")
|
set(COMPILER_SUPPORTS_MMX "" CACHE INTERNAL "Test COMPILER_SUPPORTS_MMX")
|
||||||
set(COMPILER_SUPPORTS_SSE "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE")
|
set(COMPILER_SUPPORTS_SSE "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE")
|
||||||
set(COMPILER_SUPPORTS_SSE2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE2")
|
set(COMPILER_SUPPORTS_SSE2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE2")
|
||||||
set(COMPILER_SUPPORTS_SSE3 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE3")
|
set(COMPILER_SUPPORTS_SSE3 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE3")
|
||||||
set(COMPILER_SUPPORTS_SSE4_1 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE4_1")
|
set(COMPILER_SUPPORTS_SSE4_1 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE4_1")
|
||||||
set(COMPILER_SUPPORTS_SSE4_2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE4_2")
|
set(COMPILER_SUPPORTS_SSE4_2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE4_2")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "19.1")
|
if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "19.1")
|
||||||
set(HAVE_ROAPI_H "1" CACHE INTERNAL "Have include roapi.h")
|
set(HAVE_ROAPI_H "1" CACHE INTERNAL "Have include roapi.h")
|
||||||
set(HAVE_WINDOWS_GAMING_INPUT_H "1" CACHE INTERNAL "Test HAVE_WINDOWS_GAMING_INPUT_H")
|
set(HAVE_WINDOWS_GAMING_INPUT_H "1" CACHE INTERNAL "Test HAVE_WINDOWS_GAMING_INPUT_H")
|
||||||
else()
|
else()
|
||||||
set(HAVE_ROAPI_H "" CACHE INTERNAL "Have include roapi.h")
|
set(HAVE_ROAPI_H "" CACHE INTERNAL "Have include roapi.h")
|
||||||
set(HAVE_WINDOWS_GAMING_INPUT_H "" CACHE INTERNAL "Test HAVE_WINDOWS_GAMING_INPUT_H")
|
set(HAVE_WINDOWS_GAMING_INPUT_H "" CACHE INTERNAL "Test HAVE_WINDOWS_GAMING_INPUT_H")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
endif()
|
endif()
|
||||||
|
@@ -49,10 +49,30 @@
|
|||||||
#include <SDL3/SDL_platform_defines.h>
|
#include <SDL3/SDL_platform_defines.h>
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
|
||||||
|
/* Most everything except Visual Studio 2008 and earlier has stdint.h now */
|
||||||
|
#if defined(_MSC_VER) && (_MSC_VER < 1600)
|
||||||
|
typedef signed __int8 int8_t;
|
||||||
|
typedef unsigned __int8 uint8_t;
|
||||||
|
typedef signed __int16 int16_t;
|
||||||
|
typedef unsigned __int16 uint16_t;
|
||||||
|
typedef signed __int32 int32_t;
|
||||||
|
typedef unsigned __int32 uint32_t;
|
||||||
|
typedef signed __int64 int64_t;
|
||||||
|
typedef unsigned __int64 uint64_t;
|
||||||
|
#ifndef _UINTPTR_T_DEFINED
|
||||||
|
#ifdef _WIN64
|
||||||
|
typedef unsigned __int64 uintptr_t;
|
||||||
|
#else
|
||||||
|
typedef unsigned int uintptr_t;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#include <stdint.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
|
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
|
||||||
defined(SDL_INCLUDE_INTTYPES_H)
|
defined(SDL_INCLUDE_INTTYPES_H)
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
@@ -40,16 +40,16 @@ static bool SupportsIMMDevice = false;
|
|||||||
|
|
||||||
// DirectX function pointers for audio
|
// DirectX function pointers for audio
|
||||||
static SDL_SharedObject *DSoundDLL = NULL;
|
static SDL_SharedObject *DSoundDLL = NULL;
|
||||||
typedef HRESULT(WINAPI *fnDirectSoundCreate8)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN);
|
typedef HRESULT (WINAPI *pfnDirectSoundCreate8)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN);
|
||||||
typedef HRESULT(WINAPI *fnDirectSoundEnumerateW)(LPDSENUMCALLBACKW, LPVOID);
|
typedef HRESULT (WINAPI *pfnDirectSoundEnumerateW)(LPDSENUMCALLBACKW, LPVOID);
|
||||||
typedef HRESULT(WINAPI *fnDirectSoundCaptureCreate8)(LPCGUID, LPDIRECTSOUNDCAPTURE8 *, LPUNKNOWN);
|
typedef HRESULT (WINAPI *pfnDirectSoundCaptureCreate8)(LPCGUID, LPDIRECTSOUNDCAPTURE8 *, LPUNKNOWN);
|
||||||
typedef HRESULT(WINAPI *fnDirectSoundCaptureEnumerateW)(LPDSENUMCALLBACKW, LPVOID);
|
typedef HRESULT (WINAPI *pfnDirectSoundCaptureEnumerateW)(LPDSENUMCALLBACKW, LPVOID);
|
||||||
typedef HRESULT(WINAPI *fnGetDeviceID)(LPCGUID, LPGUID);
|
typedef HRESULT (WINAPI *pfnGetDeviceID)(LPCGUID, LPGUID);
|
||||||
static fnDirectSoundCreate8 pDirectSoundCreate8 = NULL;
|
static pfnDirectSoundCreate8 pDirectSoundCreate8 = NULL;
|
||||||
static fnDirectSoundEnumerateW pDirectSoundEnumerateW = NULL;
|
static pfnDirectSoundEnumerateW pDirectSoundEnumerateW = NULL;
|
||||||
static fnDirectSoundCaptureCreate8 pDirectSoundCaptureCreate8 = NULL;
|
static pfnDirectSoundCaptureCreate8 pDirectSoundCaptureCreate8 = NULL;
|
||||||
static fnDirectSoundCaptureEnumerateW pDirectSoundCaptureEnumerateW = NULL;
|
static pfnDirectSoundCaptureEnumerateW pDirectSoundCaptureEnumerateW = NULL;
|
||||||
static fnGetDeviceID pGetDeviceID = NULL;
|
static pfnGetDeviceID pGetDeviceID = NULL;
|
||||||
|
|
||||||
#include <initguid.h>
|
#include <initguid.h>
|
||||||
DEFINE_GUID(SDL_DSDEVID_DefaultPlayback, 0xdef00000, 0x9c6d, 0x47ed, 0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03);
|
DEFINE_GUID(SDL_DSDEVID_DefaultPlayback, 0xdef00000, 0x9c6d, 0x47ed, 0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03);
|
||||||
@@ -85,7 +85,7 @@ static bool DSOUND_Load(void)
|
|||||||
// Now make sure we have DirectX 8 or better...
|
// Now make sure we have DirectX 8 or better...
|
||||||
#define DSOUNDLOAD(f) \
|
#define DSOUNDLOAD(f) \
|
||||||
{ \
|
{ \
|
||||||
p##f = (fn##f)SDL_LoadFunction(DSoundDLL, #f); \
|
p##f = (pfn##f)SDL_LoadFunction(DSoundDLL, #f); \
|
||||||
if (!p##f) \
|
if (!p##f) \
|
||||||
loaded = false; \
|
loaded = false; \
|
||||||
}
|
}
|
||||||
|
@@ -45,8 +45,8 @@
|
|||||||
|
|
||||||
// handle to Avrt.dll--Vista and later!--for flagging the callback thread as "Pro Audio" (low latency).
|
// handle to Avrt.dll--Vista and later!--for flagging the callback thread as "Pro Audio" (low latency).
|
||||||
static HMODULE libavrt = NULL;
|
static HMODULE libavrt = NULL;
|
||||||
typedef HANDLE(WINAPI *pfnAvSetMmThreadCharacteristicsW)(LPCWSTR, LPDWORD);
|
typedef HANDLE (WINAPI *pfnAvSetMmThreadCharacteristicsW)(LPCWSTR, LPDWORD);
|
||||||
typedef BOOL(WINAPI *pfnAvRevertMmThreadCharacteristics)(HANDLE);
|
typedef BOOL (WINAPI *pfnAvRevertMmThreadCharacteristics)(HANDLE);
|
||||||
static pfnAvSetMmThreadCharacteristicsW pAvSetMmThreadCharacteristicsW = NULL;
|
static pfnAvSetMmThreadCharacteristicsW pAvSetMmThreadCharacteristicsW = NULL;
|
||||||
static pfnAvRevertMmThreadCharacteristics pAvRevertMmThreadCharacteristics = NULL;
|
static pfnAvRevertMmThreadCharacteristics pAvRevertMmThreadCharacteristics = NULL;
|
||||||
|
|
||||||
|
@@ -324,18 +324,18 @@ static const GUID *SDLFmtToMFVidFmtGuid(SDL_PixelFormat format)
|
|||||||
|
|
||||||
// mf.dll ...
|
// mf.dll ...
|
||||||
static HMODULE libmf = NULL;
|
static HMODULE libmf = NULL;
|
||||||
typedef HRESULT(WINAPI *pfnMFEnumDeviceSources)(IMFAttributes *,IMFActivate ***,UINT32 *);
|
typedef HRESULT (WINAPI *pfnMFEnumDeviceSources)(IMFAttributes *,IMFActivate ***,UINT32 *);
|
||||||
typedef HRESULT(WINAPI *pfnMFCreateDeviceSource)(IMFAttributes *, IMFMediaSource **);
|
typedef HRESULT (WINAPI *pfnMFCreateDeviceSource)(IMFAttributes *, IMFMediaSource **);
|
||||||
static pfnMFEnumDeviceSources pMFEnumDeviceSources = NULL;
|
static pfnMFEnumDeviceSources pMFEnumDeviceSources = NULL;
|
||||||
static pfnMFCreateDeviceSource pMFCreateDeviceSource = NULL;
|
static pfnMFCreateDeviceSource pMFCreateDeviceSource = NULL;
|
||||||
|
|
||||||
// mfplat.dll ...
|
// mfplat.dll ...
|
||||||
static HMODULE libmfplat = NULL;
|
static HMODULE libmfplat = NULL;
|
||||||
typedef HRESULT(WINAPI *pfnMFStartup)(ULONG, DWORD);
|
typedef HRESULT (WINAPI *pfnMFStartup)(ULONG, DWORD);
|
||||||
typedef HRESULT(WINAPI *pfnMFShutdown)(void);
|
typedef HRESULT (WINAPI *pfnMFShutdown)(void);
|
||||||
typedef HRESULT(WINAPI *pfnMFCreateAttributes)(IMFAttributes **, UINT32);
|
typedef HRESULT (WINAPI *pfnMFCreateAttributes)(IMFAttributes **, UINT32);
|
||||||
typedef HRESULT(WINAPI *pfnMFCreateMediaType)(IMFMediaType **);
|
typedef HRESULT (WINAPI *pfnMFCreateMediaType)(IMFMediaType **);
|
||||||
typedef HRESULT(WINAPI *pfnMFGetStrideForBitmapInfoHeader)(DWORD, DWORD, LONG *);
|
typedef HRESULT (WINAPI *pfnMFGetStrideForBitmapInfoHeader)(DWORD, DWORD, LONG *);
|
||||||
|
|
||||||
static pfnMFStartup pMFStartup = NULL;
|
static pfnMFStartup pMFStartup = NULL;
|
||||||
static pfnMFShutdown pMFShutdown = NULL;
|
static pfnMFShutdown pMFShutdown = NULL;
|
||||||
@@ -345,7 +345,7 @@ static pfnMFGetStrideForBitmapInfoHeader pMFGetStrideForBitmapInfoHeader = NULL;
|
|||||||
|
|
||||||
// mfreadwrite.dll ...
|
// mfreadwrite.dll ...
|
||||||
static HMODULE libmfreadwrite = NULL;
|
static HMODULE libmfreadwrite = NULL;
|
||||||
typedef HRESULT(WINAPI *pfnMFCreateSourceReaderFromMediaSource)(IMFMediaSource *, IMFAttributes *, IMFSourceReader **);
|
typedef HRESULT (WINAPI *pfnMFCreateSourceReaderFromMediaSource)(IMFMediaSource *, IMFAttributes *, IMFSourceReader **);
|
||||||
static pfnMFCreateSourceReaderFromMediaSource pMFCreateSourceReaderFromMediaSource = NULL;
|
static pfnMFCreateSourceReaderFromMediaSource pMFCreateSourceReaderFromMediaSource = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
@@ -38,15 +38,15 @@ bool SDL_InitGameInput(IGameInput **ppGameInput)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef HRESULT (WINAPI *GameInputCreate_t)(IGameInput **gameInput);
|
typedef HRESULT (WINAPI *pfnGameInputCreate)(IGameInput **gameInput);
|
||||||
GameInputCreate_t GameInputCreateFunc = (GameInputCreate_t)SDL_LoadFunction(g_hGameInputDLL, "GameInputCreate");
|
pfnGameInputCreate pGameInputCreate = (pfnGameInputCreate)SDL_LoadFunction(g_hGameInputDLL, "GameInputCreate");
|
||||||
if (!GameInputCreateFunc) {
|
if (!pGameInputCreate) {
|
||||||
SDL_UnloadObject(g_hGameInputDLL);
|
SDL_UnloadObject(g_hGameInputDLL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
IGameInput *pGameInput = NULL;
|
IGameInput *pGameInput = NULL;
|
||||||
HRESULT hr = GameInputCreateFunc(&pGameInput);
|
HRESULT hr = pGameInputCreate(&pGameInput);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
SDL_UnloadObject(g_hGameInputDLL);
|
SDL_UnloadObject(g_hGameInputDLL);
|
||||||
return WIN_SetErrorFromHRESULT("GameInputCreate failed", hr);
|
return WIN_SetErrorFromHRESULT("GameInputCreate failed", hr);
|
||||||
|
@@ -37,16 +37,6 @@ typedef enum RO_INIT_TYPE
|
|||||||
} RO_INIT_TYPE;
|
} RO_INIT_TYPE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _WIN32_WINNT_VISTA
|
|
||||||
#define _WIN32_WINNT_VISTA 0x0600
|
|
||||||
#endif
|
|
||||||
#ifndef _WIN32_WINNT_WIN7
|
|
||||||
#define _WIN32_WINNT_WIN7 0x0601
|
|
||||||
#endif
|
|
||||||
#ifndef _WIN32_WINNT_WIN8
|
|
||||||
#define _WIN32_WINNT_WIN8 0x0602
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef LOAD_LIBRARY_SEARCH_SYSTEM32
|
#ifndef LOAD_LIBRARY_SEARCH_SYSTEM32
|
||||||
#define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800
|
#define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800
|
||||||
#endif
|
#endif
|
||||||
|
@@ -21,10 +21,39 @@
|
|||||||
|
|
||||||
// This is an include file for windows.h with the SDL build settings
|
// This is an include file for windows.h with the SDL build settings
|
||||||
|
|
||||||
#ifndef _INCLUDED_WINDOWS_H
|
#ifndef SDL_windows_h_
|
||||||
#define _INCLUDED_WINDOWS_H
|
#define SDL_windows_h_
|
||||||
|
|
||||||
#ifdef SDL_PLATFORM_WIN32
|
#ifdef SDL_PLATFORM_WIN32
|
||||||
|
|
||||||
|
#ifndef _WIN32_WINNT_NT4
|
||||||
|
#define _WIN32_WINNT_NT4 0x0400
|
||||||
|
#endif
|
||||||
|
#ifndef _WIN32_WINNT_WIN2K
|
||||||
|
#define _WIN32_WINNT_WIN2K 0x0500
|
||||||
|
#endif
|
||||||
|
#ifndef _WIN32_WINNT_WINXP
|
||||||
|
#define _WIN32_WINNT_WINXP 0x0501
|
||||||
|
#endif
|
||||||
|
#ifndef _WIN32_WINNT_WS03
|
||||||
|
#define _WIN32_WINNT_WS03 0x0502
|
||||||
|
#endif
|
||||||
|
#ifndef _WIN32_WINNT_VISTA
|
||||||
|
#define _WIN32_WINNT_VISTA 0x0600
|
||||||
|
#endif
|
||||||
|
#ifndef _WIN32_WINNT_WIN7
|
||||||
|
#define _WIN32_WINNT_WIN7 0x0601
|
||||||
|
#endif
|
||||||
|
#ifndef _WIN32_WINNT_WIN8
|
||||||
|
#define _WIN32_WINNT_WIN8 0x0602
|
||||||
|
#endif
|
||||||
|
#ifndef _WIN32_WINNT_WINBLUE
|
||||||
|
#define _WIN32_WINNT_WINBLUE 0x0603
|
||||||
|
#endif
|
||||||
|
#ifndef _WIN32_WINNT_WIN10
|
||||||
|
#define _WIN32_WINNT_WIN10 0x0A00
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef WIN32_LEAN_AND_MEAN
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
#define WIN32_LEAN_AND_MEAN 1
|
#define WIN32_LEAN_AND_MEAN 1
|
||||||
#endif
|
#endif
|
||||||
@@ -37,11 +66,17 @@
|
|||||||
#undef WINVER
|
#undef WINVER
|
||||||
#undef _WIN32_WINNT
|
#undef _WIN32_WINNT
|
||||||
#if defined(SDL_VIDEO_RENDER_D3D12) || defined(HAVE_DXGI1_6_H)
|
#if defined(SDL_VIDEO_RENDER_D3D12) || defined(HAVE_DXGI1_6_H)
|
||||||
#define _WIN32_WINNT 0xA00 // For D3D12, 0xA00 is required
|
#define _WIN32_WINNT _WIN32_WINNT_WIN10 // For D3D12, 0xA00 is required
|
||||||
#elif defined(HAVE_SHELLSCALINGAPI_H)
|
#elif defined(HAVE_SHELLSCALINGAPI_H)
|
||||||
#define _WIN32_WINNT 0x603 // For DPI support
|
#define _WIN32_WINNT _WIN32_WINNT_WINBLUE // For DPI support
|
||||||
|
#elif defined(HAVE_ROAPI_H)
|
||||||
|
#define _WIN32_WINNT _WIN32_WINNT_WIN8
|
||||||
|
#elif defined(HAVE_SENSORSAPI_H)
|
||||||
|
#define _WIN32_WINNT _WIN32_WINNT_WIN7
|
||||||
|
#elif defined(HAVE_MMDEVICEAPI_H)
|
||||||
|
#define _WIN32_WINNT _WIN32_WINNT_VISTA
|
||||||
#else
|
#else
|
||||||
#define _WIN32_WINNT 0x501 // Need 0x410 for AlphaBlend() and 0x500 for EnumDisplayDevices(), 0x501 for raw input
|
#define _WIN32_WINNT _WIN32_WINNT_WINXP // Need 0x410 for AlphaBlend() and 0x500 for EnumDisplayDevices(), 0x501 for raw input
|
||||||
#endif
|
#endif
|
||||||
#define WINVER _WIN32_WINNT
|
#define WINVER _WIN32_WINNT
|
||||||
|
|
||||||
@@ -173,4 +208,4 @@ extern int WIN_WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWCH lpWideCh
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // _INCLUDED_WINDOWS_H
|
#endif // SDL_windows_h_
|
||||||
|
@@ -29,9 +29,226 @@
|
|||||||
#include "../../core/windows/SDL_windows.h"
|
#include "../../core/windows/SDL_windows.h"
|
||||||
#include "../../thread/SDL_systhread.h"
|
#include "../../thread/SDL_systhread.h"
|
||||||
|
|
||||||
|
#if WINVER < _WIN32_WINNT_VISTA
|
||||||
|
typedef struct _COMDLG_FILTERSPEC
|
||||||
|
{
|
||||||
|
LPCWSTR pszName;
|
||||||
|
LPCWSTR pszSpec;
|
||||||
|
} COMDLG_FILTERSPEC;
|
||||||
|
|
||||||
|
typedef enum FDE_OVERWRITE_RESPONSE
|
||||||
|
{
|
||||||
|
FDEOR_DEFAULT
|
||||||
|
FDEOR_ACCEPT
|
||||||
|
FDEOR_REFUSE
|
||||||
|
} FDE_OVERWRITE_RESPONSE;
|
||||||
|
|
||||||
|
typedef enum FDE_SHAREVIOLATION_RESPONSE
|
||||||
|
{
|
||||||
|
FDESVR_DEFAULT
|
||||||
|
FDESVR_ACCEPT
|
||||||
|
FDESVR_REFUSE
|
||||||
|
} FDE_SHAREVIOLATION_RESPONSE;
|
||||||
|
|
||||||
|
typedef enum FDAP
|
||||||
|
{
|
||||||
|
FDAP_BOTTOM
|
||||||
|
FDAP_TOP
|
||||||
|
} FDAP;
|
||||||
|
|
||||||
|
typedef ULONG SFGAOF;
|
||||||
|
|
||||||
|
typedef enum GETPROPERTYSTOREFLAGS
|
||||||
|
{
|
||||||
|
GPS_DEFAULT = 0x0,
|
||||||
|
GPS_HANDLERPROPERTIESONLY = 0x1,
|
||||||
|
GPS_READWRITE = 0x2,
|
||||||
|
GPS_TEMPORARY = 0x4,
|
||||||
|
GPS_FASTPROPERTIESONLY = 0x8,
|
||||||
|
GPS_OPENSLOWITEM = 0x10,
|
||||||
|
GPS_DELAYCREATION = 0x20,
|
||||||
|
GPS_BESTEFFORT = 0x40,
|
||||||
|
GPS_NO_OPLOCK = 0x80,
|
||||||
|
GPS_PREFERQUERYPROPERTIES = 0x100,
|
||||||
|
GPS_EXTRINSICPROPERTIES = 0x200,
|
||||||
|
GPS_EXTRINSICPROPERTIESONLY = 0x400,
|
||||||
|
GPS_VOLATILEPROPERTIES = 0x800,
|
||||||
|
GPS_VOLATILEPROPERTIESONLY = 0x1000,
|
||||||
|
GPS_MASK_VALID = 0x1FFF
|
||||||
|
} GETPROPERTYSTOREFLAGS;
|
||||||
|
|
||||||
|
typedef struct _tagpropertykey {
|
||||||
|
GUID fmtid;
|
||||||
|
DWORD pid;
|
||||||
|
} PROPERTYKEY;
|
||||||
|
|
||||||
|
#define REFPROPERTYKEY const PROPERTYKEY * const
|
||||||
|
|
||||||
|
typedef DWORD SHCONTF;
|
||||||
|
|
||||||
|
#endif // WINVER < _WIN32_WINNT_VISTA
|
||||||
|
|
||||||
|
#ifndef __IFileDialog_FWD_DEFINED__
|
||||||
|
typedef struct IFileDialog IFileDialog;
|
||||||
|
#endif
|
||||||
|
#ifndef __IShellItem_FWD_DEFINED__
|
||||||
|
typedef struct IShellItem IShellItem;
|
||||||
|
#endif
|
||||||
|
#ifndef __IFileOpenDialog_FWD_DEFINED__
|
||||||
|
typedef struct IFileOpenDialog IFileOpenDialog;
|
||||||
|
#endif
|
||||||
|
#ifndef __IFileDialogEvents_FWD_DEFINED__
|
||||||
|
typedef struct IFileDialogEvents IFileDialogEvents;
|
||||||
|
#endif
|
||||||
|
#ifndef __IShellItemArray_FWD_DEFINED__
|
||||||
|
typedef struct IShellItemArray IShellItemArray;
|
||||||
|
#endif
|
||||||
|
#ifndef __IEnumShellItems_FWD_DEFINED__
|
||||||
|
typedef struct IEnumShellItems IEnumShellItems;
|
||||||
|
#endif
|
||||||
|
#ifndef __IShellItemFilter_FWD_DEFINED__
|
||||||
|
typedef struct IShellItemFilter IShellItemFilter;
|
||||||
|
#endif
|
||||||
|
#ifndef __IFileDialog2_FWD_DEFINED__
|
||||||
|
typedef struct IFileDialog2 IFileDialog2;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __IShellItemFilter_INTERFACE_DEFINED__
|
||||||
|
typedef struct IShellItemFilterVtbl
|
||||||
|
{
|
||||||
|
HRESULT (__stdcall *QueryInterface)(IShellItemFilter *This, REFIID riid, void **ppvObject);
|
||||||
|
ULONG (__stdcall *AddRef)(IShellItemFilter *This);
|
||||||
|
ULONG (__stdcall *Release)(IShellItemFilter *This);
|
||||||
|
HRESULT (__stdcall *IncludeItem)(IShellItemFilter *This, IShellItem *psi);
|
||||||
|
HRESULT (__stdcall *GetEnumFlagsForItem)(IShellItemFilter *This, IShellItem *psi, SHCONTF *pgrfFlags);
|
||||||
|
} IShellItemFilterVtbl;
|
||||||
|
|
||||||
|
struct IShellItemFilter
|
||||||
|
{
|
||||||
|
IShellItemFilterVtbl *lpVtbl;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // #ifndef __IShellItemFilter_INTERFACE_DEFINED__
|
||||||
|
|
||||||
|
#ifndef __IFileDialogEvents_INTERFACE_DEFINED__
|
||||||
|
typedef struct IFileDialogEventsVtbl
|
||||||
|
{
|
||||||
|
HRESULT (__stdcall *QueryInterface)(IFileDialogEvents *This, REFIID riid, void **ppvObject);
|
||||||
|
ULONG (__stdcall *AddRef)(IFileDialogEvents *This);
|
||||||
|
ULONG (__stdcall *Release)(IFileDialogEvents *This);
|
||||||
|
HRESULT (__stdcall *OnFileOk)(IFileDialogEvents *This, IFileDialog *pfd);
|
||||||
|
HRESULT (__stdcall *OnFolderChanging)(IFileDialogEvents *This, IFileDialog *pfd, IShellItem *psiFolder);
|
||||||
|
HRESULT (__stdcall *OnFolderChange)(IFileDialogEvents *This, IFileDialog *pfd);
|
||||||
|
HRESULT (__stdcall *OnSelectionChange)(IFileDialogEvents *This, IFileDialog *pfd);
|
||||||
|
HRESULT (__stdcall *OnShareViolation)(IFileDialogEvents *This, IFileDialog *pfd, IShellItem *psi, FDE_SHAREVIOLATION_RESPONSE *pResponse);
|
||||||
|
HRESULT (__stdcall *OnTypeChange)(IFileDialogEvents *This, IFileDialog *pfd);
|
||||||
|
HRESULT (__stdcall *OnOverwrite)(IFileDialogEvents *This, IFileDialog *pfd, IShellItem *psi, FDE_OVERWRITE_RESPONSE *pResponse);
|
||||||
|
} IFileDialogEventsVtbl;
|
||||||
|
|
||||||
|
struct IFileDialogEvents
|
||||||
|
{
|
||||||
|
IFileDialogEventsVtbl *lpVtbl;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // #ifndef __IFileDialogEvents_INTERFACE_DEFINED__
|
||||||
|
|
||||||
|
#ifndef __IShellItem_INTERFACE_DEFINED__
|
||||||
|
typedef enum _SIGDN {
|
||||||
|
SIGDN_NORMALDISPLAY = 0x00000000,
|
||||||
|
SIGDN_PARENTRELATIVEPARSING = 0x80018001,
|
||||||
|
SIGDN_DESKTOPABSOLUTEPARSING = 0x80028000,
|
||||||
|
SIGDN_PARENTRELATIVEEDITING = 0x80031001,
|
||||||
|
SIGDN_DESKTOPABSOLUTEEDITING = 0x8004C000,
|
||||||
|
SIGDN_FILESYSPATH = 0x80058000,
|
||||||
|
SIGDN_URL = 0x80068000,
|
||||||
|
SIGDN_PARENTRELATIVEFORADDRESSBAR = 0x8007C001,
|
||||||
|
SIGDN_PARENTRELATIVE = 0x80080001,
|
||||||
|
SIGDN_PARENTRELATIVEFORUI = 0x80094001
|
||||||
|
} SIGDN;
|
||||||
|
|
||||||
|
enum _SICHINTF {
|
||||||
|
SICHINT_DISPLAY = 0x00000000,
|
||||||
|
SICHINT_ALLFIELDS = 0x80000000,
|
||||||
|
SICHINT_CANONICAL = 0x10000000,
|
||||||
|
SICHINT_TEST_FILESYSPATH_IF_NOT_EQUAL = 0x20000000
|
||||||
|
};
|
||||||
|
typedef DWORD SICHINTF;
|
||||||
|
|
||||||
|
extern const IID IID_IShellItem;
|
||||||
|
|
||||||
|
typedef struct IShellItemVtbl
|
||||||
|
{
|
||||||
|
HRESULT (__stdcall *QueryInterface)(IShellItem *This, REFIID riid, void **ppvObject);
|
||||||
|
ULONG (__stdcall *AddRef)(IShellItem *This);
|
||||||
|
ULONG (__stdcall *Release)(IShellItem *This);
|
||||||
|
HRESULT (__stdcall *BindToHandler)(IShellItem *This, IBindCtx *pbc, REFGUID bhid, REFIID riid, void **ppv);
|
||||||
|
HRESULT (__stdcall *GetParent)(IShellItem *This, IShellItem **ppsi);
|
||||||
|
HRESULT (__stdcall *GetDisplayName)(IShellItem *This, SIGDN sigdnName, LPWSTR *ppszName);
|
||||||
|
HRESULT (__stdcall *GetAttributes)(IShellItem *This, SFGAOF sfgaoMask, SFGAOF *psfgaoAttribs);
|
||||||
|
HRESULT (__stdcall *Compare)(IShellItem *This, IShellItem *psi, SICHINTF hint, int *piOrder);
|
||||||
|
} IShellItemVtbl;
|
||||||
|
|
||||||
|
struct IShellItem
|
||||||
|
{
|
||||||
|
IShellItemVtbl *lpVtbl;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // #ifndef __IShellItem_INTERFACE_DEFINED__
|
||||||
|
|
||||||
|
#ifndef __IEnumShellItems_INTERFACE_DEFINED__
|
||||||
|
typedef struct IEnumShellItemsVtbl
|
||||||
|
{
|
||||||
|
HRESULT (__stdcall *QueryInterface)(IEnumShellItems *This, REFIID riid, void **ppvObject);
|
||||||
|
ULONG (__stdcall *AddRef)(IEnumShellItems *This);
|
||||||
|
ULONG (__stdcall *Release)(IEnumShellItems *This);
|
||||||
|
HRESULT (__stdcall *Next)(IEnumShellItems *This, ULONG celt, IShellItem **rgelt, ULONG *pceltFetched);
|
||||||
|
HRESULT (__stdcall *Skip)(IEnumShellItems *This, ULONG celt);
|
||||||
|
HRESULT (__stdcall *Reset)(IEnumShellItems *This);
|
||||||
|
HRESULT (__stdcall *Clone)(IEnumShellItems *This, IEnumShellItems **ppenum);
|
||||||
|
} IEnumShellItemsVtbl;
|
||||||
|
|
||||||
|
struct IEnumShellItems
|
||||||
|
{
|
||||||
|
IEnumShellItemsVtbl *lpVtbl;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // #ifndef __IEnumShellItems_INTERFACE_DEFINED__
|
||||||
|
|
||||||
|
#ifndef __IShellItemArray_INTERFACE_DEFINED__
|
||||||
|
typedef enum SIATTRIBFLAGS
|
||||||
|
{
|
||||||
|
SIATTRIBFLAGS_AND = 0x1,
|
||||||
|
SIATTRIBFLAGS_OR = 0x2,
|
||||||
|
SIATTRIBFLAGS_APPCOMPAT = 0x3,
|
||||||
|
SIATTRIBFLAGS_MASK = 0x3,
|
||||||
|
SIATTRIBFLAGS_ALLITEMS = 0x4000
|
||||||
|
} SIATTRIBFLAGS;
|
||||||
|
|
||||||
|
typedef struct IShellItemArrayVtbl
|
||||||
|
{
|
||||||
|
HRESULT (__stdcall *QueryInterface)(IShellItemArray *This, REFIID riid, void **ppvObject);
|
||||||
|
ULONG (__stdcall *AddRef)(IShellItemArray *This);
|
||||||
|
ULONG (__stdcall *Release)(IShellItemArray *This);
|
||||||
|
HRESULT (__stdcall *BindToHandler)(IShellItemArray *This, IBindCtx *pbc, REFGUID bhid, REFIID riid, void **ppvOut);
|
||||||
|
HRESULT (__stdcall *GetPropertyStore)(IShellItemArray *This, GETPROPERTYSTOREFLAGS flags, REFIID riid, void **ppv);
|
||||||
|
HRESULT (__stdcall *GetPropertyDescriptionList)(IShellItemArray *This, REFPROPERTYKEY keyType, REFIID riid, void **ppv);
|
||||||
|
HRESULT (__stdcall *GetAttributes)(IShellItemArray *This, SIATTRIBFLAGS AttribFlags, SFGAOF sfgaoMask, SFGAOF *psfgaoAttribs);
|
||||||
|
HRESULT (__stdcall *GetCount)(IShellItemArray *This, DWORD *pdwNumItems);
|
||||||
|
HRESULT (__stdcall *GetItemAt)(IShellItemArray *This, DWORD dwIndex, IShellItem **ppsi);
|
||||||
|
HRESULT (__stdcall *EnumItems)(IShellItemArray *This, IEnumShellItems **ppenumShellItems);
|
||||||
|
} IShellItemArrayVtbl;
|
||||||
|
|
||||||
|
struct IShellItemArray
|
||||||
|
{
|
||||||
|
IShellItemArrayVtbl *lpVtbl;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // #ifndef __IShellItemArray_INTERFACE_DEFINED__
|
||||||
|
|
||||||
// Flags/GUIDs defined for compatibility with pre-Vista headers
|
// Flags/GUIDs defined for compatibility with pre-Vista headers
|
||||||
#ifndef __IFileDialog_INTERFACE_DEFINED__
|
#ifndef __IFileDialog_INTERFACE_DEFINED__
|
||||||
enum _FILEOPENDIALOGOPTIONS {
|
enum _FILEOPENDIALOGOPTIONS
|
||||||
|
{
|
||||||
FOS_OVERWRITEPROMPT = 0x2,
|
FOS_OVERWRITEPROMPT = 0x2,
|
||||||
FOS_STRICTFILETYPES = 0x4,
|
FOS_STRICTFILETYPES = 0x4,
|
||||||
FOS_NOCHANGEDIR = 0x8,
|
FOS_NOCHANGEDIR = 0x8,
|
||||||
@@ -49,6 +266,7 @@ enum _FILEOPENDIALOGOPTIONS {
|
|||||||
FOS_HIDEMRUPLACES = 0x20000,
|
FOS_HIDEMRUPLACES = 0x20000,
|
||||||
FOS_HIDEPINNEDPLACES = 0x40000,
|
FOS_HIDEPINNEDPLACES = 0x40000,
|
||||||
FOS_NODEREFERENCELINKS = 0x100000,
|
FOS_NODEREFERENCELINKS = 0x100000,
|
||||||
|
FOS_OKBUTTONNEEDSINTERACTION = 0x200000,
|
||||||
FOS_DONTADDTORECENT = 0x2000000,
|
FOS_DONTADDTORECENT = 0x2000000,
|
||||||
FOS_FORCESHOWHIDDEN = 0x10000000,
|
FOS_FORCESHOWHIDDEN = 0x10000000,
|
||||||
FOS_DEFAULTNOMINIMODE = 0x20000000,
|
FOS_DEFAULTNOMINIMODE = 0x20000000,
|
||||||
@@ -58,133 +276,127 @@ enum _FILEOPENDIALOGOPTIONS {
|
|||||||
|
|
||||||
typedef DWORD FILEOPENDIALOGOPTIONS;
|
typedef DWORD FILEOPENDIALOGOPTIONS;
|
||||||
|
|
||||||
typedef enum FDAP {
|
extern const IID IID_IFileDialog;
|
||||||
FDAP_BOTTOM = 0,
|
|
||||||
FDAP_TOP = 1
|
|
||||||
} FDAP;
|
|
||||||
|
|
||||||
/* *INDENT-OFF* */ // clang-format off
|
|
||||||
typedef struct IFileDialogVtbl
|
typedef struct IFileDialogVtbl
|
||||||
{
|
{
|
||||||
HRESULT (STDMETHODCALLTYPE *QueryInterface)(IFileDialog *, REFIID, void **);
|
HRESULT (__stdcall *QueryInterface)(IFileDialog *This, REFIID riid, void **ppvObject);
|
||||||
ULONG (STDMETHODCALLTYPE *AddRef)(IFileDialog *);
|
ULONG (__stdcall *AddRef)(IFileDialog *This);
|
||||||
ULONG (STDMETHODCALLTYPE *Release)(IFileDialog *);
|
ULONG (__stdcall *Release)(IFileDialog *This);
|
||||||
HRESULT (STDMETHODCALLTYPE *Show)(IFileDialog *, HWND);
|
HRESULT (__stdcall *Show)(IFileDialog *This, HWND hwndOwner);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFileTypes)(IFileDialog *, UINT, const COMDLG_FILTERSPEC *);
|
HRESULT (__stdcall *SetFileTypes)(IFileDialog *This, UINT cFileTypes, const COMDLG_FILTERSPEC *rgFilterSpec);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFileTypeIndex)(IFileDialog *, UINT);
|
HRESULT (__stdcall *SetFileTypeIndex)(IFileDialog *This, UINT iFileType);
|
||||||
HRESULT (STDMETHODCALLTYPE *GetFileTypeIndex)(IFileDialog *, UINT *);
|
HRESULT (__stdcall *GetFileTypeIndex)(IFileDialog *This, UINT *piFileType);
|
||||||
HRESULT (STDMETHODCALLTYPE *Advise)(IFileDialog *, IFileDialogEvents *, DWORD *);
|
HRESULT (__stdcall *Advise)(IFileDialog *This, IFileDialogEvents *pfde, DWORD *pdwCookie);
|
||||||
HRESULT (STDMETHODCALLTYPE *Unadvise)(IFileDialog *, DWORD);
|
HRESULT (__stdcall *Unadvise)(IFileDialog *This, DWORD dwCookie);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetOptions)(IFileDialog *, FILEOPENDIALOGOPTIONS);
|
HRESULT (__stdcall *SetOptions)(IFileDialog *This, FILEOPENDIALOGOPTIONS fos);
|
||||||
HRESULT (STDMETHODCALLTYPE *GetOptions)(IFileDialog *, FILEOPENDIALOGOPTIONS *);
|
HRESULT (__stdcall *GetOptions)(IFileDialog *This, FILEOPENDIALOGOPTIONS *pfos);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetDefaultFolder)(IFileDialog *, IShellItem *);
|
HRESULT (__stdcall *SetDefaultFolder)(IFileDialog *This, IShellItem *psi);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFolder)(IFileDialog *, IShellItem *);
|
HRESULT (__stdcall *SetFolder)(IFileDialog *This, IShellItem *psi);
|
||||||
HRESULT (STDMETHODCALLTYPE *GetFolder)(IFileDialog *, IShellItem **);
|
HRESULT (__stdcall *GetFolder)(IFileDialog *This, IShellItem **ppsi);
|
||||||
HRESULT (STDMETHODCALLTYPE *GetCurrentSelection)(IFileDialog *, IShellItem **);
|
HRESULT (__stdcall *GetCurrentSelection)(IFileDialog *This, IShellItem **ppsi);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFileName)(IFileDialog *, LPCWSTR);
|
HRESULT (__stdcall *SetFileName)(IFileDialog *This, LPCWSTR pszName);
|
||||||
HRESULT (STDMETHODCALLTYPE *GetFileName)(IFileDialog *, LPWSTR *);
|
HRESULT (__stdcall *GetFileName)(IFileDialog *This, LPWSTR *pszName);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetTitle)(IFileDialog *, LPCWSTR);
|
HRESULT (__stdcall *SetTitle)(IFileDialog *This, LPCWSTR pszTitle);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetOkButtonLabel)(IFileDialog *, LPCWSTR);
|
HRESULT (__stdcall *SetOkButtonLabel)(IFileDialog *This, LPCWSTR pszText);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFileNameLabel)(IFileDialog *, LPCWSTR);
|
HRESULT (__stdcall *SetFileNameLabel)(IFileDialog *This, LPCWSTR pszLabel);
|
||||||
HRESULT (STDMETHODCALLTYPE *GetResult)(IFileDialog *, IShellItem **);
|
HRESULT (__stdcall *GetResult)(IFileDialog *This, IShellItem **ppsi);
|
||||||
HRESULT (STDMETHODCALLTYPE *AddPlace)(IFileDialog *, IShellItem *, FDAP);
|
HRESULT (__stdcall *AddPlace)(IFileDialog *This, IShellItem *psi, FDAP fdap);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetDefaultExtension)(IFileDialog *, LPCWSTR);
|
HRESULT (__stdcall *SetDefaultExtension)(IFileDialog *This, LPCWSTR pszDefaultExtension);
|
||||||
HRESULT (STDMETHODCALLTYPE *Close)(IFileDialog *, HRESULT);
|
HRESULT (__stdcall *Close)(IFileDialog *This, HRESULT hr);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetClientGuid)(IFileDialog *, REFGUID);
|
HRESULT (__stdcall *SetClientGuid)(IFileDialog *This, REFGUID guid);
|
||||||
HRESULT (STDMETHODCALLTYPE *ClearClientData)(IFileDialog *);
|
HRESULT (__stdcall *ClearClientData)(IFileDialog *This);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFilter)(IFileDialog *,IShellItemFilter *);
|
HRESULT (__stdcall *SetFilter)(IFileDialog *This, IShellItemFilter *pFilter);
|
||||||
} IFileDialogVtbl;
|
} IFileDialogVtbl;
|
||||||
/* *INDENT-ON* */ // clang-format on
|
|
||||||
|
|
||||||
struct IFileDialog
|
struct IFileDialog
|
||||||
{
|
{
|
||||||
const struct IFileDialogVtbl *lpVtbl;
|
IFileDialogVtbl *lpVtbl;
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __IFileDialog2_INTERFACE_DEFINED__
|
#endif // #ifndef __IFileDialog_INTERFACE_DEFINED__
|
||||||
/* *INDENT-OFF* */ // clang-format off
|
|
||||||
typedef struct IFileDialog2Vtbl
|
|
||||||
{
|
|
||||||
HRESULT (STDMETHODCALLTYPE *QueryInterface)(IFileDialog2 *, REFIID, void **);
|
|
||||||
ULONG (STDMETHODCALLTYPE *AddRef)(IFileDialog2 *);
|
|
||||||
ULONG (STDMETHODCALLTYPE *Release)(IFileDialog2 *);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *Show)(IFileDialog2 *, HWND);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFileTypes)(IFileDialog2 *, UINT, const COMDLG_FILTERSPEC *);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFileTypeIndex)(IFileDialog2 *, UINT);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *GetFileTypeIndex)(IFileDialog2 *, UINT *);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *Advise)(IFileDialog2 *, IFileDialogEvents *, DWORD *);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *Unadvise)(IFileDialog2 *, DWORD);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *SetOptions)(IFileDialog2 *, FILEOPENDIALOGOPTIONS);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *GetOptions)(IFileDialog2 *, FILEOPENDIALOGOPTIONS *);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *SetDefaultFolder)(IFileDialog2 *, IShellItem *);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFolder)(IFileDialog2 *, IShellItem *);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *GetFolder)(IFileDialog2 *, IShellItem **);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *GetCurrentSelection)(IFileDialog2 *, IShellItem **);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFileName)(IFileDialog2 *, LPCWSTR);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *GetFileName)(IFileDialog2 *, LPWSTR *);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *SetTitle)(IFileDialog2 *, LPCWSTR);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *SetOkButtonLabel)(IFileDialog2 *, LPCWSTR);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFileNameLabel)(IFileDialog2 *, LPCWSTR);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *GetResult)(IFileDialog2 *, IShellItem **);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *AddPlace)(IFileDialog2 *, IShellItem *, FDAP);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *SetDefaultExtension)(IFileDialog2 *, LPCWSTR);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *Close)(IFileDialog2 *, HRESULT);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *SetClientGuid)(IFileDialog2 *, REFGUID);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *ClearClientData)(IFileDialog2 *);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFilter)(IFileDialog2 *, IShellItemFilter *);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *SetCancelButtonLabel)(IFileDialog2 *, LPCWSTR);
|
|
||||||
HRESULT (STDMETHODCALLTYPE *SetNavigationRoot)(IFileDialog2 *, IShellItem *);
|
|
||||||
} IFileDialog2Vtbl;
|
|
||||||
/* *INDENT-ON* */ // clang-format on
|
|
||||||
|
|
||||||
struct IFileDialog2
|
|
||||||
{
|
|
||||||
const struct IFileDialog2Vtbl *lpVtbl;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __IFileOpenDialog_INTERFACE_DEFINED__
|
#ifndef __IFileOpenDialog_INTERFACE_DEFINED__
|
||||||
/* *INDENT-OFF* */ // clang-format off
|
|
||||||
typedef struct IFileOpenDialogVtbl
|
typedef struct IFileOpenDialogVtbl
|
||||||
{
|
{
|
||||||
HRESULT (STDMETHODCALLTYPE *QueryInterface)(IFileOpenDialog *, REFIID, void **);
|
HRESULT (__stdcall *QueryInterface)(IFileOpenDialog *This, REFIID riid, void **ppvObject);
|
||||||
ULONG (STDMETHODCALLTYPE *AddRef)(IFileOpenDialog *);
|
ULONG (__stdcall *AddRef)(IFileOpenDialog *This);
|
||||||
ULONG (STDMETHODCALLTYPE *Release)(IFileOpenDialog *);
|
ULONG (__stdcall *Release)(IFileOpenDialog *This);
|
||||||
HRESULT (STDMETHODCALLTYPE *Show)(IFileOpenDialog *, HWND);
|
HRESULT (__stdcall *Show)(IFileOpenDialog *This, HWND hwndOwner);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFileTypes)(IFileOpenDialog *, UINT, const COMDLG_FILTERSPEC *);
|
HRESULT (__stdcall *SetFileTypes)(IFileOpenDialog *This, UINT cFileTypes, const COMDLG_FILTERSPEC *rgFilterSpec);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFileTypeIndex)(IFileOpenDialog *, UINT);
|
HRESULT (__stdcall *SetFileTypeIndex)(IFileOpenDialog *This, UINT iFileType);
|
||||||
HRESULT (STDMETHODCALLTYPE *GetFileTypeIndex)(IFileOpenDialog *, UINT *);
|
HRESULT (__stdcall *GetFileTypeIndex)(IFileOpenDialog *This, UINT *piFileType);
|
||||||
HRESULT (STDMETHODCALLTYPE *Advise)(IFileOpenDialog *, IFileDialogEvents *, DWORD *);
|
HRESULT (__stdcall *Advise)(IFileOpenDialog *This, IFileDialogEvents *pfde, DWORD *pdwCookie);
|
||||||
HRESULT (STDMETHODCALLTYPE *Unadvise)(IFileOpenDialog *, DWORD);
|
HRESULT (__stdcall *Unadvise)(IFileOpenDialog *This, DWORD dwCookie);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetOptions)(IFileOpenDialog *, FILEOPENDIALOGOPTIONS);
|
HRESULT (__stdcall *SetOptions)(IFileOpenDialog *This, FILEOPENDIALOGOPTIONS fos);
|
||||||
HRESULT (STDMETHODCALLTYPE *GetOptions)(IFileOpenDialog *, FILEOPENDIALOGOPTIONS *);
|
HRESULT (__stdcall *GetOptions)(IFileOpenDialog *This, FILEOPENDIALOGOPTIONS *pfos);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetDefaultFolder)(IFileOpenDialog *, IShellItem *);
|
HRESULT (__stdcall *SetDefaultFolder)(IFileOpenDialog *This, IShellItem *psi);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFolder)(IFileOpenDialog *, IShellItem *);
|
HRESULT (__stdcall *SetFolder)(IFileOpenDialog *This, IShellItem *psi);
|
||||||
HRESULT (STDMETHODCALLTYPE *GetFolder)(IFileOpenDialog *, IShellItem **);
|
HRESULT (__stdcall *GetFolder)(IFileOpenDialog *This, IShellItem **ppsi);
|
||||||
HRESULT (STDMETHODCALLTYPE *GetCurrentSelection)(IFileOpenDialog *, IShellItem **);
|
HRESULT (__stdcall *GetCurrentSelection)(IFileOpenDialog *This, IShellItem **ppsi);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFileName)(IFileOpenDialog *, LPCWSTR);
|
HRESULT (__stdcall *SetFileName)(IFileOpenDialog *This, LPCWSTR pszName);
|
||||||
HRESULT (STDMETHODCALLTYPE *GetFileName)(IFileOpenDialog *, LPWSTR *);
|
HRESULT (__stdcall *GetFileName)(IFileOpenDialog *This, LPWSTR *pszName);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetTitle)(IFileOpenDialog *, LPCWSTR);
|
HRESULT (__stdcall *SetTitle)(IFileOpenDialog *This, LPCWSTR pszTitle);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetOkButtonLabel)(IFileOpenDialog *, LPCWSTR);
|
HRESULT (__stdcall *SetOkButtonLabel)(IFileOpenDialog *This, LPCWSTR pszText);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFileNameLabel)(IFileOpenDialog *, LPCWSTR);
|
HRESULT (__stdcall *SetFileNameLabel)(IFileOpenDialog *This, LPCWSTR pszLabel);
|
||||||
HRESULT (STDMETHODCALLTYPE *GetResult)(IFileOpenDialog *, IShellItem **);
|
HRESULT (__stdcall *GetResult)(IFileOpenDialog *This, IShellItem **ppsi);
|
||||||
HRESULT (STDMETHODCALLTYPE *AddPlace)(IFileOpenDialog *, IShellItem *, FDAP);
|
HRESULT (__stdcall *AddPlace)(IFileOpenDialog *This, IShellItem *psi, FDAP fdap);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetDefaultExtension)(IFileOpenDialog *, LPCWSTR);
|
HRESULT (__stdcall *SetDefaultExtension)(IFileOpenDialog *This, LPCWSTR pszDefaultExtension);
|
||||||
HRESULT (STDMETHODCALLTYPE *Close)(IFileOpenDialog *, HRESULT);
|
HRESULT (__stdcall *Close)(IFileOpenDialog *This, HRESULT hr);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetClientGuid)(IFileOpenDialog *, REFGUID);
|
HRESULT (__stdcall *SetClientGuid)(IFileOpenDialog *This, REFGUID guid);
|
||||||
HRESULT (STDMETHODCALLTYPE *ClearClientData)(IFileOpenDialog *);
|
HRESULT (__stdcall *ClearClientData)(IFileOpenDialog *This);
|
||||||
HRESULT (STDMETHODCALLTYPE *SetFilter)(IFileOpenDialog *, IShellItemFilter *);
|
HRESULT (__stdcall *SetFilter)(IFileOpenDialog *This, IShellItemFilter *pFilter);
|
||||||
HRESULT (STDMETHODCALLTYPE *GetResults)(IFileOpenDialog *, IShellItemArray **);
|
HRESULT (__stdcall *GetResults)(IFileOpenDialog *This, IShellItemArray **ppenum);
|
||||||
HRESULT (STDMETHODCALLTYPE *GetSelectedItems)(IFileOpenDialog *, IShellItemArray **);
|
HRESULT (__stdcall *GetSelectedItems)(IFileOpenDialog *This, IShellItemArray **ppsai);
|
||||||
} IFileOpenDialogVtbl;
|
} IFileOpenDialogVtbl;
|
||||||
/* *INDENT-ON* */ // clang-format on
|
|
||||||
|
|
||||||
struct IFileOpenDialog
|
struct IFileOpenDialog
|
||||||
{
|
{
|
||||||
const struct IFileOpenDialogVtbl *lpVtbl;
|
IFileOpenDialogVtbl *lpVtbl;
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
#endif // #ifndef __IFileOpenDialog_INTERFACE_DEFINED__
|
||||||
|
|
||||||
|
#ifndef __IFileDialog2_INTERFACE_DEFINED__
|
||||||
|
typedef struct IFileDialog2Vtbl
|
||||||
|
{
|
||||||
|
HRESULT (__stdcall *QueryInterface)(IFileDialog2 *This, REFIID riid, void **ppvObject);
|
||||||
|
ULONG (__stdcall *AddRef)(IFileDialog2 *This);
|
||||||
|
ULONG (__stdcall *Release)(IFileDialog2 *This);
|
||||||
|
HRESULT (__stdcall *Show)(IFileDialog2 *This, HWND hwndOwner);
|
||||||
|
HRESULT (__stdcall *SetFileTypes)(IFileDialog2 *This, UINT cFileTypes, const COMDLG_FILTERSPEC *rgFilterSpec);
|
||||||
|
HRESULT (__stdcall *SetFileTypeIndex)(IFileDialog2 *This, UINT iFileType);
|
||||||
|
HRESULT (__stdcall *GetFileTypeIndex)(IFileDialog2 *This, UINT *piFileType);
|
||||||
|
HRESULT (__stdcall *Advise)(IFileDialog2 *This, IFileDialogEvents *pfde, DWORD *pdwCookie);
|
||||||
|
HRESULT (__stdcall *Unadvise)(IFileDialog2 *This, DWORD dwCookie);
|
||||||
|
HRESULT (__stdcall *SetOptions)(IFileDialog2 *This, FILEOPENDIALOGOPTIONS fos);
|
||||||
|
HRESULT (__stdcall *GetOptions)(IFileDialog2 *This, FILEOPENDIALOGOPTIONS *pfos);
|
||||||
|
HRESULT (__stdcall *SetDefaultFolder)(IFileDialog2 *This, IShellItem *psi);
|
||||||
|
HRESULT (__stdcall *SetFolder)(IFileDialog2 *This, IShellItem *psi);
|
||||||
|
HRESULT (__stdcall *GetFolder)(IFileDialog2 *This, IShellItem **ppsi);
|
||||||
|
HRESULT (__stdcall *GetCurrentSelection)(IFileDialog2 *This, IShellItem **ppsi);
|
||||||
|
HRESULT (__stdcall *SetFileName)(IFileDialog2 *This, LPCWSTR pszName);
|
||||||
|
HRESULT (__stdcall *GetFileName)(IFileDialog2 *This, LPWSTR *pszName);
|
||||||
|
HRESULT (__stdcall *SetTitle)(IFileDialog2 *This, LPCWSTR pszTitle);
|
||||||
|
HRESULT (__stdcall *SetOkButtonLabel)(IFileDialog2 *This, LPCWSTR pszText);
|
||||||
|
HRESULT (__stdcall *SetFileNameLabel)(IFileDialog2 *This, LPCWSTR pszLabel);
|
||||||
|
HRESULT (__stdcall *GetResult)(IFileDialog2 *This, IShellItem **ppsi);
|
||||||
|
HRESULT (__stdcall *AddPlace)(IFileDialog2 *This, IShellItem *psi, FDAP fdap);
|
||||||
|
HRESULT (__stdcall *SetDefaultExtension)(IFileDialog2 *This, LPCWSTR pszDefaultExtension);
|
||||||
|
HRESULT (__stdcall *Close)(IFileDialog2 *This, HRESULT hr);
|
||||||
|
HRESULT (__stdcall *SetClientGuid)(IFileDialog2 *This, REFGUID guid);
|
||||||
|
HRESULT (__stdcall *ClearClientData)(IFileDialog2 *This);
|
||||||
|
HRESULT (__stdcall *SetFilter)(IFileDialog2 *This, IShellItemFilter *pFilter);
|
||||||
|
HRESULT (__stdcall *SetCancelButtonLabel)(IFileDialog2 *This, LPCWSTR pszLabel);
|
||||||
|
HRESULT (__stdcall *SetNavigationRoot)(IFileDialog2 *This, IShellItem *psi);
|
||||||
|
} IFileDialog2Vtbl;
|
||||||
|
|
||||||
|
struct IFileDialog2
|
||||||
|
{
|
||||||
|
IFileDialog2Vtbl *lpVtbl;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // #ifndef __IFileDialog2_INTERFACE_DEFINED__
|
||||||
|
|
||||||
/* *INDENT-OFF* */ // clang-format off
|
/* *INDENT-OFF* */ // clang-format off
|
||||||
static const CLSID SDL_CLSID_FileOpenDialog = { 0xdc1c5a9c, 0xe88a, 0x4dde, { 0xa5, 0xa1, 0x60, 0xf8, 0x2a, 0x20, 0xae, 0xf7 } };
|
static const CLSID SDL_CLSID_FileOpenDialog = { 0xdc1c5a9c, 0xe88a, 0x4dde, { 0xa5, 0xa1, 0x60, 0xf8, 0x2a, 0x20, 0xae, 0xf7 } };
|
||||||
@@ -306,6 +518,10 @@ bool windows_ShowModernFileFolderDialog(SDL_FileDialogType dialog_type, const ch
|
|||||||
bool success = false;
|
bool success = false;
|
||||||
bool co_init = false;
|
bool co_init = false;
|
||||||
|
|
||||||
|
if (!WIN_IsWindows7OrGreater()) {
|
||||||
|
goto quit;
|
||||||
|
}
|
||||||
|
|
||||||
// We can assume shell32 is already loaded here.
|
// We can assume shell32 is already loaded here.
|
||||||
shell32_handle = GetModuleHandle(TEXT("shell32.dll"));
|
shell32_handle = GetModuleHandle(TEXT("shell32.dll"));
|
||||||
if (!shell32_handle) {
|
if (!shell32_handle) {
|
||||||
|
@@ -29,6 +29,10 @@
|
|||||||
#include "../../core/windows/SDL_windows.h"
|
#include "../../core/windows/SDL_windows.h"
|
||||||
#include "../SDL_sysfilesystem.h"
|
#include "../SDL_sysfilesystem.h"
|
||||||
|
|
||||||
|
#ifndef COPY_FILE_NO_BUFFERING
|
||||||
|
#define COPY_FILE_NO_BUFFERING 0x00001000
|
||||||
|
#endif
|
||||||
|
|
||||||
bool SDL_SYS_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback cb, void *userdata)
|
bool SDL_SYS_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback cb, void *userdata)
|
||||||
{
|
{
|
||||||
SDL_EnumerationResult result = SDL_ENUM_CONTINUE;
|
SDL_EnumerationResult result = SDL_ENUM_CONTINUE;
|
||||||
|
@@ -128,8 +128,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Function Pointer Signatures
|
// Function Pointer Signatures
|
||||||
typedef HRESULT(WINAPI *PFN_CREATE_DXGI_FACTORY1)(const GUID *riid, void **ppFactory);
|
typedef HRESULT (WINAPI *pfnCreateDXGIFactory1)(const GUID *riid, void **ppFactory);
|
||||||
typedef HRESULT(WINAPI *PFN_DXGI_GET_DEBUG_INTERFACE)(const GUID *riid, void **ppDebug);
|
typedef HRESULT (WINAPI *pfnDXGIGetDebugInterface)(const GUID *riid, void **ppDebug);
|
||||||
|
|
||||||
// IIDs (from https://www.magnumdb.com/)
|
// IIDs (from https://www.magnumdb.com/)
|
||||||
static const IID D3D_IID_IDXGIFactory1 = { 0x770aae78, 0xf26f, 0x4dba, { 0xa8, 0x29, 0x25, 0x3c, 0x83, 0xd1, 0xb3, 0x87 } };
|
static const IID D3D_IID_IDXGIFactory1 = { 0x770aae78, 0xf26f, 0x4dba, { 0xa8, 0x29, 0x25, 0x3c, 0x83, 0xd1, 0xb3, 0x87 } };
|
||||||
@@ -863,7 +863,7 @@ struct D3D12Renderer
|
|||||||
BOOL supportsTearing;
|
BOOL supportsTearing;
|
||||||
SDL_SharedObject *d3d12_dll;
|
SDL_SharedObject *d3d12_dll;
|
||||||
ID3D12Device *device;
|
ID3D12Device *device;
|
||||||
PFN_D3D12_SERIALIZE_ROOT_SIGNATURE D3D12SerializeRootSignature_func;
|
PFN_D3D12_SERIALIZE_ROOT_SIGNATURE pD3D12SerializeRootSignature;
|
||||||
const char *semantic;
|
const char *semantic;
|
||||||
SDL_iconv_t iconv;
|
SDL_iconv_t iconv;
|
||||||
|
|
||||||
@@ -1700,7 +1700,7 @@ static void D3D12_INTERNAL_DestroyRenderer(D3D12Renderer *renderer)
|
|||||||
renderer->dxgidebug_dll = NULL;
|
renderer->dxgidebug_dll = NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
renderer->D3D12SerializeRootSignature_func = NULL;
|
renderer->pD3D12SerializeRootSignature = NULL;
|
||||||
|
|
||||||
if (renderer->iconv) {
|
if (renderer->iconv) {
|
||||||
SDL_iconv_close(renderer->iconv);
|
SDL_iconv_close(renderer->iconv);
|
||||||
@@ -2556,7 +2556,7 @@ static D3D12GraphicsRootSignature *D3D12_INTERNAL_CreateGraphicsRootSignature(
|
|||||||
// Serialize the root signature
|
// Serialize the root signature
|
||||||
ID3DBlob *serializedRootSignature;
|
ID3DBlob *serializedRootSignature;
|
||||||
ID3DBlob *errorBlob;
|
ID3DBlob *errorBlob;
|
||||||
HRESULT res = renderer->D3D12SerializeRootSignature_func(&rootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &serializedRootSignature, &errorBlob);
|
HRESULT res = renderer->pD3D12SerializeRootSignature(&rootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &serializedRootSignature, &errorBlob);
|
||||||
|
|
||||||
if (FAILED(res)) {
|
if (FAILED(res)) {
|
||||||
if (errorBlob) {
|
if (errorBlob) {
|
||||||
@@ -2786,7 +2786,7 @@ static D3D12ComputeRootSignature *D3D12_INTERNAL_CreateComputeRootSignature(
|
|||||||
|
|
||||||
ID3DBlob *serializedRootSignature;
|
ID3DBlob *serializedRootSignature;
|
||||||
ID3DBlob *errorBlob;
|
ID3DBlob *errorBlob;
|
||||||
HRESULT res = renderer->D3D12SerializeRootSignature_func(
|
HRESULT res = renderer->pD3D12SerializeRootSignature(
|
||||||
&rootSignatureDesc,
|
&rootSignatureDesc,
|
||||||
D3D_ROOT_SIGNATURE_VERSION_1,
|
D3D_ROOT_SIGNATURE_VERSION_1,
|
||||||
&serializedRootSignature,
|
&serializedRootSignature,
|
||||||
@@ -8339,8 +8339,8 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props)
|
|||||||
#else
|
#else
|
||||||
SDL_SharedObject *d3d12Dll;
|
SDL_SharedObject *d3d12Dll;
|
||||||
SDL_SharedObject *dxgiDll;
|
SDL_SharedObject *dxgiDll;
|
||||||
PFN_D3D12_CREATE_DEVICE D3D12CreateDeviceFunc;
|
PFN_D3D12_CREATE_DEVICE pD3D12CreateDevice;
|
||||||
PFN_CREATE_DXGI_FACTORY1 CreateDXGIFactoryFunc;
|
pfnCreateDXGIFactory1 pCreateDXGIFactory1;
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
ID3D12Device *device;
|
ID3D12Device *device;
|
||||||
IDXGIFactory1 *factory;
|
IDXGIFactory1 *factory;
|
||||||
@@ -8368,10 +8368,10 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D12CreateDeviceFunc = (PFN_D3D12_CREATE_DEVICE)SDL_LoadFunction(
|
pD3D12CreateDevice = (PFN_D3D12_CREATE_DEVICE)SDL_LoadFunction(
|
||||||
d3d12Dll,
|
d3d12Dll,
|
||||||
D3D12_CREATE_DEVICE_FUNC);
|
D3D12_CREATE_DEVICE_FUNC);
|
||||||
if (D3D12CreateDeviceFunc == NULL) {
|
if (pD3D12CreateDevice == NULL) {
|
||||||
SDL_LogWarn(SDL_LOG_CATEGORY_GPU, "D3D12: Could not find function " D3D12_CREATE_DEVICE_FUNC " in " D3D12_DLL);
|
SDL_LogWarn(SDL_LOG_CATEGORY_GPU, "D3D12: Could not find function " D3D12_CREATE_DEVICE_FUNC " in " D3D12_DLL);
|
||||||
SDL_UnloadObject(d3d12Dll);
|
SDL_UnloadObject(d3d12Dll);
|
||||||
return false;
|
return false;
|
||||||
@@ -8385,10 +8385,10 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY1)SDL_LoadFunction(
|
pCreateDXGIFactory1 = (pfnCreateDXGIFactory1)SDL_LoadFunction(
|
||||||
dxgiDll,
|
dxgiDll,
|
||||||
CREATE_DXGI_FACTORY1_FUNC);
|
CREATE_DXGI_FACTORY1_FUNC);
|
||||||
if (CreateDXGIFactoryFunc == NULL) {
|
if (pCreateDXGIFactory1 == NULL) {
|
||||||
SDL_LogWarn(SDL_LOG_CATEGORY_GPU, "D3D12: Could not find function " CREATE_DXGI_FACTORY1_FUNC " in " DXGI_DLL);
|
SDL_LogWarn(SDL_LOG_CATEGORY_GPU, "D3D12: Could not find function " CREATE_DXGI_FACTORY1_FUNC " in " DXGI_DLL);
|
||||||
SDL_UnloadObject(dxgiDll);
|
SDL_UnloadObject(dxgiDll);
|
||||||
return false;
|
return false;
|
||||||
@@ -8397,7 +8397,7 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props)
|
|||||||
// Can we create a device?
|
// Can we create a device?
|
||||||
|
|
||||||
// Create the DXGI factory
|
// Create the DXGI factory
|
||||||
res = CreateDXGIFactoryFunc(
|
res = pCreateDXGIFactory1(
|
||||||
&D3D_IID_IDXGIFactory1,
|
&D3D_IID_IDXGIFactory1,
|
||||||
(void **)&factory);
|
(void **)&factory);
|
||||||
if (FAILED(res)) {
|
if (FAILED(res)) {
|
||||||
@@ -8450,7 +8450,7 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props)
|
|||||||
SDL_COMPILE_TIME_ASSERT(featurelevel, D3D_FEATURE_LEVEL_CHOICE < D3D_FEATURE_LEVEL_11_1);
|
SDL_COMPILE_TIME_ASSERT(featurelevel, D3D_FEATURE_LEVEL_CHOICE < D3D_FEATURE_LEVEL_11_1);
|
||||||
|
|
||||||
// Check feature level 11_1 first, guarantees 64+ UAVs unlike 11_0 Tier1
|
// Check feature level 11_1 first, guarantees 64+ UAVs unlike 11_0 Tier1
|
||||||
res = D3D12CreateDeviceFunc(
|
res = pD3D12CreateDevice(
|
||||||
(IUnknown *)adapter,
|
(IUnknown *)adapter,
|
||||||
D3D_FEATURE_LEVEL_11_1,
|
D3D_FEATURE_LEVEL_11_1,
|
||||||
D3D_GUID(D3D_IID_ID3D12Device),
|
D3D_GUID(D3D_IID_ID3D12Device),
|
||||||
@@ -8459,7 +8459,7 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props)
|
|||||||
if (SUCCEEDED(res)) {
|
if (SUCCEEDED(res)) {
|
||||||
supports_64UAVs = true;
|
supports_64UAVs = true;
|
||||||
} else {
|
} else {
|
||||||
res = D3D12CreateDeviceFunc(
|
res = pD3D12CreateDevice(
|
||||||
(IUnknown *)adapter,
|
(IUnknown *)adapter,
|
||||||
D3D_FEATURE_LEVEL_CHOICE,
|
D3D_FEATURE_LEVEL_CHOICE,
|
||||||
D3D_GUID(D3D_IID_ID3D12Device),
|
D3D_GUID(D3D_IID_ID3D12Device),
|
||||||
@@ -8523,7 +8523,7 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props)
|
|||||||
#if !(defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)) && defined(HAVE_IDXGIINFOQUEUE)
|
#if !(defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)) && defined(HAVE_IDXGIINFOQUEUE)
|
||||||
static bool D3D12_INTERNAL_TryInitializeDXGIDebug(D3D12Renderer *renderer)
|
static bool D3D12_INTERNAL_TryInitializeDXGIDebug(D3D12Renderer *renderer)
|
||||||
{
|
{
|
||||||
PFN_DXGI_GET_DEBUG_INTERFACE DXGIGetDebugInterfaceFunc;
|
pfnDXGIGetDebugInterface pDXGIGetDebugInterface;
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
|
|
||||||
renderer->dxgidebug_dll = SDL_LoadObject(DXGIDEBUG_DLL);
|
renderer->dxgidebug_dll = SDL_LoadObject(DXGIDEBUG_DLL);
|
||||||
@@ -8531,19 +8531,19 @@ static bool D3D12_INTERNAL_TryInitializeDXGIDebug(D3D12Renderer *renderer)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DXGIGetDebugInterfaceFunc = (PFN_DXGI_GET_DEBUG_INTERFACE)SDL_LoadFunction(
|
pDXGIGetDebugInterface = (pfnDXGIGetDebugInterface)SDL_LoadFunction(
|
||||||
renderer->dxgidebug_dll,
|
renderer->dxgidebug_dll,
|
||||||
DXGI_GET_DEBUG_INTERFACE_FUNC);
|
DXGI_GET_DEBUG_INTERFACE_FUNC);
|
||||||
if (DXGIGetDebugInterfaceFunc == NULL) {
|
if (pDXGIGetDebugInterface == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = DXGIGetDebugInterfaceFunc(&D3D_IID_IDXGIDebug, (void **)&renderer->dxgiDebug);
|
res = pDXGIGetDebugInterface(&D3D_IID_IDXGIDebug, (void **)&renderer->dxgiDebug);
|
||||||
if (FAILED(res)) {
|
if (FAILED(res)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = DXGIGetDebugInterfaceFunc(&D3D_IID_IDXGIInfoQueue, (void **)&renderer->dxgiInfoQueue);
|
res = pDXGIGetDebugInterface(&D3D_IID_IDXGIInfoQueue, (void **)&renderer->dxgiInfoQueue);
|
||||||
if (FAILED(res)) {
|
if (FAILED(res)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -8554,17 +8554,17 @@ static bool D3D12_INTERNAL_TryInitializeDXGIDebug(D3D12Renderer *renderer)
|
|||||||
|
|
||||||
static bool D3D12_INTERNAL_TryInitializeD3D12Debug(D3D12Renderer *renderer)
|
static bool D3D12_INTERNAL_TryInitializeD3D12Debug(D3D12Renderer *renderer)
|
||||||
{
|
{
|
||||||
PFN_D3D12_GET_DEBUG_INTERFACE D3D12GetDebugInterfaceFunc;
|
PFN_D3D12_GET_DEBUG_INTERFACE pD3D12GetDebugInterface;
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
|
|
||||||
D3D12GetDebugInterfaceFunc = (PFN_D3D12_GET_DEBUG_INTERFACE)SDL_LoadFunction(
|
pD3D12GetDebugInterface = (PFN_D3D12_GET_DEBUG_INTERFACE)SDL_LoadFunction(
|
||||||
renderer->d3d12_dll,
|
renderer->d3d12_dll,
|
||||||
D3D12_GET_DEBUG_INTERFACE_FUNC);
|
D3D12_GET_DEBUG_INTERFACE_FUNC);
|
||||||
if (D3D12GetDebugInterfaceFunc == NULL) {
|
if (pD3D12GetDebugInterface == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = D3D12GetDebugInterfaceFunc(D3D_GUID(D3D_IID_ID3D12Debug), (void **)&renderer->d3d12Debug);
|
res = pD3D12GetDebugInterface(D3D_GUID(D3D_IID_ID3D12Debug), (void **)&renderer->d3d12Debug);
|
||||||
if (FAILED(res)) {
|
if (FAILED(res)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -8727,13 +8727,13 @@ static SDL_GPUDevice *D3D12_CreateDevice(bool debugMode, bool preferLowPower, SD
|
|||||||
PFN_D3D12_XBOX_CREATE_DEVICE D3D12XboxCreateDeviceFunc;
|
PFN_D3D12_XBOX_CREATE_DEVICE D3D12XboxCreateDeviceFunc;
|
||||||
D3D12XBOX_CREATE_DEVICE_PARAMETERS createDeviceParams;
|
D3D12XBOX_CREATE_DEVICE_PARAMETERS createDeviceParams;
|
||||||
#else
|
#else
|
||||||
PFN_CREATE_DXGI_FACTORY1 CreateDXGIFactoryFunc;
|
pfnCreateDXGIFactory1 pCreateDXGIFactory1;
|
||||||
IDXGIFactory1 *factory1;
|
IDXGIFactory1 *factory1;
|
||||||
IDXGIFactory5 *factory5;
|
IDXGIFactory5 *factory5;
|
||||||
IDXGIFactory6 *factory6;
|
IDXGIFactory6 *factory6;
|
||||||
DXGI_ADAPTER_DESC1 adapterDesc;
|
DXGI_ADAPTER_DESC1 adapterDesc;
|
||||||
LARGE_INTEGER umdVersion;
|
LARGE_INTEGER umdVersion;
|
||||||
PFN_D3D12_CREATE_DEVICE D3D12CreateDeviceFunc;
|
PFN_D3D12_CREATE_DEVICE pD3D12CreateDevice;
|
||||||
#endif
|
#endif
|
||||||
D3D12_FEATURE_DATA_ARCHITECTURE architecture;
|
D3D12_FEATURE_DATA_ARCHITECTURE architecture;
|
||||||
D3D12_COMMAND_QUEUE_DESC queueDesc;
|
D3D12_COMMAND_QUEUE_DESC queueDesc;
|
||||||
@@ -8764,16 +8764,16 @@ static SDL_GPUDevice *D3D12_CreateDevice(bool debugMode, bool preferLowPower, SD
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Load the CreateDXGIFactory1 function
|
// Load the CreateDXGIFactory1 function
|
||||||
CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY1)SDL_LoadFunction(
|
pCreateDXGIFactory1 = (pfnCreateDXGIFactory1)SDL_LoadFunction(
|
||||||
renderer->dxgi_dll,
|
renderer->dxgi_dll,
|
||||||
CREATE_DXGI_FACTORY1_FUNC);
|
CREATE_DXGI_FACTORY1_FUNC);
|
||||||
if (CreateDXGIFactoryFunc == NULL) {
|
if (pCreateDXGIFactory1 == NULL) {
|
||||||
D3D12_INTERNAL_DestroyRenderer(renderer);
|
D3D12_INTERNAL_DestroyRenderer(renderer);
|
||||||
SET_STRING_ERROR_AND_RETURN("Could not load function: " CREATE_DXGI_FACTORY1_FUNC, NULL);
|
SET_STRING_ERROR_AND_RETURN("Could not load function: " CREATE_DXGI_FACTORY1_FUNC, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the DXGI factory
|
// Create the DXGI factory
|
||||||
res = CreateDXGIFactoryFunc(
|
res = pCreateDXGIFactory1(
|
||||||
&D3D_IID_IDXGIFactory1,
|
&D3D_IID_IDXGIFactory1,
|
||||||
(void **)&factory1);
|
(void **)&factory1);
|
||||||
if (FAILED(res)) {
|
if (FAILED(res)) {
|
||||||
@@ -8898,19 +8898,19 @@ static SDL_GPUDevice *D3D12_CreateDevice(bool debugMode, bool preferLowPower, SD
|
|||||||
SET_STRING_ERROR_AND_RETURN("Could not load function: D3D12XboxCreateDevice", NULL);
|
SET_STRING_ERROR_AND_RETURN("Could not load function: D3D12XboxCreateDevice", NULL);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
D3D12CreateDeviceFunc = (PFN_D3D12_CREATE_DEVICE)SDL_LoadFunction(
|
pD3D12CreateDevice = (PFN_D3D12_CREATE_DEVICE)SDL_LoadFunction(
|
||||||
renderer->d3d12_dll,
|
renderer->d3d12_dll,
|
||||||
D3D12_CREATE_DEVICE_FUNC);
|
D3D12_CREATE_DEVICE_FUNC);
|
||||||
if (D3D12CreateDeviceFunc == NULL) {
|
if (pD3D12CreateDevice == NULL) {
|
||||||
D3D12_INTERNAL_DestroyRenderer(renderer);
|
D3D12_INTERNAL_DestroyRenderer(renderer);
|
||||||
SET_STRING_ERROR_AND_RETURN("Could not load function: " D3D12_CREATE_DEVICE_FUNC, NULL);
|
SET_STRING_ERROR_AND_RETURN("Could not load function: " D3D12_CREATE_DEVICE_FUNC, NULL);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
renderer->D3D12SerializeRootSignature_func = (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)SDL_LoadFunction(
|
renderer->pD3D12SerializeRootSignature = (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)SDL_LoadFunction(
|
||||||
renderer->d3d12_dll,
|
renderer->d3d12_dll,
|
||||||
D3D12_SERIALIZE_ROOT_SIGNATURE_FUNC);
|
D3D12_SERIALIZE_ROOT_SIGNATURE_FUNC);
|
||||||
if (renderer->D3D12SerializeRootSignature_func == NULL) {
|
if (renderer->pD3D12SerializeRootSignature == NULL) {
|
||||||
D3D12_INTERNAL_DestroyRenderer(renderer);
|
D3D12_INTERNAL_DestroyRenderer(renderer);
|
||||||
SET_STRING_ERROR_AND_RETURN("Could not load function: " D3D12_SERIALIZE_ROOT_SIGNATURE_FUNC, NULL);
|
SET_STRING_ERROR_AND_RETURN("Could not load function: " D3D12_SERIALIZE_ROOT_SIGNATURE_FUNC, NULL);
|
||||||
}
|
}
|
||||||
@@ -8971,7 +8971,7 @@ static SDL_GPUDevice *D3D12_CreateDevice(bool debugMode, bool preferLowPower, SD
|
|||||||
s_Device = renderer->device;
|
s_Device = renderer->device;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
res = D3D12CreateDeviceFunc(
|
res = pD3D12CreateDevice(
|
||||||
(IUnknown *)renderer->adapter,
|
(IUnknown *)renderer->adapter,
|
||||||
D3D_FEATURE_LEVEL_CHOICE,
|
D3D_FEATURE_LEVEL_CHOICE,
|
||||||
D3D_GUID(D3D_IID_ID3D12Device),
|
D3D_GUID(D3D_IID_ID3D12Device),
|
||||||
|
@@ -416,11 +416,15 @@ void WINDOWS_JoystickDetect(void)
|
|||||||
while (pCurList) {
|
while (pCurList) {
|
||||||
JoyStick_DeviceData *pListNext = NULL;
|
JoyStick_DeviceData *pListNext = NULL;
|
||||||
|
|
||||||
if (!pCurList->bXInputDevice) {
|
|
||||||
#ifdef SDL_HAPTIC_DINPUT
|
#ifdef SDL_HAPTIC_DINPUT
|
||||||
|
#ifdef SDL_JOYSTICK_XINPUT
|
||||||
|
if (!pCurList->bXInputDevice) {
|
||||||
SDL_DINPUT_HapticMaybeRemoveDevice(&pCurList->dxdevice);
|
SDL_DINPUT_HapticMaybeRemoveDevice(&pCurList->dxdevice);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
SDL_DINPUT_HapticMaybeRemoveDevice(&pCurList->dxdevice);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
SDL_PrivateJoystickRemoved(pCurList->nInstanceID);
|
SDL_PrivateJoystickRemoved(pCurList->nInstanceID);
|
||||||
|
|
||||||
@@ -432,11 +436,15 @@ void WINDOWS_JoystickDetect(void)
|
|||||||
|
|
||||||
for (pCurList = SYS_Joystick; pCurList; pCurList = pCurList->pNext) {
|
for (pCurList = SYS_Joystick; pCurList; pCurList = pCurList->pNext) {
|
||||||
if (pCurList->send_add_event) {
|
if (pCurList->send_add_event) {
|
||||||
if (!pCurList->bXInputDevice) {
|
|
||||||
#ifdef SDL_HAPTIC_DINPUT
|
#ifdef SDL_HAPTIC_DINPUT
|
||||||
|
#ifdef SDL_JOYSTICK_XINPUT
|
||||||
|
if (!pCurList->bXInputDevice) {
|
||||||
SDL_DINPUT_HapticMaybeAddDevice(&pCurList->dxdevice);
|
SDL_DINPUT_HapticMaybeAddDevice(&pCurList->dxdevice);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
SDL_DINPUT_HapticMaybeAddDevice(&pCurList->dxdevice);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
SDL_PrivateJoystickAdded(pCurList->nInstanceID);
|
SDL_PrivateJoystickAdded(pCurList->nInstanceID);
|
||||||
|
|
||||||
@@ -489,16 +497,18 @@ static int WINDOWS_JoystickGetDeviceSteamVirtualGamepadSlot(int device_index)
|
|||||||
device = device->pNext;
|
device = device->pNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SDL_JOYSTICK_XINPUT
|
||||||
if (device->bXInputDevice) {
|
if (device->bXInputDevice) {
|
||||||
// The slot for XInput devices can change as controllers are seated
|
// The slot for XInput devices can change as controllers are seated
|
||||||
return SDL_XINPUT_GetSteamVirtualGamepadSlot(device->XInputUserId);
|
return SDL_XINPUT_GetSteamVirtualGamepadSlot(device->XInputUserId);
|
||||||
} else {
|
|
||||||
return device->steam_virtual_gamepad_slot;
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
return device->steam_virtual_gamepad_slot;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int WINDOWS_JoystickGetDevicePlayerIndex(int device_index)
|
static int WINDOWS_JoystickGetDevicePlayerIndex(int device_index)
|
||||||
{
|
{
|
||||||
|
#ifdef SDL_JOYSTICK_XINPUT
|
||||||
JoyStick_DeviceData *device = SYS_Joystick;
|
JoyStick_DeviceData *device = SYS_Joystick;
|
||||||
int index;
|
int index;
|
||||||
|
|
||||||
@@ -507,6 +517,9 @@ static int WINDOWS_JoystickGetDevicePlayerIndex(int device_index)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return device->bXInputDevice ? (int)device->XInputUserId : -1;
|
return device->bXInputDevice ? (int)device->XInputUserId : -1;
|
||||||
|
#else
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void WINDOWS_JoystickSetDevicePlayerIndex(int device_index, int player_index)
|
static void WINDOWS_JoystickSetDevicePlayerIndex(int device_index, int player_index)
|
||||||
@@ -560,20 +573,22 @@ static bool WINDOWS_JoystickOpen(SDL_Joystick *joystick, int device_index)
|
|||||||
}
|
}
|
||||||
joystick->hwdata->guid = device->guid;
|
joystick->hwdata->guid = device->guid;
|
||||||
|
|
||||||
|
#ifdef SDL_JOYSTICK_XINPUT
|
||||||
if (device->bXInputDevice) {
|
if (device->bXInputDevice) {
|
||||||
return SDL_XINPUT_JoystickOpen(joystick, device);
|
return SDL_XINPUT_JoystickOpen(joystick, device);
|
||||||
} else {
|
|
||||||
return SDL_DINPUT_JoystickOpen(joystick, device);
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
return SDL_DINPUT_JoystickOpen(joystick, device);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool WINDOWS_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble)
|
static bool WINDOWS_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble)
|
||||||
{
|
{
|
||||||
|
#ifdef SDL_JOYSTICK_XINPUT
|
||||||
if (joystick->hwdata->bXInputDevice) {
|
if (joystick->hwdata->bXInputDevice) {
|
||||||
return SDL_XINPUT_JoystickRumble(joystick, low_frequency_rumble, high_frequency_rumble);
|
return SDL_XINPUT_JoystickRumble(joystick, low_frequency_rumble, high_frequency_rumble);
|
||||||
} else {
|
|
||||||
return SDL_DINPUT_JoystickRumble(joystick, low_frequency_rumble, high_frequency_rumble);
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
return SDL_DINPUT_JoystickRumble(joystick, low_frequency_rumble, high_frequency_rumble);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool WINDOWS_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble)
|
static bool WINDOWS_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble)
|
||||||
@@ -602,21 +617,27 @@ static void WINDOWS_JoystickUpdate(SDL_Joystick *joystick)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SDL_JOYSTICK_XINPUT
|
||||||
if (joystick->hwdata->bXInputDevice) {
|
if (joystick->hwdata->bXInputDevice) {
|
||||||
SDL_XINPUT_JoystickUpdate(joystick);
|
SDL_XINPUT_JoystickUpdate(joystick);
|
||||||
} else {
|
return;
|
||||||
SDL_DINPUT_JoystickUpdate(joystick);
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
SDL_DINPUT_JoystickUpdate(joystick);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function to close a joystick after use
|
// Function to close a joystick after use
|
||||||
static void WINDOWS_JoystickClose(SDL_Joystick *joystick)
|
static void WINDOWS_JoystickClose(SDL_Joystick *joystick)
|
||||||
{
|
{
|
||||||
|
#ifdef SDL_JOYSTICK_XINPUT
|
||||||
if (joystick->hwdata->bXInputDevice) {
|
if (joystick->hwdata->bXInputDevice) {
|
||||||
SDL_XINPUT_JoystickClose(joystick);
|
SDL_XINPUT_JoystickClose(joystick);
|
||||||
} else {
|
} else {
|
||||||
SDL_DINPUT_JoystickClose(joystick);
|
SDL_DINPUT_JoystickClose(joystick);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
SDL_DINPUT_JoystickClose(joystick);
|
||||||
|
#endif
|
||||||
|
|
||||||
SDL_free(joystick->hwdata);
|
SDL_free(joystick->hwdata);
|
||||||
}
|
}
|
||||||
|
@@ -37,9 +37,11 @@ typedef struct JoyStick_DeviceData
|
|||||||
char *joystickname;
|
char *joystickname;
|
||||||
Uint8 send_add_event;
|
Uint8 send_add_event;
|
||||||
SDL_JoystickID nInstanceID;
|
SDL_JoystickID nInstanceID;
|
||||||
|
#ifdef SDL_JOYSTICK_XINPUT
|
||||||
bool bXInputDevice;
|
bool bXInputDevice;
|
||||||
BYTE SubType;
|
BYTE SubType;
|
||||||
Uint8 XInputUserId;
|
Uint8 XInputUserId;
|
||||||
|
#endif
|
||||||
DIDEVICEINSTANCE dxdevice;
|
DIDEVICEINSTANCE dxdevice;
|
||||||
char path[MAX_PATH];
|
char path[MAX_PATH];
|
||||||
int steam_virtual_gamepad_slot;
|
int steam_virtual_gamepad_slot;
|
||||||
@@ -85,10 +87,12 @@ struct joystick_hwdata
|
|||||||
LPDIRECTINPUTEFFECT ffeffect_ref;
|
LPDIRECTINPUTEFFECT ffeffect_ref;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef SDL_JOYSTICK_XINPUT
|
||||||
bool bXInputDevice; // true if this device supports using the xinput API rather than DirectInput
|
bool bXInputDevice; // true if this device supports using the xinput API rather than DirectInput
|
||||||
bool bXInputHaptic; // Supports force feedback via XInput.
|
bool bXInputHaptic; // Supports force feedback via XInput.
|
||||||
Uint8 userid; // XInput userid index for this joystick
|
Uint8 userid; // XInput userid index for this joystick
|
||||||
DWORD dwPacketNumber;
|
DWORD dwPacketNumber;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef SDL_JOYSTICK_DINPUT
|
#ifdef SDL_JOYSTICK_DINPUT
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
#include "../../core/windows/SDL_windows.h"
|
#include "../../core/windows/SDL_windows.h"
|
||||||
#include "../SDL_syslocale.h"
|
#include "../SDL_syslocale.h"
|
||||||
|
|
||||||
typedef BOOL(WINAPI *pfnGetUserPreferredUILanguages)(DWORD, PULONG, WCHAR *, PULONG);
|
typedef BOOL (WINAPI *pfnGetUserPreferredUILanguages)(DWORD, PULONG, WCHAR *, PULONG);
|
||||||
#ifndef MUI_LANGUAGE_NAME
|
#ifndef MUI_LANGUAGE_NAME
|
||||||
#define MUI_LANGUAGE_NAME 0x8
|
#define MUI_LANGUAGE_NAME 0x8
|
||||||
#endif
|
#endif
|
||||||
|
@@ -504,12 +504,12 @@ static ID3D11BlendState *D3D11_CreateBlendState(SDL_Renderer *renderer, SDL_Blen
|
|||||||
// Create resources that depend on the device.
|
// Create resources that depend on the device.
|
||||||
static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer)
|
static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer)
|
||||||
{
|
{
|
||||||
typedef HRESULT(WINAPI * PFN_CREATE_DXGI_FACTORY)(REFIID riid, void **ppFactory);
|
typedef HRESULT (WINAPI *pfnCreateDXGIFactory)(REFIID riid, void **ppFactory);
|
||||||
typedef HRESULT(WINAPI * PFN_CREATE_DXGI_FACTORY2)(UINT flags, REFIID riid, void **ppFactory);
|
typedef HRESULT (WINAPI *pfnCreateDXGIFactory2)(UINT flags, REFIID riid, void **ppFactory);
|
||||||
PFN_CREATE_DXGI_FACTORY CreateDXGIFactoryFunc = NULL;
|
pfnCreateDXGIFactory pCreateDXGIFactory = NULL;
|
||||||
PFN_CREATE_DXGI_FACTORY2 CreateDXGIFactory2Func = NULL;
|
pfnCreateDXGIFactory2 pCreateDXGIFactory2 = NULL;
|
||||||
D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
|
D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
|
||||||
PFN_D3D11_CREATE_DEVICE D3D11CreateDeviceFunc;
|
PFN_D3D11_CREATE_DEVICE pD3D11CreateDevice;
|
||||||
IDXGIAdapter *dxgiAdapter = NULL;
|
IDXGIAdapter *dxgiAdapter = NULL;
|
||||||
ID3D11Device *d3dDevice = NULL;
|
ID3D11Device *d3dDevice = NULL;
|
||||||
ID3D11DeviceContext *d3dContext = NULL;
|
ID3D11DeviceContext *d3dContext = NULL;
|
||||||
@@ -549,10 +549,10 @@ static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
CreateDXGIFactory2Func = (PFN_CREATE_DXGI_FACTORY2)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory2");
|
pCreateDXGIFactory2 = (pfnCreateDXGIFactory2)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory2");
|
||||||
if (!CreateDXGIFactory2Func) {
|
if (!pCreateDXGIFactory2) {
|
||||||
CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory");
|
pCreateDXGIFactory = (pfnCreateDXGIFactory)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory");
|
||||||
if (!CreateDXGIFactoryFunc) {
|
if (!pCreateDXGIFactory) {
|
||||||
result = E_FAIL;
|
result = E_FAIL;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
@@ -564,8 +564,8 @@ static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D11CreateDeviceFunc = (PFN_D3D11_CREATE_DEVICE)SDL_LoadFunction(data->hD3D11Mod, "D3D11CreateDevice");
|
pD3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE)SDL_LoadFunction(data->hD3D11Mod, "D3D11CreateDevice");
|
||||||
if (!D3D11CreateDeviceFunc) {
|
if (!pD3D11CreateDevice) {
|
||||||
result = E_FAIL;
|
result = E_FAIL;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
@@ -573,22 +573,22 @@ static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
if (createDebug) {
|
if (createDebug) {
|
||||||
#ifdef __IDXGIInfoQueue_INTERFACE_DEFINED__
|
#ifdef __IDXGIInfoQueue_INTERFACE_DEFINED__
|
||||||
IDXGIInfoQueue *dxgiInfoQueue = NULL;
|
IDXGIInfoQueue *dxgiInfoQueue = NULL;
|
||||||
PFN_CREATE_DXGI_FACTORY2 DXGIGetDebugInterfaceFunc;
|
pfnCreateDXGIFactory2 pDXGIGetDebugInterface1;
|
||||||
|
|
||||||
// If the debug hint is set, also create the DXGI factory in debug mode
|
// If the debug hint is set, also create the DXGI factory in debug mode
|
||||||
DXGIGetDebugInterfaceFunc = (PFN_CREATE_DXGI_FACTORY2)SDL_LoadFunction(data->hDXGIMod, "DXGIGetDebugInterface1");
|
pDXGIGetDebugInterface1 = (pfnCreateDXGIFactory2)SDL_LoadFunction(data->hDXGIMod, "DXGIGetDebugInterface1");
|
||||||
if (!DXGIGetDebugInterfaceFunc) {
|
if (!pDXGIGetDebugInterface1) {
|
||||||
result = E_FAIL;
|
result = E_FAIL;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = DXGIGetDebugInterfaceFunc(0, &SDL_IID_IDXGIDebug1, (void **)&data->dxgiDebug);
|
result = pDXGIGetDebugInterface1(0, &SDL_IID_IDXGIDebug1, (void **)&data->dxgiDebug);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("DXGIGetDebugInterface1"), result);
|
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("DXGIGetDebugInterface1"), result);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = DXGIGetDebugInterfaceFunc(0, &SDL_IID_IDXGIInfoQueue, (void **)&dxgiInfoQueue);
|
result = pDXGIGetDebugInterface1(0, &SDL_IID_IDXGIInfoQueue, (void **)&dxgiInfoQueue);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("DXGIGetDebugInterface1"), result);
|
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("DXGIGetDebugInterface1"), result);
|
||||||
goto done;
|
goto done;
|
||||||
@@ -601,10 +601,10 @@ static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
creationFlags = DXGI_CREATE_FACTORY_DEBUG;
|
creationFlags = DXGI_CREATE_FACTORY_DEBUG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CreateDXGIFactory2Func) {
|
if (pCreateDXGIFactory2) {
|
||||||
result = CreateDXGIFactory2Func(creationFlags, &SDL_IID_IDXGIFactory2, (void **)&data->dxgiFactory);
|
result = pCreateDXGIFactory2(creationFlags, &SDL_IID_IDXGIFactory2, (void **)&data->dxgiFactory);
|
||||||
} else {
|
} else {
|
||||||
result = CreateDXGIFactoryFunc(&SDL_IID_IDXGIFactory2, (void **)&data->dxgiFactory);
|
result = pCreateDXGIFactory(&SDL_IID_IDXGIFactory2, (void **)&data->dxgiFactory);
|
||||||
}
|
}
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("CreateDXGIFactory"), result);
|
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("CreateDXGIFactory"), result);
|
||||||
@@ -657,7 +657,7 @@ static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create the Direct3D 11 API device object and a corresponding context.
|
// Create the Direct3D 11 API device object and a corresponding context.
|
||||||
result = D3D11CreateDeviceFunc(
|
result = pD3D11CreateDevice(
|
||||||
dxgiAdapter,
|
dxgiAdapter,
|
||||||
driverType,
|
driverType,
|
||||||
NULL,
|
NULL,
|
||||||
|
@@ -771,12 +771,12 @@ static HRESULT D3D12_CreateVertexBuffer(D3D12_RenderData *data, size_t vbidx, si
|
|||||||
static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
||||||
{
|
{
|
||||||
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
||||||
typedef HRESULT(WINAPI * PFN_CREATE_DXGI_FACTORY)(UINT flags, REFIID riid, void **ppFactory);
|
typedef HRESULT (WINAPI *pfnCreateDXGIFactory2)(UINT flags, REFIID riid, void **ppFactory);
|
||||||
PFN_CREATE_DXGI_FACTORY CreateDXGIFactoryFunc;
|
pfnCreateDXGIFactory2 pCreateDXGIFactory2;
|
||||||
PFN_D3D12_CREATE_DEVICE D3D12CreateDeviceFunc;
|
PFN_D3D12_CREATE_DEVICE pD3D12CreateDevice;
|
||||||
#endif
|
#endif
|
||||||
typedef HANDLE(WINAPI * PFN_CREATE_EVENT_EX)(LPSECURITY_ATTRIBUTES lpEventAttributes, LPCWSTR lpName, DWORD dwFlags, DWORD dwDesiredAccess);
|
typedef HANDLE (WINAPI *pfnCreateEventExW)(LPSECURITY_ATTRIBUTES lpEventAttributes, LPCWSTR lpName, DWORD dwFlags, DWORD dwDesiredAccess);
|
||||||
PFN_CREATE_EVENT_EX CreateEventExFunc;
|
pfnCreateEventExW pCreateEventExW;
|
||||||
|
|
||||||
D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
|
D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
|
||||||
ID3D12Device *d3dDevice = NULL;
|
ID3D12Device *d3dDevice = NULL;
|
||||||
@@ -793,18 +793,18 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
createDebug = SDL_GetHintBoolean(SDL_HINT_RENDER_DIRECT3D11_DEBUG, false);
|
createDebug = SDL_GetHintBoolean(SDL_HINT_RENDER_DIRECT3D11_DEBUG, false);
|
||||||
|
|
||||||
#ifdef SDL_PLATFORM_GDK
|
#ifdef SDL_PLATFORM_GDK
|
||||||
CreateEventExFunc = CreateEventExW;
|
pCreateEventExW = CreateEventExW;
|
||||||
#else
|
#else
|
||||||
// CreateEventEx() arrived in Vista, so we need to load it with GetProcAddress for XP.
|
// CreateEventExW() arrived in Vista, so we need to load it with GetProcAddress for XP.
|
||||||
{
|
{
|
||||||
HMODULE kernel32 = GetModuleHandle(TEXT("kernel32.dll"));
|
HMODULE kernel32 = GetModuleHandle(TEXT("kernel32.dll"));
|
||||||
CreateEventExFunc = NULL;
|
pCreateEventExW = NULL;
|
||||||
if (kernel32) {
|
if (kernel32) {
|
||||||
CreateEventExFunc = (PFN_CREATE_EVENT_EX)GetProcAddress(kernel32, "CreateEventExW");
|
pCreateEventExW = (pfnCreateEventExW)GetProcAddress(kernel32, "CreateEventExW");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!CreateEventExFunc) {
|
if (!pCreateEventExW) {
|
||||||
result = E_FAIL;
|
result = E_FAIL;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
@@ -816,8 +816,8 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory2");
|
pCreateDXGIFactory2 = (pfnCreateDXGIFactory2)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory2");
|
||||||
if (!CreateDXGIFactoryFunc) {
|
if (!pCreateDXGIFactory2) {
|
||||||
result = E_FAIL;
|
result = E_FAIL;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
@@ -828,8 +828,8 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D12CreateDeviceFunc = (PFN_D3D12_CREATE_DEVICE)SDL_LoadFunction(data->hD3D12Mod, "D3D12CreateDevice");
|
pD3D12CreateDevice = (PFN_D3D12_CREATE_DEVICE)SDL_LoadFunction(data->hD3D12Mod, "D3D12CreateDevice");
|
||||||
if (!D3D12CreateDeviceFunc) {
|
if (!pD3D12CreateDevice) {
|
||||||
result = E_FAIL;
|
result = E_FAIL;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
@@ -858,10 +858,10 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
if (createDebug) {
|
if (createDebug) {
|
||||||
#ifdef __IDXGIInfoQueue_INTERFACE_DEFINED__
|
#ifdef __IDXGIInfoQueue_INTERFACE_DEFINED__
|
||||||
IDXGIInfoQueue *dxgiInfoQueue = NULL;
|
IDXGIInfoQueue *dxgiInfoQueue = NULL;
|
||||||
PFN_CREATE_DXGI_FACTORY DXGIGetDebugInterfaceFunc;
|
pfnCreateDXGIFactory2 DXGIGetDebugInterfaceFunc;
|
||||||
|
|
||||||
// If the debug hint is set, also create the DXGI factory in debug mode
|
// If the debug hint is set, also create the DXGI factory in debug mode
|
||||||
DXGIGetDebugInterfaceFunc = (PFN_CREATE_DXGI_FACTORY)SDL_LoadFunction(data->hDXGIMod, "DXGIGetDebugInterface1");
|
DXGIGetDebugInterfaceFunc = (pfnCreateDXGIFactory2)SDL_LoadFunction(data->hDXGIMod, "DXGIGetDebugInterface1");
|
||||||
if (!DXGIGetDebugInterfaceFunc) {
|
if (!DXGIGetDebugInterfaceFunc) {
|
||||||
result = E_FAIL;
|
result = E_FAIL;
|
||||||
goto done;
|
goto done;
|
||||||
@@ -886,7 +886,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
creationFlags = DXGI_CREATE_FACTORY_DEBUG;
|
creationFlags = DXGI_CREATE_FACTORY_DEBUG;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = CreateDXGIFactoryFunc(creationFlags, D3D_GUID(SDL_IID_IDXGIFactory6), (void **)&data->dxgiFactory);
|
result = pCreateDXGIFactory2(creationFlags, D3D_GUID(SDL_IID_IDXGIFactory6), (void **)&data->dxgiFactory);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("CreateDXGIFactory"), result);
|
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("CreateDXGIFactory"), result);
|
||||||
goto done;
|
goto done;
|
||||||
@@ -903,7 +903,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = D3D12CreateDeviceFunc((IUnknown *)data->dxgiAdapter,
|
result = pD3D12CreateDevice((IUnknown *)data->dxgiAdapter,
|
||||||
D3D_FEATURE_LEVEL_11_0, // Request minimum feature level 11.0 for maximum compatibility
|
D3D_FEATURE_LEVEL_11_0, // Request minimum feature level 11.0 for maximum compatibility
|
||||||
D3D_GUID(SDL_IID_ID3D12Device1),
|
D3D_GUID(SDL_IID_ID3D12Device1),
|
||||||
(void **)&d3dDevice);
|
(void **)&d3dDevice);
|
||||||
@@ -1051,7 +1051,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
|
|
||||||
data->fenceValue++;
|
data->fenceValue++;
|
||||||
|
|
||||||
data->fenceEvent = CreateEventExFunc(NULL, NULL, 0, EVENT_MODIFY_STATE | SYNCHRONIZE);
|
data->fenceEvent = pCreateEventExW(NULL, NULL, 0, EVENT_MODIFY_STATE | SYNCHRONIZE);
|
||||||
if (!data->fenceEvent) {
|
if (!data->fenceEvent) {
|
||||||
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("CreateEventEx"), result);
|
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("CreateEventEx"), result);
|
||||||
goto done;
|
goto done;
|
||||||
|
@@ -56,10 +56,10 @@ typedef struct CONDITION_VARIABLE
|
|||||||
} CONDITION_VARIABLE, *PCONDITION_VARIABLE;
|
} CONDITION_VARIABLE, *PCONDITION_VARIABLE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef VOID(WINAPI *pfnWakeConditionVariable)(PCONDITION_VARIABLE);
|
typedef VOID (WINAPI *pfnWakeConditionVariable)(PCONDITION_VARIABLE);
|
||||||
typedef VOID(WINAPI *pfnWakeAllConditionVariable)(PCONDITION_VARIABLE);
|
typedef VOID (WINAPI *pfnWakeAllConditionVariable)(PCONDITION_VARIABLE);
|
||||||
typedef BOOL(WINAPI *pfnSleepConditionVariableSRW)(PCONDITION_VARIABLE, PSRWLOCK, DWORD, ULONG);
|
typedef BOOL (WINAPI *pfnSleepConditionVariableSRW)(PCONDITION_VARIABLE, PSRWLOCK, DWORD, ULONG);
|
||||||
typedef BOOL(WINAPI *pfnSleepConditionVariableCS)(PCONDITION_VARIABLE, PCRITICAL_SECTION, DWORD);
|
typedef BOOL (WINAPI *pfnSleepConditionVariableCS)(PCONDITION_VARIABLE, PCRITICAL_SECTION, DWORD);
|
||||||
|
|
||||||
static pfnWakeConditionVariable pWakeConditionVariable = NULL;
|
static pfnWakeConditionVariable pWakeConditionVariable = NULL;
|
||||||
static pfnWakeAllConditionVariable pWakeAllConditionVariable = NULL;
|
static pfnWakeAllConditionVariable pWakeAllConditionVariable = NULL;
|
||||||
|
@@ -39,10 +39,10 @@ SDL_mutex_impl_t SDL_mutex_impl_active = { 0 };
|
|||||||
* Implementation based on Slim Reader/Writer (SRW) Locks for Win 7 and newer.
|
* Implementation based on Slim Reader/Writer (SRW) Locks for Win 7 and newer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef VOID(WINAPI *pfnInitializeSRWLock)(PSRWLOCK);
|
typedef VOID (WINAPI *pfnInitializeSRWLock)(PSRWLOCK);
|
||||||
typedef VOID(WINAPI *pfnReleaseSRWLockExclusive)(PSRWLOCK);
|
typedef VOID (WINAPI *pfnReleaseSRWLockExclusive)(PSRWLOCK);
|
||||||
typedef VOID(WINAPI *pfnAcquireSRWLockExclusive)(PSRWLOCK);
|
typedef VOID (WINAPI *pfnAcquireSRWLockExclusive)(PSRWLOCK);
|
||||||
typedef BOOLEAN(WINAPI *pfnTryAcquireSRWLockExclusive)(PSRWLOCK);
|
typedef BOOLEAN (WINAPI *pfnTryAcquireSRWLockExclusive)(PSRWLOCK);
|
||||||
static pfnInitializeSRWLock pInitializeSRWLock = NULL;
|
static pfnInitializeSRWLock pInitializeSRWLock = NULL;
|
||||||
static pfnReleaseSRWLockExclusive pReleaseSRWLockExclusive = NULL;
|
static pfnReleaseSRWLockExclusive pReleaseSRWLockExclusive = NULL;
|
||||||
static pfnAcquireSRWLockExclusive pAcquireSRWLockExclusive = NULL;
|
static pfnAcquireSRWLockExclusive pAcquireSRWLockExclusive = NULL;
|
||||||
|
@@ -27,13 +27,13 @@
|
|||||||
// This header makes sure SRWLOCK is actually declared, even on ancient WinSDKs.
|
// This header makes sure SRWLOCK is actually declared, even on ancient WinSDKs.
|
||||||
#include "SDL_sysmutex_c.h"
|
#include "SDL_sysmutex_c.h"
|
||||||
|
|
||||||
typedef VOID(WINAPI *pfnInitializeSRWLock)(PSRWLOCK);
|
typedef VOID (WINAPI *pfnInitializeSRWLock)(PSRWLOCK);
|
||||||
typedef VOID(WINAPI *pfnReleaseSRWLockShared)(PSRWLOCK);
|
typedef VOID (WINAPI *pfnReleaseSRWLockShared)(PSRWLOCK);
|
||||||
typedef VOID(WINAPI *pfnAcquireSRWLockShared)(PSRWLOCK);
|
typedef VOID (WINAPI *pfnAcquireSRWLockShared)(PSRWLOCK);
|
||||||
typedef BOOLEAN(WINAPI *pfnTryAcquireSRWLockShared)(PSRWLOCK);
|
typedef BOOLEAN (WINAPI *pfnTryAcquireSRWLockShared)(PSRWLOCK);
|
||||||
typedef VOID(WINAPI *pfnReleaseSRWLockExclusive)(PSRWLOCK);
|
typedef VOID (WINAPI *pfnReleaseSRWLockExclusive)(PSRWLOCK);
|
||||||
typedef VOID(WINAPI *pfnAcquireSRWLockExclusive)(PSRWLOCK);
|
typedef VOID (WINAPI *pfnAcquireSRWLockExclusive)(PSRWLOCK);
|
||||||
typedef BOOLEAN(WINAPI *pfnTryAcquireSRWLockExclusive)(PSRWLOCK);
|
typedef BOOLEAN (WINAPI *pfnTryAcquireSRWLockExclusive)(PSRWLOCK);
|
||||||
|
|
||||||
static pfnInitializeSRWLock pInitializeSRWLock = NULL;
|
static pfnInitializeSRWLock pInitializeSRWLock = NULL;
|
||||||
static pfnReleaseSRWLockShared pReleaseSRWLockShared = NULL;
|
static pfnReleaseSRWLockShared pReleaseSRWLockShared = NULL;
|
||||||
|
@@ -60,8 +60,8 @@ static SDL_sem_impl_t SDL_sem_impl_active = { 0 };
|
|||||||
// APIs not available on WinPhone 8.1
|
// APIs not available on WinPhone 8.1
|
||||||
// https://www.microsoft.com/en-us/download/details.aspx?id=47328
|
// https://www.microsoft.com/en-us/download/details.aspx?id=47328
|
||||||
|
|
||||||
typedef BOOL(WINAPI *pfnWaitOnAddress)(volatile VOID *, PVOID, SIZE_T, DWORD);
|
typedef BOOL (WINAPI *pfnWaitOnAddress)(volatile VOID *, PVOID, SIZE_T, DWORD);
|
||||||
typedef VOID(WINAPI *pfnWakeByAddressSingle)(PVOID);
|
typedef VOID (WINAPI *pfnWakeByAddressSingle)(PVOID);
|
||||||
|
|
||||||
static pfnWaitOnAddress pWaitOnAddress = NULL;
|
static pfnWaitOnAddress pWaitOnAddress = NULL;
|
||||||
static pfnWakeByAddressSingle pWakeByAddressSingle = NULL;
|
static pfnWakeByAddressSingle pWakeByAddressSingle = NULL;
|
||||||
|
@@ -108,7 +108,7 @@ static LONG NTAPI EmptyVectoredExceptionHandler(EXCEPTION_POINTERS *info)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef HRESULT(WINAPI *pfnSetThreadDescription)(HANDLE, PCWSTR);
|
typedef HRESULT (WINAPI *pfnSetThreadDescription)(HANDLE, PCWSTR);
|
||||||
|
|
||||||
void SDL_SYS_SetupThread(const char *name)
|
void SDL_SYS_SetupThread(const char *name)
|
||||||
{
|
{
|
||||||
|
@@ -30,7 +30,7 @@
|
|||||||
#define WINDOWS_TICK 10000000ULL
|
#define WINDOWS_TICK 10000000ULL
|
||||||
#define UNIX_EPOCH_OFFSET_SEC 11644473600ULL
|
#define UNIX_EPOCH_OFFSET_SEC 11644473600ULL
|
||||||
|
|
||||||
typedef void(WINAPI *pfnGetSystemTimePreciseAsFileTime)(FILETIME *);
|
typedef void (WINAPI *pfnGetSystemTimePreciseAsFileTime)(FILETIME *);
|
||||||
|
|
||||||
void SDL_GetSystemTimeLocalePreferences(SDL_DateFormat *df, SDL_TimeFormat *tf)
|
void SDL_GetSystemTimeLocalePreferences(SDL_DateFormat *df, SDL_TimeFormat *tf)
|
||||||
{
|
{
|
||||||
|
@@ -24,54 +24,27 @@
|
|||||||
|
|
||||||
#include "../../core/windows/SDL_windows.h"
|
#include "../../core/windows/SDL_windows.h"
|
||||||
|
|
||||||
/* CREATE_WAITABLE_TIMER_HIGH_RESOLUTION flag was added in Windows 10 version 1803. */
|
Uint64 SDL_GetPerformanceCounter(void)
|
||||||
#ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION
|
{
|
||||||
#define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x2
|
LARGE_INTEGER counter;
|
||||||
#endif
|
const BOOL rc = QueryPerformanceCounter(&counter);
|
||||||
|
SDL_assert(rc != 0); // this should _never_ fail if you're on XP or later.
|
||||||
|
return (Uint64)counter.QuadPart;
|
||||||
|
}
|
||||||
|
|
||||||
typedef HANDLE (WINAPI *CreateWaitableTimerExW_t)(LPSECURITY_ATTRIBUTES lpTimerAttributes, LPCWSTR lpTimerName, DWORD dwFlags, DWORD dwDesiredAccess);
|
Uint64 SDL_GetPerformanceFrequency(void)
|
||||||
static CreateWaitableTimerExW_t pCreateWaitableTimerExW;
|
{
|
||||||
|
LARGE_INTEGER frequency;
|
||||||
typedef BOOL (WINAPI *SetWaitableTimerEx_t)(HANDLE hTimer, const LARGE_INTEGER *lpDueTime, LONG lPeriod, PTIMERAPCROUTINE pfnCompletionRoutine, LPVOID lpArgToCompletionRoutine, PREASON_CONTEXT WakeContext, ULONG TolerableDelay);
|
const BOOL rc = QueryPerformanceFrequency(&frequency);
|
||||||
static SetWaitableTimerEx_t pSetWaitableTimerEx;
|
SDL_assert(rc != 0); // this should _never_ fail if you're on XP or later.
|
||||||
|
return (Uint64)frequency.QuadPart;
|
||||||
|
}
|
||||||
|
|
||||||
static void SDL_CleanupWaitableHandle(void *handle)
|
static void SDL_CleanupWaitableHandle(void *handle)
|
||||||
{
|
{
|
||||||
CloseHandle(handle);
|
CloseHandle(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HANDLE SDL_GetWaitableTimer(void)
|
|
||||||
{
|
|
||||||
static SDL_TLSID TLS_timer_handle;
|
|
||||||
HANDLE timer;
|
|
||||||
|
|
||||||
if (!pCreateWaitableTimerExW || !pSetWaitableTimerEx) {
|
|
||||||
static bool initialized;
|
|
||||||
|
|
||||||
if (!initialized) {
|
|
||||||
HMODULE module = GetModuleHandle(TEXT("kernel32.dll"));
|
|
||||||
if (module) {
|
|
||||||
pCreateWaitableTimerExW = (CreateWaitableTimerExW_t)GetProcAddress(module, "CreateWaitableTimerExW");
|
|
||||||
pSetWaitableTimerEx = (SetWaitableTimerEx_t)GetProcAddress(module, "SetWaitableTimerEx");
|
|
||||||
}
|
|
||||||
initialized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pCreateWaitableTimerExW || !pSetWaitableTimerEx) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
timer = SDL_GetTLS(&TLS_timer_handle);
|
|
||||||
if (!timer) {
|
|
||||||
timer = pCreateWaitableTimerExW(NULL, NULL, CREATE_WAITABLE_TIMER_HIGH_RESOLUTION, TIMER_ALL_ACCESS);
|
|
||||||
if (timer) {
|
|
||||||
SDL_SetTLS(&TLS_timer_handle, timer, SDL_CleanupWaitableHandle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return timer;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HANDLE SDL_GetWaitableEvent(void)
|
static HANDLE SDL_GetWaitableEvent(void)
|
||||||
{
|
{
|
||||||
static SDL_TLSID TLS_event_handle;
|
static SDL_TLSID TLS_event_handle;
|
||||||
@@ -87,20 +60,65 @@ static HANDLE SDL_GetWaitableEvent(void)
|
|||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
Uint64 SDL_GetPerformanceCounter(void)
|
/* CREATE_WAITABLE_TIMER_HIGH_RESOLUTION flag was added in Windows 10 version 1803. */
|
||||||
{
|
#ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION
|
||||||
LARGE_INTEGER counter;
|
#define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x2
|
||||||
const BOOL rc = QueryPerformanceCounter(&counter);
|
#endif
|
||||||
SDL_assert(rc != 0); // this should _never_ fail if you're on XP or later.
|
|
||||||
return (Uint64)counter.QuadPart;
|
|
||||||
}
|
|
||||||
|
|
||||||
Uint64 SDL_GetPerformanceFrequency(void)
|
typedef HANDLE (WINAPI *pfnCreateWaitableTimerExW)(LPSECURITY_ATTRIBUTES lpTimerAttributes, LPCWSTR lpTimerName, DWORD dwFlags, DWORD dwDesiredAccess);
|
||||||
|
static pfnCreateWaitableTimerExW pCreateWaitableTimerExW;
|
||||||
|
|
||||||
|
#if WINVER < _WIN32_WINNT_WIN7
|
||||||
|
typedef struct _REASON_CONTEXT REASON_CONTEXT;
|
||||||
|
typedef REASON_CONTEXT * PREASON_CONTEXT;
|
||||||
|
#endif
|
||||||
|
typedef BOOL (WINAPI *pfnSetWaitableTimerEx)(HANDLE hTimer, const LARGE_INTEGER *lpDueTime, LONG lPeriod, PTIMERAPCROUTINE pfnCompletionRoutine, LPVOID lpArgToCompletionRoutine, PREASON_CONTEXT WakeContext, ULONG TolerableDelay);
|
||||||
|
static pfnSetWaitableTimerEx pSetWaitableTimerEx;
|
||||||
|
|
||||||
|
typedef HANDLE (WINAPI *pfnCreateWaitableTimerW)(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, LPCWSTR lpTimerName);
|
||||||
|
static pfnCreateWaitableTimerW pCreateWaitableTimerW;
|
||||||
|
|
||||||
|
typedef BOOL (WINAPI *pfnSetWaitableTimer)(HANDLE hTimer, const LARGE_INTEGER *lpDueTime, LONG lPeriod, PTIMERAPCROUTINE pfnCompletionRoutine, LPVOID lpArgToCompletionRoutine, BOOL fResume);
|
||||||
|
static pfnSetWaitableTimer pSetWaitableTimer;
|
||||||
|
|
||||||
|
static HANDLE SDL_GetWaitableTimer(void)
|
||||||
{
|
{
|
||||||
LARGE_INTEGER frequency;
|
static SDL_TLSID TLS_timer_handle;
|
||||||
const BOOL rc = QueryPerformanceFrequency(&frequency);
|
HANDLE timer;
|
||||||
SDL_assert(rc != 0); // this should _never_ fail if you're on XP or later.
|
static bool initialized;
|
||||||
return (Uint64)frequency.QuadPart;
|
|
||||||
|
if (!initialized) {
|
||||||
|
HMODULE module = GetModuleHandle(TEXT("kernel32.dll"));
|
||||||
|
if (module) {
|
||||||
|
pCreateWaitableTimerExW = (pfnCreateWaitableTimerExW)GetProcAddress(module, "CreateWaitableTimerExW"); // Windows 7 and up
|
||||||
|
if (!pCreateWaitableTimerExW) {
|
||||||
|
pCreateWaitableTimerW = (pfnCreateWaitableTimerW)GetProcAddress(module, "CreateWaitableTimerW");
|
||||||
|
}
|
||||||
|
pSetWaitableTimerEx = (pfnSetWaitableTimerEx)GetProcAddress(module, "SetWaitableTimerEx"); // Windows Vista and up
|
||||||
|
if (!pSetWaitableTimerEx) {
|
||||||
|
pSetWaitableTimer = (pfnSetWaitableTimer)GetProcAddress(module, "SetWaitableTimer");
|
||||||
|
}
|
||||||
|
initialized =
|
||||||
|
(pCreateWaitableTimerExW || pCreateWaitableTimerW) &&
|
||||||
|
(pSetWaitableTimerEx || pSetWaitableTimer);
|
||||||
|
}
|
||||||
|
if (!initialized) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
timer = SDL_GetTLS(&TLS_timer_handle);
|
||||||
|
if (!timer) {
|
||||||
|
if (pCreateWaitableTimerExW) {
|
||||||
|
timer = pCreateWaitableTimerExW(NULL, NULL, CREATE_WAITABLE_TIMER_HIGH_RESOLUTION, TIMER_ALL_ACCESS);
|
||||||
|
} else {
|
||||||
|
timer = pCreateWaitableTimerW(NULL, TRUE, NULL);
|
||||||
|
}
|
||||||
|
if (timer) {
|
||||||
|
SDL_SetTLS(&TLS_timer_handle, timer, SDL_CleanupWaitableHandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return timer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDL_SYS_DelayNS(Uint64 ns)
|
void SDL_SYS_DelayNS(Uint64 ns)
|
||||||
@@ -109,7 +127,7 @@ void SDL_SYS_DelayNS(Uint64 ns)
|
|||||||
if (timer) {
|
if (timer) {
|
||||||
LARGE_INTEGER due_time;
|
LARGE_INTEGER due_time;
|
||||||
due_time.QuadPart = -((LONGLONG)ns / 100);
|
due_time.QuadPart = -((LONGLONG)ns / 100);
|
||||||
if (pSetWaitableTimerEx(timer, &due_time, 0, NULL, NULL, NULL, 0)) {
|
if ((pSetWaitableTimerEx && pSetWaitableTimerEx(timer, &due_time, 0, NULL, NULL, NULL, 0)) || pSetWaitableTimer(timer, &due_time, 0, NULL, NULL, 0)) {
|
||||||
WaitForSingleObject(timer, INFINITE);
|
WaitForSingleObject(timer, INFINITE);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@@ -2410,10 +2410,13 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
#endif // !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
#endif // !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
||||||
if (msg == data->videodata->WM_TASKBAR_BUTTON_CREATED) {
|
if (msg && msg == data->videodata->WM_TASKBAR_BUTTON_CREATED) {
|
||||||
data->taskbar_button_created = true;
|
data->taskbar_button_created = true;
|
||||||
WIN_ApplyWindowProgress(SDL_GetVideoDevice(), data->window);
|
WIN_ApplyWindowProgress(SDL_GetVideoDevice(), data->window);
|
||||||
}
|
}
|
||||||
|
@@ -944,7 +944,7 @@ bool WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID)
|
|||||||
TASKDIALOG_BUTTON *pButtons;
|
TASKDIALOG_BUTTON *pButtons;
|
||||||
TASKDIALOG_BUTTON *pButton;
|
TASKDIALOG_BUTTON *pButton;
|
||||||
HMODULE hComctl32;
|
HMODULE hComctl32;
|
||||||
TASKDIALOGINDIRECTPROC pfnTaskDialogIndirect;
|
TASKDIALOGINDIRECTPROC pTaskDialogIndirect;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
char *ampescape = NULL;
|
char *ampescape = NULL;
|
||||||
size_t ampescapesize = 0;
|
size_t ampescapesize = 0;
|
||||||
@@ -958,11 +958,11 @@ bool WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID)
|
|||||||
}
|
}
|
||||||
|
|
||||||
HMODULE hUser32 = GetModuleHandle(TEXT("user32.dll"));
|
HMODULE hUser32 = GetModuleHandle(TEXT("user32.dll"));
|
||||||
typedef DPI_AWARENESS_CONTEXT (WINAPI * SetThreadDpiAwarenessContext_t)(DPI_AWARENESS_CONTEXT);
|
typedef DPI_AWARENESS_CONTEXT (WINAPI *pfnSetThreadDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
|
||||||
SetThreadDpiAwarenessContext_t SetThreadDpiAwarenessContextFunc = (SetThreadDpiAwarenessContext_t)GetProcAddress(hUser32, "SetThreadDpiAwarenessContext");
|
pfnSetThreadDpiAwarenessContext pSetThreadDpiAwarenessContext = (pfnSetThreadDpiAwarenessContext)GetProcAddress(hUser32, "SetThreadDpiAwarenessContext");
|
||||||
DPI_AWARENESS_CONTEXT previous_context = DPI_AWARENESS_CONTEXT_UNAWARE;
|
DPI_AWARENESS_CONTEXT previous_context = DPI_AWARENESS_CONTEXT_UNAWARE;
|
||||||
if (SetThreadDpiAwarenessContextFunc) {
|
if (pSetThreadDpiAwarenessContext) {
|
||||||
previous_context = SetThreadDpiAwarenessContextFunc(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
|
previous_context = pSetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we cannot load comctl32.dll use the old messagebox!
|
// If we cannot load comctl32.dll use the old messagebox!
|
||||||
@@ -979,8 +979,8 @@ bool WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID)
|
|||||||
If you don't want to bother with manifests, put this #pragma in your app's source code somewhere:
|
If you don't want to bother with manifests, put this #pragma in your app's source code somewhere:
|
||||||
#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
|
#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
|
||||||
*/
|
*/
|
||||||
pfnTaskDialogIndirect = (TASKDIALOGINDIRECTPROC)GetProcAddress(hComctl32, "TaskDialogIndirect");
|
pTaskDialogIndirect = (TASKDIALOGINDIRECTPROC)GetProcAddress(hComctl32, "TaskDialogIndirect");
|
||||||
if (!pfnTaskDialogIndirect) {
|
if (!pTaskDialogIndirect) {
|
||||||
FreeLibrary(hComctl32);
|
FreeLibrary(hComctl32);
|
||||||
result = WIN_ShowOldMessageBox(messageboxdata, buttonID);
|
result = WIN_ShowOldMessageBox(messageboxdata, buttonID);
|
||||||
goto done;
|
goto done;
|
||||||
@@ -1049,7 +1049,7 @@ bool WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID)
|
|||||||
TaskConfig.pButtons = pButtons;
|
TaskConfig.pButtons = pButtons;
|
||||||
|
|
||||||
// Show the Task Dialog
|
// Show the Task Dialog
|
||||||
hr = pfnTaskDialogIndirect(&TaskConfig, &nButton, NULL, NULL);
|
hr = pTaskDialogIndirect(&TaskConfig, &nButton, NULL, NULL);
|
||||||
|
|
||||||
// Free everything
|
// Free everything
|
||||||
FreeLibrary(hComctl32);
|
FreeLibrary(hComctl32);
|
||||||
@@ -1077,8 +1077,8 @@ bool WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID)
|
|||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
if (SetThreadDpiAwarenessContextFunc) {
|
if (pSetThreadDpiAwarenessContext) {
|
||||||
SetThreadDpiAwarenessContextFunc(previous_context);
|
pSetThreadDpiAwarenessContext(previous_context);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@@ -34,6 +34,9 @@
|
|||||||
#ifndef CDS_FULLSCREEN
|
#ifndef CDS_FULLSCREEN
|
||||||
#define CDS_FULLSCREEN 0
|
#define CDS_FULLSCREEN 0
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef USER_DEFAULT_SCREEN_DPI
|
||||||
|
#define USER_DEFAULT_SCREEN_DPI 96
|
||||||
|
#endif
|
||||||
|
|
||||||
// #define DEBUG_MODES
|
// #define DEBUG_MODES
|
||||||
// #define HIGHDPI_DEBUG_VERBOSE
|
// #define HIGHDPI_DEBUG_VERBOSE
|
||||||
@@ -247,9 +250,9 @@ static void WIN_GetRefreshRate(void *dxgi_output, DEVMODEW *mode, int *numerator
|
|||||||
|
|
||||||
static float WIN_GetContentScale(SDL_VideoDevice *_this, HMONITOR hMonitor)
|
static float WIN_GetContentScale(SDL_VideoDevice *_this, HMONITOR hMonitor)
|
||||||
{
|
{
|
||||||
const SDL_VideoData *videodata = (const SDL_VideoData *)_this->internal;
|
|
||||||
int dpi = 0;
|
int dpi = 0;
|
||||||
|
|
||||||
|
const SDL_VideoData *videodata = (const SDL_VideoData *)_this->internal;
|
||||||
if (videodata->GetDpiForMonitor) {
|
if (videodata->GetDpiForMonitor) {
|
||||||
UINT hdpi_uint, vdpi_uint;
|
UINT hdpi_uint, vdpi_uint;
|
||||||
if (videodata->GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &hdpi_uint, &vdpi_uint) == S_OK) {
|
if (videodata->GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &hdpi_uint, &vdpi_uint) == S_OK) {
|
||||||
@@ -391,21 +394,21 @@ WIN_GetDisplayNameVista_failed:
|
|||||||
#ifdef HAVE_DXGI1_6_H
|
#ifdef HAVE_DXGI1_6_H
|
||||||
static bool WIN_GetMonitorDESC1(HMONITOR hMonitor, DXGI_OUTPUT_DESC1 *desc)
|
static bool WIN_GetMonitorDESC1(HMONITOR hMonitor, DXGI_OUTPUT_DESC1 *desc)
|
||||||
{
|
{
|
||||||
typedef HRESULT (WINAPI * PFN_CREATE_DXGI_FACTORY)(REFIID riid, void **ppFactory);
|
typedef HRESULT (WINAPI *pfnCreateDXGIFactory1)(REFIID riid, void **ppFactory);
|
||||||
PFN_CREATE_DXGI_FACTORY CreateDXGIFactoryFunc = NULL;
|
pfnCreateDXGIFactory1 pCreateDXGIFactory1 = NULL;
|
||||||
SDL_SharedObject *hDXGIMod = NULL;
|
SDL_SharedObject *hDXGIMod = NULL;
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
hDXGIMod = SDL_LoadObject("dxgi.dll");
|
hDXGIMod = SDL_LoadObject("dxgi.dll");
|
||||||
if (hDXGIMod) {
|
if (hDXGIMod) {
|
||||||
CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY)SDL_LoadFunction(hDXGIMod, "CreateDXGIFactory1");
|
pCreateDXGIFactory1 = (pfnCreateDXGIFactory1)SDL_LoadFunction(hDXGIMod, "CreateDXGIFactory1");
|
||||||
}
|
}
|
||||||
if (CreateDXGIFactoryFunc) {
|
if (pCreateDXGIFactory1) {
|
||||||
static const GUID SDL_IID_IDXGIFactory1 = { 0x770aae78, 0xf26f, 0x4dba, { 0xa8, 0x29, 0x25, 0x3c, 0x83, 0xd1, 0xb3, 0x87 } };
|
static const GUID SDL_IID_IDXGIFactory1 = { 0x770aae78, 0xf26f, 0x4dba, { 0xa8, 0x29, 0x25, 0x3c, 0x83, 0xd1, 0xb3, 0x87 } };
|
||||||
static const GUID SDL_IID_IDXGIOutput6 = { 0x068346e8, 0xaaec, 0x4b84, { 0xad, 0xd7, 0x13, 0x7f, 0x51, 0x3f, 0x77, 0xa1 } };
|
static const GUID SDL_IID_IDXGIOutput6 = { 0x068346e8, 0xaaec, 0x4b84, { 0xad, 0xd7, 0x13, 0x7f, 0x51, 0x3f, 0x77, 0xa1 } };
|
||||||
IDXGIFactory1 *dxgiFactory;
|
IDXGIFactory1 *dxgiFactory;
|
||||||
|
|
||||||
if (SUCCEEDED(CreateDXGIFactoryFunc(&SDL_IID_IDXGIFactory1, (void **)&dxgiFactory))) {
|
if (SUCCEEDED(pCreateDXGIFactory1(&SDL_IID_IDXGIFactory1, (void **)&dxgiFactory))) {
|
||||||
IDXGIAdapter1 *dxgiAdapter;
|
IDXGIAdapter1 *dxgiAdapter;
|
||||||
UINT adapter = 0;
|
UINT adapter = 0;
|
||||||
while (!found && SUCCEEDED(IDXGIFactory1_EnumAdapters1(dxgiFactory, adapter, &dxgiAdapter))) {
|
while (!found && SUCCEEDED(IDXGIFactory1_EnumAdapters1(dxgiFactory, adapter, &dxgiAdapter))) {
|
||||||
|
@@ -38,6 +38,93 @@
|
|||||||
|
|
||||||
#if !(defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES))
|
#if !(defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES))
|
||||||
#include <shobjidl.h>
|
#include <shobjidl.h>
|
||||||
|
|
||||||
|
#ifndef __ITaskbarList3_FWD_DEFINED__
|
||||||
|
typedef struct ITaskbarList3 ITaskbarList3;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ITaskbarList3_INTERFACE_DEFINED__
|
||||||
|
typedef enum TBPFLAG
|
||||||
|
{
|
||||||
|
TBPF_NOPROGRESS = 0x0,
|
||||||
|
TBPF_INDETERMINATE = 0x1,
|
||||||
|
TBPF_NORMAL = 0x2,
|
||||||
|
TBPF_ERROR = 0x4,
|
||||||
|
TBPF_PAUSED = 0x8
|
||||||
|
} TBPFLAG;
|
||||||
|
|
||||||
|
typedef enum THUMBBUTTONMASK
|
||||||
|
{
|
||||||
|
THB_BITMAP = 0x1,
|
||||||
|
THB_ICON = 0x2,
|
||||||
|
THB_TOOLTIP = 0x4,
|
||||||
|
THB_FLAGS = 0x8
|
||||||
|
} THUMBBUTTONMASK;
|
||||||
|
|
||||||
|
typedef enum THUMBBUTTONFLAGS
|
||||||
|
{
|
||||||
|
THBF_ENABLED = 0x0,
|
||||||
|
THBF_DISABLED = 0x1,
|
||||||
|
THBF_DISMISSONCLICK = 0x2,
|
||||||
|
THBF_NOBACKGROUND = 0x4,
|
||||||
|
THBF_HIDDEN = 0x8,
|
||||||
|
THBF_NONINTERACTIVE = 0x10
|
||||||
|
} THUMBBUTTONFLAGS;
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning(disable: 4103)
|
||||||
|
#endif
|
||||||
|
#pragma pack(push, 8)
|
||||||
|
typedef struct THUMBBUTTON
|
||||||
|
{
|
||||||
|
THUMBBUTTONMASK dwMask;
|
||||||
|
UINT iId;
|
||||||
|
UINT iBitmap;
|
||||||
|
HICON hIcon;
|
||||||
|
WCHAR szTip[260];
|
||||||
|
THUMBBUTTONFLAGS dwFlags;
|
||||||
|
} THUMBBUTTON;
|
||||||
|
|
||||||
|
typedef struct THUMBBUTTON *LPTHUMBBUTTON;
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
#ifndef HIMAGELIST
|
||||||
|
struct _IMAGELIST;
|
||||||
|
typedef struct _IMAGELIST *HIMAGELIST;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct ITaskbarList3Vtbl
|
||||||
|
{
|
||||||
|
HRESULT (__stdcall *QueryInterface)(ITaskbarList3 *This, REFIID riid, void **ppvObject);
|
||||||
|
ULONG (__stdcall *AddRef)(ITaskbarList3 *This);
|
||||||
|
ULONG (__stdcall *Release)(ITaskbarList3 *This);
|
||||||
|
HRESULT (__stdcall *HrInit)(ITaskbarList3 *This);
|
||||||
|
HRESULT (__stdcall *AddTab)(ITaskbarList3 *This, HWND hwnd);
|
||||||
|
HRESULT (__stdcall *DeleteTab)(ITaskbarList3 *This, HWND hwnd);
|
||||||
|
HRESULT (__stdcall *ActivateTab)(ITaskbarList3 *This, HWND hwnd);
|
||||||
|
HRESULT (__stdcall *SetActiveAlt)(ITaskbarList3 *This, HWND hwnd);
|
||||||
|
HRESULT (__stdcall *MarkFullscreenWindow)(ITaskbarList3 *This, HWND hwnd, BOOL fFullscreen);
|
||||||
|
HRESULT (__stdcall *SetProgressValue)(ITaskbarList3 *This, HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal);
|
||||||
|
HRESULT (__stdcall *SetProgressState)(ITaskbarList3 *This, HWND hwnd, TBPFLAG tbpFlags);
|
||||||
|
HRESULT (__stdcall *RegisterTab)(ITaskbarList3 *This, HWND hwndTab, HWND hwndMDI);
|
||||||
|
HRESULT (__stdcall *UnregisterTab)(ITaskbarList3 *This, HWND hwndTab);
|
||||||
|
HRESULT (__stdcall *SetTabOrder)(ITaskbarList3 *This, HWND hwndTab, HWND hwndInsertBefore);
|
||||||
|
HRESULT (__stdcall *SetTabActive)(ITaskbarList3 *This, HWND hwndTab, HWND hwndMDI, DWORD dwReserved);
|
||||||
|
HRESULT (__stdcall *ThumbBarAddButtons)(ITaskbarList3 *This, HWND hwnd, UINT cButtons, LPTHUMBBUTTON pButton);
|
||||||
|
HRESULT (__stdcall *ThumbBarUpdateButtons)(ITaskbarList3 *This, HWND hwnd, UINT cButtons, LPTHUMBBUTTON pButton);
|
||||||
|
HRESULT (__stdcall *ThumbBarSetImageList)(ITaskbarList3 *This, HWND hwnd, HIMAGELIST himl);
|
||||||
|
HRESULT (__stdcall *SetOverlayIcon)(ITaskbarList3 *This, HWND hwnd, HICON hIcon, LPCWSTR pszDescription);
|
||||||
|
HRESULT (__stdcall *SetThumbnailTooltip)(ITaskbarList3 *This, HWND hwnd, LPCWSTR pszTip);
|
||||||
|
HRESULT (__stdcall *SetThumbnailClip)(ITaskbarList3 *This, HWND hwnd, RECT *prcClip);
|
||||||
|
} ITaskbarList3Vtbl;
|
||||||
|
|
||||||
|
struct ITaskbarList3
|
||||||
|
{
|
||||||
|
ITaskbarList3Vtbl *lpVtbl;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // #ifndef __ITaskbarList3_INTERFACE_DEFINED__
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SDL_GDK_TEXTINPUT
|
#ifdef SDL_GDK_TEXTINPUT
|
||||||
@@ -204,14 +291,14 @@ static SDL_VideoDevice *WIN_CreateDevice(void)
|
|||||||
data->dxgiDLL = SDL_LoadObject("DXGI.DLL");
|
data->dxgiDLL = SDL_LoadObject("DXGI.DLL");
|
||||||
if (data->dxgiDLL) {
|
if (data->dxgiDLL) {
|
||||||
/* *INDENT-OFF* */ // clang-format off
|
/* *INDENT-OFF* */ // clang-format off
|
||||||
typedef HRESULT (WINAPI *CreateDXGI_t)(REFIID riid, void **ppFactory);
|
typedef HRESULT (WINAPI *pfnCreateDXGI)(REFIID riid, void **ppFactory);
|
||||||
/* *INDENT-ON* */ // clang-format on
|
/* *INDENT-ON* */ // clang-format on
|
||||||
CreateDXGI_t CreateDXGI;
|
pfnCreateDXGI pCreateDXGI;
|
||||||
|
|
||||||
CreateDXGI = (CreateDXGI_t)SDL_LoadFunction(data->dxgiDLL, "CreateDXGIFactory");
|
pCreateDXGI = (pfnCreateDXGI)SDL_LoadFunction(data->dxgiDLL, "CreateDXGIFactory");
|
||||||
if (CreateDXGI) {
|
if (pCreateDXGI) {
|
||||||
GUID dxgiGUID = { 0x7b7166ec, 0x21c7, 0x44ae, { 0xb2, 0x1a, 0xc9, 0xae, 0x32, 0x1a, 0xe3, 0x69 } };
|
GUID dxgiGUID = { 0x7b7166ec, 0x21c7, 0x44ae, { 0xb2, 0x1a, 0xc9, 0xae, 0x32, 0x1a, 0xe3, 0x69 } };
|
||||||
CreateDXGI(&dxgiGUID, (void **)&data->pDXGIFactory);
|
pCreateDXGI(&dxgiGUID, (void **)&data->pDXGIFactory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -374,7 +461,6 @@ static BOOL WIN_DeclareDPIAwareUnaware(SDL_VideoDevice *_this)
|
|||||||
|
|
||||||
static BOOL WIN_DeclareDPIAwareSystem(SDL_VideoDevice *_this)
|
static BOOL WIN_DeclareDPIAwareSystem(SDL_VideoDevice *_this)
|
||||||
{
|
{
|
||||||
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
|
||||||
SDL_VideoData *data = _this->internal;
|
SDL_VideoData *data = _this->internal;
|
||||||
|
|
||||||
if (data->SetProcessDpiAwarenessContext) {
|
if (data->SetProcessDpiAwarenessContext) {
|
||||||
@@ -386,9 +472,9 @@ static BOOL WIN_DeclareDPIAwareSystem(SDL_VideoDevice *_this)
|
|||||||
} else if (data->SetProcessDPIAware) {
|
} else if (data->SetProcessDPIAware) {
|
||||||
// Windows Vista
|
// Windows Vista
|
||||||
return data->SetProcessDPIAware();
|
return data->SetProcessDPIAware();
|
||||||
|
} else {
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL WIN_DeclareDPIAwarePerMonitor(SDL_VideoDevice *_this)
|
static BOOL WIN_DeclareDPIAwarePerMonitor(SDL_VideoDevice *_this)
|
||||||
@@ -552,9 +638,7 @@ static bool WIN_VideoInit(SDL_VideoDevice *_this)
|
|||||||
|
|
||||||
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
||||||
data->_SDL_WAKEUP = RegisterWindowMessageA("_SDL_WAKEUP");
|
data->_SDL_WAKEUP = RegisterWindowMessageA("_SDL_WAKEUP");
|
||||||
#endif
|
data->WM_TASKBAR_BUTTON_CREATED = WIN_IsWindows7OrGreater() ? RegisterWindowMessageA("TaskbarButtonCreated") : 0;
|
||||||
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
|
||||||
data->WM_TASKBAR_BUTTON_CREATED = RegisterWindowMessageA("TaskbarButtonCreated");
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -580,7 +664,7 @@ void WIN_VideoQuit(SDL_VideoDevice *_this)
|
|||||||
WIN_QuitMouse(_this);
|
WIN_QuitMouse(_this);
|
||||||
|
|
||||||
if (data->taskbar_list) {
|
if (data->taskbar_list) {
|
||||||
IUnknown_Release(data->taskbar_list);
|
data->taskbar_list->lpVtbl->Release(data->taskbar_list);
|
||||||
data->taskbar_list = NULL;
|
data->taskbar_list = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -621,18 +705,18 @@ bool D3D_LoadDLL(void **pD3DDLL, IDirect3D9 **pDirect3D9Interface)
|
|||||||
*pD3DDLL = SDL_LoadObject("D3D9.DLL");
|
*pD3DDLL = SDL_LoadObject("D3D9.DLL");
|
||||||
if (*pD3DDLL) {
|
if (*pD3DDLL) {
|
||||||
/* *INDENT-OFF* */ // clang-format off
|
/* *INDENT-OFF* */ // clang-format off
|
||||||
typedef IDirect3D9 *(WINAPI *Direct3DCreate9_t)(UINT SDKVersion);
|
typedef IDirect3D9 *(WINAPI *pfnDirect3DCreate9)(UINT SDKVersion);
|
||||||
typedef HRESULT (WINAPI* Direct3DCreate9Ex_t)(UINT SDKVersion, IDirect3D9Ex **ppD3D);
|
typedef HRESULT (WINAPI *pfnDirect3DCreate9Ex)(UINT SDKVersion, IDirect3D9Ex **ppD3D);
|
||||||
/* *INDENT-ON* */ // clang-format on
|
/* *INDENT-ON* */ // clang-format on
|
||||||
Direct3DCreate9_t Direct3DCreate9Func;
|
pfnDirect3DCreate9 pDirect3DCreate9;
|
||||||
|
|
||||||
if (SDL_GetHintBoolean(SDL_HINT_WINDOWS_USE_D3D9EX, false)) {
|
if (SDL_GetHintBoolean(SDL_HINT_WINDOWS_USE_D3D9EX, false)) {
|
||||||
Direct3DCreate9Ex_t Direct3DCreate9ExFunc;
|
pfnDirect3DCreate9Ex pDirect3DCreate9Ex;
|
||||||
|
|
||||||
Direct3DCreate9ExFunc = (Direct3DCreate9Ex_t)SDL_LoadFunction(*pD3DDLL, "Direct3DCreate9Ex");
|
pDirect3DCreate9Ex = (pfnDirect3DCreate9Ex)SDL_LoadFunction(*pD3DDLL, "Direct3DCreate9Ex");
|
||||||
if (Direct3DCreate9ExFunc) {
|
if (pDirect3DCreate9Ex) {
|
||||||
IDirect3D9Ex *pDirect3D9ExInterface;
|
IDirect3D9Ex *pDirect3D9ExInterface;
|
||||||
HRESULT hr = Direct3DCreate9ExFunc(D3D_SDK_VERSION, &pDirect3D9ExInterface);
|
HRESULT hr = pDirect3DCreate9Ex(D3D_SDK_VERSION, &pDirect3D9ExInterface);
|
||||||
if (SUCCEEDED(hr)) {
|
if (SUCCEEDED(hr)) {
|
||||||
const GUID IDirect3D9_GUID = { 0x81bdcbca, 0x64d4, 0x426d, { 0xae, 0x8d, 0xad, 0x1, 0x47, 0xf4, 0x27, 0x5c } };
|
const GUID IDirect3D9_GUID = { 0x81bdcbca, 0x64d4, 0x426d, { 0xae, 0x8d, 0xad, 0x1, 0x47, 0xf4, 0x27, 0x5c } };
|
||||||
hr = IDirect3D9Ex_QueryInterface(pDirect3D9ExInterface, &IDirect3D9_GUID, (void **)pDirect3D9Interface);
|
hr = IDirect3D9Ex_QueryInterface(pDirect3D9ExInterface, &IDirect3D9_GUID, (void **)pDirect3D9Interface);
|
||||||
@@ -644,9 +728,9 @@ bool D3D_LoadDLL(void **pD3DDLL, IDirect3D9 **pDirect3D9Interface)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Direct3DCreate9Func = (Direct3DCreate9_t)SDL_LoadFunction(*pD3DDLL, "Direct3DCreate9");
|
pDirect3DCreate9 = (pfnDirect3DCreate9)SDL_LoadFunction(*pD3DDLL, "Direct3DCreate9");
|
||||||
if (Direct3DCreate9Func) {
|
if (pDirect3DCreate9) {
|
||||||
*pDirect3D9Interface = Direct3DCreate9Func(D3D_SDK_VERSION);
|
*pDirect3D9Interface = pDirect3DCreate9(D3D_SDK_VERSION);
|
||||||
if (*pDirect3D9Interface) {
|
if (*pDirect3D9Interface) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -66,7 +66,7 @@
|
|||||||
#define USER_DEFAULT_SCREEN_DPI 96
|
#define USER_DEFAULT_SCREEN_DPI 96
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if WINVER < 0x0601
|
#if WINVER < _WIN32_WINNT_WIN7
|
||||||
// Touch input definitions
|
// Touch input definitions
|
||||||
#define TWF_FINETOUCH 1
|
#define TWF_FINETOUCH 1
|
||||||
#define TWF_WANTPALM 2
|
#define TWF_WANTPALM 2
|
||||||
@@ -287,7 +287,100 @@ typedef struct DISPLAYCONFIG_TARGET_DEVICE_NAME
|
|||||||
|
|
||||||
#define QDC_ONLY_ACTIVE_PATHS 0x00000002
|
#define QDC_ONLY_ACTIVE_PATHS 0x00000002
|
||||||
|
|
||||||
#endif // WINVER < 0x0601
|
#endif // WINVER < _WIN32_WINNT_WIN7
|
||||||
|
|
||||||
|
#if WINVER < _WIN32_WINNT_WIN8
|
||||||
|
// Pen input definitions
|
||||||
|
#define POINTER_MESSAGE_FLAG_NEW 0x00000001
|
||||||
|
#define POINTER_MESSAGE_FLAG_INRANGE 0x00000002
|
||||||
|
#define POINTER_MESSAGE_FLAG_INCONTACT 0x00000004
|
||||||
|
#define POINTER_MESSAGE_FLAG_FIRSTBUTTON 0x00000010
|
||||||
|
#define POINTER_MESSAGE_FLAG_SECONDBUTTON 0x00000020
|
||||||
|
#define POINTER_MESSAGE_FLAG_THIRDBUTTON 0x00000040
|
||||||
|
#define POINTER_MESSAGE_FLAG_FOURTHBUTTON 0x00000080
|
||||||
|
#define POINTER_MESSAGE_FLAG_FIFTHBUTTON 0x00000100
|
||||||
|
#define POINTER_MESSAGE_FLAG_PRIMARY 0x00002000
|
||||||
|
#define POINTER_MESSAGE_FLAG_CONFIDENCE 0x00004000
|
||||||
|
#define POINTER_MESSAGE_FLAG_CANCELED 0x00008000
|
||||||
|
|
||||||
|
#define GET_POINTERID_WPARAM(wParam) (LOWORD(wParam))
|
||||||
|
#define IS_POINTER_FLAG_SET_WPARAM(wParam, flag) (((DWORD)HIWORD(wParam) & (flag)) == (flag))
|
||||||
|
#define IS_POINTER_INCONTACT_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_INCONTACT)
|
||||||
|
#define IS_POINTER_FIRSTBUTTON_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_FIRSTBUTTON)
|
||||||
|
|
||||||
|
typedef DWORD POINTER_INPUT_TYPE;
|
||||||
|
|
||||||
|
enum tagPOINTER_INPUT_TYPE
|
||||||
|
{
|
||||||
|
PT_POINTER = 1,
|
||||||
|
PT_TOUCH,
|
||||||
|
PT_PEN,
|
||||||
|
PT_MOUSE,
|
||||||
|
PT_TOUCHPAD
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef UINT32 POINTER_FLAGS;
|
||||||
|
|
||||||
|
typedef UINT32 PEN_FLAGS;
|
||||||
|
#define PEN_FLAG_NONE 0x00000000
|
||||||
|
#define PEN_FLAG_BARREL 0x00000001
|
||||||
|
#define PEN_FLAG_INVERTED 0x00000002
|
||||||
|
#define PEN_FLAG_ERASER 0x00000004
|
||||||
|
|
||||||
|
typedef UINT32 PEN_MASK;
|
||||||
|
#define PEN_MASK_NONE 0x00000000
|
||||||
|
#define PEN_MASK_PRESSURE 0x00000001
|
||||||
|
#define PEN_MASK_ROTATION 0x00000002
|
||||||
|
#define PEN_MASK_TILT_X 0x00000004
|
||||||
|
#define PEN_MASK_TILT_Y 0x00000008
|
||||||
|
|
||||||
|
typedef enum tagPOINTER_BUTTON_CHANGE_TYPE
|
||||||
|
{
|
||||||
|
POINTER_CHANGE_NONE,
|
||||||
|
POINTER_CHANGE_FIRSTBUTTON_DOWN,
|
||||||
|
POINTER_CHANGE_FIRSTBUTTON_UP,
|
||||||
|
POINTER_CHANGE_SECONDBUTTON_DOWN,
|
||||||
|
POINTER_CHANGE_SECONDBUTTON_UP,
|
||||||
|
POINTER_CHANGE_THIRDBUTTON_DOWN,
|
||||||
|
POINTER_CHANGE_THIRDBUTTON_UP,
|
||||||
|
POINTER_CHANGE_FOURTHBUTTON_DOWN,
|
||||||
|
POINTER_CHANGE_FOURTHBUTTON_UP,
|
||||||
|
POINTER_CHANGE_FIFTHBUTTON_DOWN,
|
||||||
|
POINTER_CHANGE_FIFTHBUTTON_UP
|
||||||
|
} POINTER_BUTTON_CHANGE_TYPE;
|
||||||
|
|
||||||
|
typedef struct tagPOINTER_INFO
|
||||||
|
{
|
||||||
|
POINTER_INPUT_TYPE pointerType;
|
||||||
|
UINT32 pointerId;
|
||||||
|
UINT32 frameId;
|
||||||
|
POINTER_FLAGS pointerFlags;
|
||||||
|
HANDLE sourceDevice;
|
||||||
|
HWND hwndTarget;
|
||||||
|
POINT ptPixelLocation;
|
||||||
|
POINT ptHimetricLocation;
|
||||||
|
POINT ptPixelLocationRaw;
|
||||||
|
POINT ptHimetricLocationRaw;
|
||||||
|
DWORD dwTime;
|
||||||
|
UINT32 historyCount;
|
||||||
|
INT32 InputData;
|
||||||
|
DWORD dwKeyStates;
|
||||||
|
UINT64 PerformanceCount;
|
||||||
|
POINTER_BUTTON_CHANGE_TYPE ButtonChangeType;
|
||||||
|
} POINTER_INFO;
|
||||||
|
|
||||||
|
typedef struct tagPOINTER_PEN_INFO
|
||||||
|
{
|
||||||
|
POINTER_INFO pointerInfo;
|
||||||
|
PEN_FLAGS penFlags;
|
||||||
|
PEN_MASK penMask;
|
||||||
|
UINT32 pressure;
|
||||||
|
UINT32 rotation;
|
||||||
|
INT32 tiltX;
|
||||||
|
INT32 tiltY;
|
||||||
|
} POINTER_PEN_INFO;
|
||||||
|
|
||||||
|
#endif // WINVER < _WIN32_WINNT_WIN8
|
||||||
|
|
||||||
#ifndef HAVE_SHELLSCALINGAPI_H
|
#ifndef HAVE_SHELLSCALINGAPI_H
|
||||||
|
|
||||||
@@ -431,12 +524,39 @@ struct SDL_VideoData
|
|||||||
DWORD clipboard_count;
|
DWORD clipboard_count;
|
||||||
|
|
||||||
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) // Xbox doesn't support user32/shcore
|
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) // Xbox doesn't support user32/shcore
|
||||||
// Touch input functions
|
|
||||||
SDL_SharedObject *userDLL;
|
SDL_SharedObject *userDLL;
|
||||||
|
|
||||||
|
// DisplayConfig functions
|
||||||
|
/* *INDENT-OFF* */ // clang-format off
|
||||||
|
LONG (WINAPI *GetDisplayConfigBufferSizes)( UINT32, UINT32 *, UINT32 *);
|
||||||
|
LONG (WINAPI *QueryDisplayConfig)( UINT32, UINT32 *, DISPLAYCONFIG_PATH_INFO*, UINT32 *, DISPLAYCONFIG_MODE_INFO*, DISPLAYCONFIG_TOPOLOGY_ID*);
|
||||||
|
LONG (WINAPI *DisplayConfigGetDeviceInfo)( DISPLAYCONFIG_DEVICE_INFO_HEADER*);
|
||||||
|
/* *INDENT-ON* */ // clang-format on
|
||||||
|
|
||||||
|
// Touch input functions
|
||||||
/* *INDENT-OFF* */ // clang-format off
|
/* *INDENT-OFF* */ // clang-format off
|
||||||
BOOL (WINAPI *CloseTouchInputHandle)( HTOUCHINPUT );
|
BOOL (WINAPI *CloseTouchInputHandle)( HTOUCHINPUT );
|
||||||
BOOL (WINAPI *GetTouchInputInfo)( HTOUCHINPUT, UINT, PTOUCHINPUT, int );
|
BOOL (WINAPI *GetTouchInputInfo)( HTOUCHINPUT, UINT, PTOUCHINPUT, int );
|
||||||
BOOL (WINAPI *RegisterTouchWindow)( HWND, ULONG );
|
BOOL (WINAPI *RegisterTouchWindow)( HWND, ULONG );
|
||||||
|
/* *INDENT-ON* */ // clang-format on
|
||||||
|
|
||||||
|
// DWM functions
|
||||||
|
SDL_SharedObject *dwmapiDLL;
|
||||||
|
/* *INDENT-OFF* */ // clang-format off
|
||||||
|
HRESULT (WINAPI *DwmFlush)(void);
|
||||||
|
HRESULT (WINAPI *DwmEnableBlurBehindWindow)(HWND hwnd, const DWM_BLURBEHIND *pBlurBehind);
|
||||||
|
HRESULT (WINAPI *DwmSetWindowAttribute)(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute);
|
||||||
|
/* *INDENT-ON* */ // clang-format on
|
||||||
|
|
||||||
|
// Pen input functions
|
||||||
|
/* *INDENT-OFF* */ // clang-format off
|
||||||
|
BOOL (WINAPI *GetPointerType)(UINT32 pointerId, POINTER_INPUT_TYPE *pointerType);
|
||||||
|
BOOL (WINAPI *GetPointerPenInfo)(UINT32 pointerId, POINTER_PEN_INFO *penInfo);
|
||||||
|
/* *INDENT-ON* */ // clang-format on
|
||||||
|
|
||||||
|
// DPI functions
|
||||||
|
SDL_SharedObject *shcoreDLL;
|
||||||
|
/* *INDENT-OFF* */ // clang-format off
|
||||||
BOOL (WINAPI *SetProcessDPIAware)( void );
|
BOOL (WINAPI *SetProcessDPIAware)( void );
|
||||||
BOOL (WINAPI *SetProcessDpiAwarenessContext)( DPI_AWARENESS_CONTEXT );
|
BOOL (WINAPI *SetProcessDpiAwarenessContext)( DPI_AWARENESS_CONTEXT );
|
||||||
DPI_AWARENESS_CONTEXT (WINAPI *SetThreadDpiAwarenessContext)( DPI_AWARENESS_CONTEXT );
|
DPI_AWARENESS_CONTEXT (WINAPI *SetThreadDpiAwarenessContext)( DPI_AWARENESS_CONTEXT );
|
||||||
@@ -447,27 +567,11 @@ struct SDL_VideoData
|
|||||||
UINT (WINAPI *GetDpiForWindow)( HWND );
|
UINT (WINAPI *GetDpiForWindow)( HWND );
|
||||||
BOOL (WINAPI *AreDpiAwarenessContextsEqual)(DPI_AWARENESS_CONTEXT, DPI_AWARENESS_CONTEXT);
|
BOOL (WINAPI *AreDpiAwarenessContextsEqual)(DPI_AWARENESS_CONTEXT, DPI_AWARENESS_CONTEXT);
|
||||||
BOOL (WINAPI *IsValidDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
|
BOOL (WINAPI *IsValidDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
|
||||||
// DisplayConfig functions
|
|
||||||
LONG (WINAPI *GetDisplayConfigBufferSizes)( UINT32, UINT32 *, UINT32 *);
|
|
||||||
LONG (WINAPI *QueryDisplayConfig)( UINT32, UINT32 *, DISPLAYCONFIG_PATH_INFO*, UINT32 *, DISPLAYCONFIG_MODE_INFO*, DISPLAYCONFIG_TOPOLOGY_ID*);
|
|
||||||
LONG (WINAPI *DisplayConfigGetDeviceInfo)( DISPLAYCONFIG_DEVICE_INFO_HEADER*);
|
|
||||||
/* *INDENT-ON* */ // clang-format on
|
|
||||||
|
|
||||||
SDL_SharedObject *shcoreDLL;
|
|
||||||
/* *INDENT-OFF* */ // clang-format off
|
|
||||||
HRESULT (WINAPI *GetDpiForMonitor)( HMONITOR hmonitor,
|
HRESULT (WINAPI *GetDpiForMonitor)( HMONITOR hmonitor,
|
||||||
MONITOR_DPI_TYPE dpiType,
|
MONITOR_DPI_TYPE dpiType,
|
||||||
UINT *dpiX,
|
UINT *dpiX,
|
||||||
UINT *dpiY );
|
UINT *dpiY );
|
||||||
HRESULT (WINAPI *SetProcessDpiAwareness)(PROCESS_DPI_AWARENESS dpiAwareness);
|
HRESULT (WINAPI *SetProcessDpiAwareness)(PROCESS_DPI_AWARENESS dpiAwareness);
|
||||||
BOOL (WINAPI *GetPointerType)(UINT32 pointerId, POINTER_INPUT_TYPE *pointerType);
|
|
||||||
BOOL (WINAPI *GetPointerPenInfo)(UINT32 pointerId, POINTER_PEN_INFO *penInfo);
|
|
||||||
|
|
||||||
SDL_SharedObject *dwmapiDLL;
|
|
||||||
/* *INDENT-OFF* */ // clang-format off
|
|
||||||
HRESULT (WINAPI *DwmFlush)(void);
|
|
||||||
HRESULT (WINAPI *DwmEnableBlurBehindWindow)(HWND hwnd, const DWM_BLURBEHIND *pBlurBehind);
|
|
||||||
HRESULT (WINAPI *DwmSetWindowAttribute)(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute);
|
|
||||||
/* *INDENT-ON* */ // clang-format on
|
/* *INDENT-ON* */ // clang-format on
|
||||||
#endif // !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
#endif // !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
||||||
|
|
||||||
@@ -541,7 +645,7 @@ struct SDL_VideoData
|
|||||||
BYTE pre_hook_key_state[256];
|
BYTE pre_hook_key_state[256];
|
||||||
UINT _SDL_WAKEUP;
|
UINT _SDL_WAKEUP;
|
||||||
|
|
||||||
#if !(defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES))
|
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
||||||
UINT WM_TASKBAR_BUTTON_CREATED;
|
UINT WM_TASKBAR_BUTTON_CREATED;
|
||||||
ITaskbarList3 *taskbar_list;
|
ITaskbarList3 *taskbar_list;
|
||||||
#endif
|
#endif
|
||||||
|
@@ -141,7 +141,7 @@ static DWORD GetWindowStyleEx(SDL_Window *window)
|
|||||||
return style;
|
return style;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !(defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES))
|
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
||||||
static ITaskbarList3 *GetTaskbarList(SDL_Window *window)
|
static ITaskbarList3 *GetTaskbarList(SDL_Window *window)
|
||||||
{
|
{
|
||||||
const SDL_WindowData *data = window->internal;
|
const SDL_WindowData *data = window->internal;
|
||||||
@@ -2158,7 +2158,7 @@ bool WIN_FlashWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_FlashOperat
|
|||||||
|
|
||||||
bool WIN_ApplyWindowProgress(SDL_VideoDevice *_this, SDL_Window *window)
|
bool WIN_ApplyWindowProgress(SDL_VideoDevice *_this, SDL_Window *window)
|
||||||
{
|
{
|
||||||
#if !(defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES))
|
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
||||||
SDL_WindowData *data = window->internal;
|
SDL_WindowData *data = window->internal;
|
||||||
if (!data->taskbar_button_created) {
|
if (!data->taskbar_button_created) {
|
||||||
return true;
|
return true;
|
||||||
|
@@ -5,6 +5,28 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <dbghelp.h>
|
#include <dbghelp.h>
|
||||||
|
|
||||||
|
#ifndef STATUS_HEAP_CORRUPTION
|
||||||
|
#define STATUS_HEAP_CORRUPTION ((DWORD)0xC0000374L)
|
||||||
|
#endif
|
||||||
|
#ifndef EXCEPTION_UNWINDING
|
||||||
|
#define EXCEPTION_UNWINDING 0x2
|
||||||
|
#endif
|
||||||
|
#ifndef EXCEPTION_EXIT_UNWIND
|
||||||
|
#define EXCEPTION_EXIT_UNWIND 0x4
|
||||||
|
#endif
|
||||||
|
#ifndef EXCEPTION_STACK_INVALID
|
||||||
|
#define EXCEPTION_STACK_INVALID 0x8
|
||||||
|
#endif
|
||||||
|
#ifndef EXCEPTION_NESTED_CALL
|
||||||
|
#define EXCEPTION_NESTED_CALL 0x10
|
||||||
|
#endif
|
||||||
|
#ifndef EXCEPTION_TARGET_UNWIND
|
||||||
|
#define EXCEPTION_TARGET_UNWIND 0x20
|
||||||
|
#endif
|
||||||
|
#ifndef EXCEPTION_COLLIDED_UNWIND
|
||||||
|
#define EXCEPTION_COLLIDED_UNWIND 0x40
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
Reference in New Issue
Block a user