From 2f5bc17ea63a9691ba39718cb701a9c3a13cc3c2 Mon Sep 17 00:00:00 2001 From: nightmareci <46542221+nightmareci@users.noreply.github.com> Date: Mon, 8 Sep 2025 13:00:26 -0700 Subject: [PATCH] Fix support for Windows XP and up (#13904) --- .gitignore | 2 + CMakeLists.txt | 27 +- cmake/PreseedMSVCCache.cmake | 360 ++++++++------- include/SDL3/SDL_stdinc.h | 22 +- src/audio/directsound/SDL_directsound.c | 22 +- src/audio/wasapi/SDL_wasapi.c | 4 +- .../SDL_camera_mediafoundation.c | 16 +- src/core/windows/SDL_gameinput.cpp | 8 +- src/core/windows/SDL_windows.c | 10 - src/core/windows/SDL_windows.h | 47 +- src/dialog/windows/SDL_windowsdialog.c | 436 +++++++++++++----- src/filesystem/windows/SDL_sysfsops.c | 4 + src/gpu/d3d12/SDL_gpu_d3d12.c | 68 +-- src/joystick/windows/SDL_windowsjoystick.c | 45 +- src/joystick/windows/SDL_windowsjoystick_c.h | 4 + src/locale/windows/SDL_syslocale.c | 2 +- src/render/direct3d11/SDL_render_d3d11.c | 40 +- src/render/direct3d12/SDL_render_d3d12.c | 38 +- src/thread/windows/SDL_syscond_cv.c | 8 +- src/thread/windows/SDL_sysmutex.c | 8 +- src/thread/windows/SDL_sysrwlock_srw.c | 14 +- src/thread/windows/SDL_syssem.c | 4 +- src/thread/windows/SDL_systhread.c | 2 +- src/time/windows/SDL_systime.c | 2 +- src/timer/windows/SDL_systimer.c | 126 ++--- src/video/windows/SDL_windowsevents.c | 5 +- src/video/windows/SDL_windowsmessagebox.c | 20 +- src/video/windows/SDL_windowsmodes.c | 15 +- src/video/windows/SDL_windowsvideo.c | 128 ++++- src/video/windows/SDL_windowsvideo.h | 144 +++++- src/video/windows/SDL_windowswindow.c | 4 +- test/win32/sdlprocdump.c | 22 + 32 files changed, 1096 insertions(+), 561 deletions(-) diff --git a/.gitignore b/.gitignore index 394f4b8439..3f82abce64 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ compile_commands.json *.pc test/*.test wayland-generated-protocols +CMakeSettings.json # for CLion .idea @@ -98,6 +99,7 @@ src/render/direct3d12/D3D12_*_One.h src/render/direct3d12/D3D12_*_Series.h src/gpu/d3d12/D3D12_*_One.h src/gpu/d3d12/D3D12_*_Series.h +out/ # for Android android-project/local.properties diff --git a/CMakeLists.txt b/CMakeLists.txt index f8bb29d614..3ec8713403 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2172,7 +2172,7 @@ elseif(WINDOWS) else() set(PROCESSOR_ARCH "x86") endif() - sdl_link_directories("$") + sdl_link_directories("$") sdl_include_directories(PRIVATE SYSTEM "$") endif() endif() @@ -2183,7 +2183,8 @@ elseif(WINDOWS) check_c_source_compiles(" #include #include - int main(int argc, char **argv) { return 0; }" HAVE_XINPUT_H) + int main(int argc, char **argv) { return 0; }" HAVE_XINPUT_H + ) endif() # headers needed elsewhere @@ -2206,12 +2207,18 @@ elseif(WINDOWS) check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H) check_include_file(audioclient.h HAVE_AUDIOCLIENT_H) check_include_file(sensorsapi.h HAVE_SENSORSAPI_H) - check_include_file(shellscalingapi.h HAVE_SHELLSCALINGAPI_H) + check_c_source_compiles(" + #include + static void *ptr = GetDpiForMonitor; + int main (int argc, char **argv) { return 0; } + " HAVE_SHELLSCALINGAPI_H + ) check_c_source_compiles(" #include #include #include #include + static MFVideoPrimaries primaries = MFVideoPrimaries_DCI_P3; int main(int argc, char **argv) { return 0; } " HAVE_MFAPI_H ) @@ -2255,7 +2262,7 @@ elseif(WINDOWS) set(SDL_VIDEO_RENDER_D3D11 1) set(HAVE_RENDER_D3D11 TRUE) endif() - if(SDL_RENDER_D3D12) + if(SDL_RENDER_D3D12 AND HAVE_DXGI1_6_H) set(SDL_VIDEO_RENDER_D3D12 1) set(HAVE_RENDER_D3D12 TRUE) endif() @@ -3462,15 +3469,7 @@ endif() sdl_glob_sources(${SDL3_SOURCE_DIR}/src/tray/*.c) if(SDL_GPU) - if(HAVE_D3D11_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) + if(HAVE_DXGI1_6_H) sdl_glob_sources( "${SDL3_SOURCE_DIR}/src/gpu/d3d12/*.c" "${SDL3_SOURCE_DIR}/src/gpu/d3d12/*.h" @@ -3486,7 +3485,7 @@ if(SDL_GPU) set(SDL_GPU_VULKAN 1) set(HAVE_SDL_GPU TRUE) endif() - if(SDL_RENDER_GPU) + if(SDL_RENDER_GPU AND HAVE_SDL_GPU) set(SDL_VIDEO_RENDER_GPU 1) set(HAVE_RENDER_GPU TRUE) endif() diff --git a/cmake/PreseedMSVCCache.cmake b/cmake/PreseedMSVCCache.cmake index 17495aa480..e6fe70a335 100644 --- a/cmake/PreseedMSVCCache.cmake +++ b/cmake/PreseedMSVCCache.cmake @@ -1,183 +1,193 @@ if(MSVC) function(SDL_Preseed_CMakeCache) - set(COMPILER_SUPPORTS_W3 "1" CACHE INTERNAL "Test /W3") - set(COMPILER_SUPPORTS_FDIAGNOSTICS_COLOR_ALWAYS "" CACHE INTERNAL "Test COMPILER_SUPPORTS_FDIAGNOSTICS_COLOR_ALWAYS") - set(HAVE_ALLOCA_H "" CACHE INTERNAL "Have include alloca.h") - set(HAVE_AUDIOCLIENT_H "1" CACHE INTERNAL "Have include audioclient.h") - set(HAVE_D3D11_H "1" CACHE INTERNAL "Have include d3d11_1.h") - set(HAVE_D3D9_H "1" CACHE INTERNAL "Have include d3d9.h") - set(HAVE_DDRAW_H "1" CACHE INTERNAL "Have include ddraw.h") - set(HAVE_DINPUT_H "1" CACHE INTERNAL "Have include dinput.h") - set(HAVE_DSOUND_H "1" CACHE INTERNAL "Have include dsound.h") - set(HAVE_DXGI_H "1" CACHE INTERNAL "Have include dxgi.h") - set(HAVE_LIBM "" CACHE INTERNAL "Have library m") - set(HAVE_MALLOC "1" CACHE INTERNAL "Have include malloc.h") - set(HAVE_MMDEVICEAPI_H "1" CACHE INTERNAL "Have include mmdeviceapi.h") - set(HAVE_SENSORSAPI_H "1" CACHE INTERNAL "Have include sensorsapi.h") - set(HAVE_SHELLSCALINGAPI_H "1" CACHE INTERNAL "Have include shellscalingapi.h") - set(HAVE_TPCSHRD_H "1" CACHE INTERNAL "Have include tpcshrd.h") - set(HAVE_WIN32_CC "1" CACHE INTERNAL "Test HAVE_WIN32_CC") - set(HAVE_XINPUT_H "1" CACHE INTERNAL "Test HAVE_XINPUT_H") - set(LIBC_HAS_ABS "1" CACHE INTERNAL "Have symbol abs") - set(LIBC_HAS_ACOS "1" CACHE INTERNAL "Have symbol acos") - set(LIBC_HAS_ACOSF "1" CACHE INTERNAL "Have symbol acosf") - set(LIBC_HAS_ASIN "1" CACHE INTERNAL "Have symbol asin") - set(LIBC_HAS_ASINF "1" CACHE INTERNAL "Have symbol asinf") - set(LIBC_HAS_ATAN "1" CACHE INTERNAL "Have symbol atan") - set(LIBC_HAS_ATAN2 "1" CACHE INTERNAL "Have symbol atan2") - set(LIBC_HAS_ATAN2F "1" CACHE INTERNAL "Have symbol atan2f") - set(LIBC_HAS_ATANF "1" CACHE INTERNAL "Have symbol atanf") - set(LIBC_HAS_ATOF "1" CACHE INTERNAL "Have symbol atof") - set(LIBC_HAS_ATOI "1" CACHE INTERNAL "Have symbol atoi") - set(LIBC_HAS_BCOPY "" CACHE INTERNAL "Have symbol bcopy") - set(LIBC_HAS_CALLOC "1" CACHE INTERNAL "Have symbol calloc") - set(LIBC_HAS_CEIL "1" CACHE INTERNAL "Have symbol ceil") - set(LIBC_HAS_CEILF "1" CACHE INTERNAL "Have symbol ceilf") - set(LIBC_HAS_COPYSIGN "1" CACHE INTERNAL "Have symbol copysign") - set(LIBC_HAS_COPYSIGNF "1" CACHE INTERNAL "Have symbol copysignf") - set(LIBC_HAS_COS "1" CACHE INTERNAL "Have symbol cos") - set(LIBC_HAS_COSF "1" CACHE INTERNAL "Have symbol cosf") - set(LIBC_HAS_EXP "1" CACHE INTERNAL "Have symbol exp") - set(LIBC_HAS_EXPF "1" CACHE INTERNAL "Have symbol expf") - set(LIBC_HAS_FABS "1" CACHE INTERNAL "Have symbol fabs") - set(LIBC_HAS_FABSF "1" CACHE INTERNAL "Have symbol fabsf") - set(LIBC_HAS_FLOAT_H "1" CACHE INTERNAL "Have include float.h") - set(LIBC_HAS_FLOOR "1" CACHE INTERNAL "Have symbol floor") - set(LIBC_HAS_FLOORF "1" CACHE INTERNAL "Have symbol floorf") - set(LIBC_HAS_FMOD "1" CACHE INTERNAL "Have symbol fmod") - set(LIBC_HAS_FMODF "1" CACHE INTERNAL "Have symbol fmodf") - set(LIBC_HAS_FOPEN64 "" CACHE INTERNAL "Have symbol fopen64") - set(LIBC_HAS_FREE "1" CACHE INTERNAL "Have symbol free") - set(LIBC_HAS_FSEEKO "" CACHE INTERNAL "Have symbol fseeko") - set(LIBC_HAS_FSEEKO64 "" CACHE INTERNAL "Have symbol fseeko64") - set(LIBC_HAS_GETENV "1" CACHE INTERNAL "Have symbol getenv") - set(LIBC_HAS_ICONV_H "" CACHE INTERNAL "Have include iconv.h") - set(LIBC_HAS_INDEX "" CACHE INTERNAL "Have symbol index") - set(LIBC_HAS_INTTYPES_H "1" CACHE INTERNAL "Have include inttypes.h") - set(LIBC_HAS_ISINF "1" CACHE INTERNAL "Have include isinf(double)") - set(LIBC_ISINF_HANDLES_FLOAT "1" CACHE INTERNAL "Have include isinf(float)") - set(LIBC_HAS_ISINFF "" CACHE INTERNAL "Have include isinff(float)") - set(LIBC_HAS_ISNAN "1" CACHE INTERNAL "Have include isnan(double)") - set(LIBC_ISNAN_HANDLES_FLOAT "1" CACHE INTERNAL "Have include isnan(float)") - set(LIBC_HAS_ISNANF "" CACHE INTERNAL "Have include isnanf(float)") - set(LIBC_HAS_ITOA "1" CACHE INTERNAL "Have symbol itoa") - set(LIBC_HAS_LIMITS_H "1" CACHE INTERNAL "Have include limits.h") - set(LIBC_HAS_LOG "1" CACHE INTERNAL "Have symbol log") - set(LIBC_HAS_LOG10 "1" CACHE INTERNAL "Have symbol log10") - set(LIBC_HAS_LOG10F "1" CACHE INTERNAL "Have symbol log10f") - set(LIBC_HAS_LOGF "1" CACHE INTERNAL "Have symbol logf") - set(LIBC_HAS_LROUND "1" CACHE INTERNAL "Have symbol lround") - set(LIBC_HAS_LROUNDF "1" CACHE INTERNAL "Have symbol lroundf") - set(LIBC_HAS_MALLOC "1" CACHE INTERNAL "Have symbol malloc") - set(LIBC_HAS_MALLOC_H "1" CACHE INTERNAL "Have include malloc.h") - set(LIBC_HAS_MATH_H "1" CACHE INTERNAL "Have include math.h") - set(LIBC_HAS_MEMCMP "1" CACHE INTERNAL "Have symbol memcmp") - set(LIBC_HAS_MEMCPY "1" CACHE INTERNAL "Have symbol memcpy") - set(LIBC_HAS_MEMMOVE "1" CACHE INTERNAL "Have symbol memmove") - set(LIBC_HAS_MEMORY_H "1" CACHE INTERNAL "Have include memory.h") - set(LIBC_HAS_MEMSET "1" CACHE INTERNAL "Have symbol memset") - set(LIBC_HAS_MODF "1" CACHE INTERNAL "Have symbol modf") - set(LIBC_HAS_MODFF "1" CACHE INTERNAL "Have symbol modff") - set(LIBC_HAS_POW "1" CACHE INTERNAL "Have symbol pow") - set(LIBC_HAS_POWF "1" CACHE INTERNAL "Have symbol powf") - set(LIBC_HAS_PUTENV "1" CACHE INTERNAL "Have symbol putenv") - set(LIBC_HAS_REALLOC "1" CACHE INTERNAL "Have symbol realloc") - set(LIBC_HAS_RINDEX "" CACHE INTERNAL "Have symbol rindex") - set(LIBC_HAS_ROUND "1" CACHE INTERNAL "Have symbol round") - set(LIBC_HAS_ROUNDF "1" CACHE INTERNAL "Have symbol roundf") - set(LIBC_HAS_SCALBN "1" CACHE INTERNAL "Have symbol scalbn") - set(LIBC_HAS_SCALBNF "1" CACHE INTERNAL "Have symbol scalbnf") - set(LIBC_HAS_SETENV "" CACHE INTERNAL "Have symbol setenv") - set(LIBC_HAS_SIGNAL_H "1" CACHE INTERNAL "Have include signal.h") - set(LIBC_HAS_SIN "1" CACHE INTERNAL "Have symbol sin") - set(LIBC_HAS_SINF "1" CACHE INTERNAL "Have symbol sinf") - set(LIBC_HAS_SQR "" CACHE INTERNAL "Have symbol sqr") - set(LIBC_HAS_SQRT "1" CACHE INTERNAL "Have symbol sqrt") - set(LIBC_HAS_SQRTF "1" CACHE INTERNAL "Have symbol sqrtf") - set(LIBC_HAS_SSCANF "1" CACHE INTERNAL "Have symbol sscanf") - set(LIBC_HAS_STDARG_H "1" CACHE INTERNAL "Have include stdarg.h") - set(LIBC_HAS_STDBOOL_H "1" CACHE INTERNAL "Have include stdbool.h") - set(LIBC_HAS_STDDEF_H "1" CACHE INTERNAL "Have include stddef.h") - set(LIBC_HAS_STDINT_H "1" CACHE INTERNAL "Have include stdint.h") - set(LIBC_HAS_STDIO_H "1" CACHE INTERNAL "Have include stdio.h") - set(LIBC_HAS_STDLIB_H "1" CACHE INTERNAL "Have include stdlib.h") - set(LIBC_HAS_STRCHR "1" CACHE INTERNAL "Have symbol strchr") - set(LIBC_HAS_STRCMP "1" CACHE INTERNAL "Have symbol strcmp") - set(LIBC_HAS_STRINGS_H "" CACHE INTERNAL "Have include strings.h") - set(LIBC_HAS_STRING_H "1" CACHE INTERNAL "Have include string.h") - set(LIBC_HAS_STRLCAT "" CACHE INTERNAL "Have symbol strlcat") - set(LIBC_HAS_STRLCPY "" CACHE INTERNAL "Have symbol strlcpy") - set(LIBC_HAS_STRLEN "1" CACHE INTERNAL "Have symbol strlen") - set(LIBC_HAS_STRNCMP "1" CACHE INTERNAL "Have symbol strncmp") - set(LIBC_HAS_STRNLEN "1" CACHE INTERNAL "Have symbol strnlen") - set(LIBC_HAS_STRNSTR "" CACHE INTERNAL "Have symbol strnstr") - set(LIBC_HAS_STRPBRK "1" CACHE INTERNAL "Have symbol strpbrk") - set(LIBC_HAS_STRRCHR "1" CACHE INTERNAL "Have symbol strrchr") - set(LIBC_HAS_STRSTR "1" CACHE INTERNAL "Have symbol strstr") - set(LIBC_HAS_STRTOD "1" CACHE INTERNAL "Have symbol strtod") - set(LIBC_HAS_STRTOK_R "" CACHE INTERNAL "Have symbol strtok_r") - set(LIBC_HAS_STRTOL "1" CACHE INTERNAL "Have symbol strtol") - set(LIBC_HAS_STRTOLL "1" CACHE INTERNAL "Have symbol strtoll") - set(LIBC_HAS_STRTOUL "1" CACHE INTERNAL "Have symbol strtoul") - set(LIBC_HAS_STRTOULL "1" CACHE INTERNAL "Have symbol strtoull") - set(LIBC_HAS_SYS_TYPES_H "1" CACHE INTERNAL "Have include sys/types.h") - set(LIBC_HAS_TAN "1" CACHE INTERNAL "Have symbol tan") - set(LIBC_HAS_TANF "1" CACHE INTERNAL "Have symbol tanf") - set(LIBC_HAS_TIME_H "1" CACHE INTERNAL "Have include time.h") - set(LIBC_HAS_TRUNC "1" CACHE INTERNAL "Have symbol trunc") - set(LIBC_HAS_TRUNCF "1" CACHE INTERNAL "Have symbol truncf") - set(LIBC_HAS_UNSETENV "" CACHE INTERNAL "Have symbol unsetenv") - set(LIBC_HAS_VSNPRINTF "1" CACHE INTERNAL "Have symbol vsnprintf") - set(LIBC_HAS_VSSCANF "1" CACHE INTERNAL "Have symbol vsscanf") - set(LIBC_HAS_WCHAR_H "1" CACHE INTERNAL "Have include wchar.h") - set(LIBC_HAS_WCSCMP "1" CACHE INTERNAL "Have symbol wcscmp") - set(LIBC_HAS_WCSDUP "1" CACHE INTERNAL "Have symbol wcsdup") - set(LIBC_HAS_WCSLCAT "" CACHE INTERNAL "Have symbol wcslcat") - set(LIBC_HAS_WCSLCPY "" CACHE INTERNAL "Have symbol wcslcpy") - set(LIBC_HAS_WCSLEN "1" CACHE INTERNAL "Have symbol wcslen") - set(LIBC_HAS_WCSNCMP "1" CACHE INTERNAL "Have symbol wcsncmp") - set(LIBC_HAS_WCSNLEN "1" CACHE INTERNAL "Have symbol wcsnlen") - set(LIBC_HAS_WCSSTR "1" CACHE INTERNAL "Have symbol wcsstr") - set(LIBC_HAS_WCSTOL "1" CACHE INTERNAL "Have symbol wcstol") - 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") + check_c_source_compiles(" + #include + #if _WIN32_WINNT < 0x0A00 + #error Preseeding is only supported for MSVC supporting Windows 10 or higher + #endif + int main(int argc, char **argv) { return 0; } + " CAN_PRESEED + ) + if(CAN_PRESEED) + set(COMPILER_SUPPORTS_W3 "1" CACHE INTERNAL "Test /W3") + set(COMPILER_SUPPORTS_FDIAGNOSTICS_COLOR_ALWAYS "" CACHE INTERNAL "Test COMPILER_SUPPORTS_FDIAGNOSTICS_COLOR_ALWAYS") + set(HAVE_ALLOCA_H "" CACHE INTERNAL "Have include alloca.h") + set(HAVE_AUDIOCLIENT_H "1" CACHE INTERNAL "Have include audioclient.h") + set(HAVE_D3D11_H "1" CACHE INTERNAL "Have include d3d11_1.h") + set(HAVE_D3D9_H "1" CACHE INTERNAL "Have include d3d9.h") + set(HAVE_DDRAW_H "1" CACHE INTERNAL "Have include ddraw.h") + set(HAVE_DINPUT_H "1" CACHE INTERNAL "Have include dinput.h") + set(HAVE_DSOUND_H "1" CACHE INTERNAL "Have include dsound.h") + set(HAVE_DXGI_H "1" CACHE INTERNAL "Have include dxgi.h") + set(HAVE_LIBM "" CACHE INTERNAL "Have library m") + set(HAVE_MALLOC "1" CACHE INTERNAL "Have include malloc.h") + set(HAVE_MMDEVICEAPI_H "1" CACHE INTERNAL "Have include mmdeviceapi.h") + set(HAVE_SENSORSAPI_H "1" CACHE INTERNAL "Have include sensorsapi.h") + set(HAVE_SHELLSCALINGAPI_H "1" CACHE INTERNAL "Have include shellscalingapi.h") + set(HAVE_TPCSHRD_H "1" CACHE INTERNAL "Have include tpcshrd.h") + set(HAVE_WIN32_CC "1" CACHE INTERNAL "Test HAVE_WIN32_CC") + set(HAVE_XINPUT_H "1" CACHE INTERNAL "Test HAVE_XINPUT_H") + set(LIBC_HAS_ABS "1" CACHE INTERNAL "Have symbol abs") + set(LIBC_HAS_ACOS "1" CACHE INTERNAL "Have symbol acos") + set(LIBC_HAS_ACOSF "1" CACHE INTERNAL "Have symbol acosf") + set(LIBC_HAS_ASIN "1" CACHE INTERNAL "Have symbol asin") + set(LIBC_HAS_ASINF "1" CACHE INTERNAL "Have symbol asinf") + set(LIBC_HAS_ATAN "1" CACHE INTERNAL "Have symbol atan") + set(LIBC_HAS_ATAN2 "1" CACHE INTERNAL "Have symbol atan2") + set(LIBC_HAS_ATAN2F "1" CACHE INTERNAL "Have symbol atan2f") + set(LIBC_HAS_ATANF "1" CACHE INTERNAL "Have symbol atanf") + set(LIBC_HAS_ATOF "1" CACHE INTERNAL "Have symbol atof") + set(LIBC_HAS_ATOI "1" CACHE INTERNAL "Have symbol atoi") + set(LIBC_HAS_BCOPY "" CACHE INTERNAL "Have symbol bcopy") + set(LIBC_HAS_CALLOC "1" CACHE INTERNAL "Have symbol calloc") + set(LIBC_HAS_CEIL "1" CACHE INTERNAL "Have symbol ceil") + set(LIBC_HAS_CEILF "1" CACHE INTERNAL "Have symbol ceilf") + set(LIBC_HAS_COPYSIGN "1" CACHE INTERNAL "Have symbol copysign") + set(LIBC_HAS_COPYSIGNF "1" CACHE INTERNAL "Have symbol copysignf") + set(LIBC_HAS_COS "1" CACHE INTERNAL "Have symbol cos") + set(LIBC_HAS_COSF "1" CACHE INTERNAL "Have symbol cosf") + set(LIBC_HAS_EXP "1" CACHE INTERNAL "Have symbol exp") + set(LIBC_HAS_EXPF "1" CACHE INTERNAL "Have symbol expf") + set(LIBC_HAS_FABS "1" CACHE INTERNAL "Have symbol fabs") + set(LIBC_HAS_FABSF "1" CACHE INTERNAL "Have symbol fabsf") + set(LIBC_HAS_FLOAT_H "1" CACHE INTERNAL "Have include float.h") + set(LIBC_HAS_FLOOR "1" CACHE INTERNAL "Have symbol floor") + set(LIBC_HAS_FLOORF "1" CACHE INTERNAL "Have symbol floorf") + set(LIBC_HAS_FMOD "1" CACHE INTERNAL "Have symbol fmod") + set(LIBC_HAS_FMODF "1" CACHE INTERNAL "Have symbol fmodf") + set(LIBC_HAS_FOPEN64 "" CACHE INTERNAL "Have symbol fopen64") + set(LIBC_HAS_FREE "1" CACHE INTERNAL "Have symbol free") + set(LIBC_HAS_FSEEKO "" CACHE INTERNAL "Have symbol fseeko") + set(LIBC_HAS_FSEEKO64 "" CACHE INTERNAL "Have symbol fseeko64") + set(LIBC_HAS_GETENV "1" CACHE INTERNAL "Have symbol getenv") + set(LIBC_HAS_ICONV_H "" CACHE INTERNAL "Have include iconv.h") + set(LIBC_HAS_INDEX "" CACHE INTERNAL "Have symbol index") + set(LIBC_HAS_INTTYPES_H "1" CACHE INTERNAL "Have include inttypes.h") + set(LIBC_HAS_ISINF "1" CACHE INTERNAL "Have include isinf(double)") + set(LIBC_ISINF_HANDLES_FLOAT "1" CACHE INTERNAL "Have include isinf(float)") + set(LIBC_HAS_ISINFF "" CACHE INTERNAL "Have include isinff(float)") + set(LIBC_HAS_ISNAN "1" CACHE INTERNAL "Have include isnan(double)") + set(LIBC_ISNAN_HANDLES_FLOAT "1" CACHE INTERNAL "Have include isnan(float)") + set(LIBC_HAS_ISNANF "" CACHE INTERNAL "Have include isnanf(float)") + set(LIBC_HAS_ITOA "1" CACHE INTERNAL "Have symbol itoa") + set(LIBC_HAS_LIMITS_H "1" CACHE INTERNAL "Have include limits.h") + set(LIBC_HAS_LOG "1" CACHE INTERNAL "Have symbol log") + set(LIBC_HAS_LOG10 "1" CACHE INTERNAL "Have symbol log10") + set(LIBC_HAS_LOG10F "1" CACHE INTERNAL "Have symbol log10f") + set(LIBC_HAS_LOGF "1" CACHE INTERNAL "Have symbol logf") + set(LIBC_HAS_LROUND "1" CACHE INTERNAL "Have symbol lround") + set(LIBC_HAS_LROUNDF "1" CACHE INTERNAL "Have symbol lroundf") + set(LIBC_HAS_MALLOC "1" CACHE INTERNAL "Have symbol malloc") + set(LIBC_HAS_MALLOC_H "1" CACHE INTERNAL "Have include malloc.h") + set(LIBC_HAS_MATH_H "1" CACHE INTERNAL "Have include math.h") + set(LIBC_HAS_MEMCMP "1" CACHE INTERNAL "Have symbol memcmp") + set(LIBC_HAS_MEMCPY "1" CACHE INTERNAL "Have symbol memcpy") + set(LIBC_HAS_MEMMOVE "1" CACHE INTERNAL "Have symbol memmove") + set(LIBC_HAS_MEMORY_H "1" CACHE INTERNAL "Have include memory.h") + set(LIBC_HAS_MEMSET "1" CACHE INTERNAL "Have symbol memset") + set(LIBC_HAS_MODF "1" CACHE INTERNAL "Have symbol modf") + set(LIBC_HAS_MODFF "1" CACHE INTERNAL "Have symbol modff") + set(LIBC_HAS_POW "1" CACHE INTERNAL "Have symbol pow") + set(LIBC_HAS_POWF "1" CACHE INTERNAL "Have symbol powf") + set(LIBC_HAS_PUTENV "1" CACHE INTERNAL "Have symbol putenv") + set(LIBC_HAS_REALLOC "1" CACHE INTERNAL "Have symbol realloc") + set(LIBC_HAS_RINDEX "" CACHE INTERNAL "Have symbol rindex") + set(LIBC_HAS_ROUND "1" CACHE INTERNAL "Have symbol round") + set(LIBC_HAS_ROUNDF "1" CACHE INTERNAL "Have symbol roundf") + set(LIBC_HAS_SCALBN "1" CACHE INTERNAL "Have symbol scalbn") + set(LIBC_HAS_SCALBNF "1" CACHE INTERNAL "Have symbol scalbnf") + set(LIBC_HAS_SETENV "" CACHE INTERNAL "Have symbol setenv") + set(LIBC_HAS_SIGNAL_H "1" CACHE INTERNAL "Have include signal.h") + set(LIBC_HAS_SIN "1" CACHE INTERNAL "Have symbol sin") + set(LIBC_HAS_SINF "1" CACHE INTERNAL "Have symbol sinf") + set(LIBC_HAS_SQR "" CACHE INTERNAL "Have symbol sqr") + set(LIBC_HAS_SQRT "1" CACHE INTERNAL "Have symbol sqrt") + set(LIBC_HAS_SQRTF "1" CACHE INTERNAL "Have symbol sqrtf") + set(LIBC_HAS_SSCANF "1" CACHE INTERNAL "Have symbol sscanf") + set(LIBC_HAS_STDARG_H "1" CACHE INTERNAL "Have include stdarg.h") + set(LIBC_HAS_STDBOOL_H "1" CACHE INTERNAL "Have include stdbool.h") + set(LIBC_HAS_STDDEF_H "1" CACHE INTERNAL "Have include stddef.h") + set(LIBC_HAS_STDINT_H "1" CACHE INTERNAL "Have include stdint.h") + set(LIBC_HAS_STDIO_H "1" CACHE INTERNAL "Have include stdio.h") + set(LIBC_HAS_STDLIB_H "1" CACHE INTERNAL "Have include stdlib.h") + set(LIBC_HAS_STRCHR "1" CACHE INTERNAL "Have symbol strchr") + set(LIBC_HAS_STRCMP "1" CACHE INTERNAL "Have symbol strcmp") + set(LIBC_HAS_STRINGS_H "" CACHE INTERNAL "Have include strings.h") + set(LIBC_HAS_STRING_H "1" CACHE INTERNAL "Have include string.h") + set(LIBC_HAS_STRLCAT "" CACHE INTERNAL "Have symbol strlcat") + set(LIBC_HAS_STRLCPY "" CACHE INTERNAL "Have symbol strlcpy") + set(LIBC_HAS_STRLEN "1" CACHE INTERNAL "Have symbol strlen") + set(LIBC_HAS_STRNCMP "1" CACHE INTERNAL "Have symbol strncmp") + set(LIBC_HAS_STRNLEN "1" CACHE INTERNAL "Have symbol strnlen") + set(LIBC_HAS_STRNSTR "" CACHE INTERNAL "Have symbol strnstr") + set(LIBC_HAS_STRPBRK "1" CACHE INTERNAL "Have symbol strpbrk") + set(LIBC_HAS_STRRCHR "1" CACHE INTERNAL "Have symbol strrchr") + set(LIBC_HAS_STRSTR "1" CACHE INTERNAL "Have symbol strstr") + set(LIBC_HAS_STRTOD "1" CACHE INTERNAL "Have symbol strtod") + set(LIBC_HAS_STRTOK_R "" CACHE INTERNAL "Have symbol strtok_r") + set(LIBC_HAS_STRTOL "1" CACHE INTERNAL "Have symbol strtol") + set(LIBC_HAS_STRTOLL "1" CACHE INTERNAL "Have symbol strtoll") + set(LIBC_HAS_STRTOUL "1" CACHE INTERNAL "Have symbol strtoul") + set(LIBC_HAS_STRTOULL "1" CACHE INTERNAL "Have symbol strtoull") + set(LIBC_HAS_SYS_TYPES_H "1" CACHE INTERNAL "Have include sys/types.h") + set(LIBC_HAS_TAN "1" CACHE INTERNAL "Have symbol tan") + set(LIBC_HAS_TANF "1" CACHE INTERNAL "Have symbol tanf") + set(LIBC_HAS_TIME_H "1" CACHE INTERNAL "Have include time.h") + set(LIBC_HAS_TRUNC "1" CACHE INTERNAL "Have symbol trunc") + set(LIBC_HAS_TRUNCF "1" CACHE INTERNAL "Have symbol truncf") + set(LIBC_HAS_UNSETENV "" CACHE INTERNAL "Have symbol unsetenv") + set(LIBC_HAS_VSNPRINTF "1" CACHE INTERNAL "Have symbol vsnprintf") + set(LIBC_HAS_VSSCANF "1" CACHE INTERNAL "Have symbol vsscanf") + set(LIBC_HAS_WCHAR_H "1" CACHE INTERNAL "Have include wchar.h") + set(LIBC_HAS_WCSCMP "1" CACHE INTERNAL "Have symbol wcscmp") + set(LIBC_HAS_WCSDUP "1" CACHE INTERNAL "Have symbol wcsdup") + set(LIBC_HAS_WCSLCAT "" CACHE INTERNAL "Have symbol wcslcat") + set(LIBC_HAS_WCSLCPY "" CACHE INTERNAL "Have symbol wcslcpy") + set(LIBC_HAS_WCSLEN "1" CACHE INTERNAL "Have symbol wcslen") + set(LIBC_HAS_WCSNCMP "1" CACHE INTERNAL "Have symbol wcsncmp") + set(LIBC_HAS_WCSNLEN "1" CACHE INTERNAL "Have symbol wcsnlen") + set(LIBC_HAS_WCSSTR "1" CACHE INTERNAL "Have symbol wcsstr") + set(LIBC_HAS_WCSTOL "1" CACHE INTERNAL "Have symbol wcstol") + 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) - 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_MMX "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_MMX") - 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_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_2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE4_2") - endif() + if(CHECK_CPU_ARCHITECTURE_X86) + 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_MMX "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_MMX") + 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_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_2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE4_2") + endif() - if(CHECK_CPU_ARCHITECTURE_X64) - 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_MMX "" CACHE INTERNAL "Test COMPILER_SUPPORTS_MMX") - 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_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_2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE4_2") - endif() + if(CHECK_CPU_ARCHITECTURE_X64) + 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_MMX "" CACHE INTERNAL "Test COMPILER_SUPPORTS_MMX") + 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_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_2 "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_SSE4_2") + endif() - if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "19.1") - 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") - else() - set(HAVE_ROAPI_H "" CACHE INTERNAL "Have include roapi.h") - set(HAVE_WINDOWS_GAMING_INPUT_H "" CACHE INTERNAL "Test HAVE_WINDOWS_GAMING_INPUT_H") + if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "19.1") + 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") + else() + set(HAVE_ROAPI_H "" CACHE INTERNAL "Have include roapi.h") + set(HAVE_WINDOWS_GAMING_INPUT_H "" CACHE INTERNAL "Test HAVE_WINDOWS_GAMING_INPUT_H") + endif() endif() endfunction() endif() diff --git a/include/SDL3/SDL_stdinc.h b/include/SDL3/SDL_stdinc.h index fa8c9a50e8..00b024a86b 100644 --- a/include/SDL3/SDL_stdinc.h +++ b/include/SDL3/SDL_stdinc.h @@ -49,10 +49,30 @@ #include #include -#include #include #include +/* 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 +#endif + #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ defined(SDL_INCLUDE_INTTYPES_H) #include diff --git a/src/audio/directsound/SDL_directsound.c b/src/audio/directsound/SDL_directsound.c index ab4dd0cc53..c7d5db525f 100644 --- a/src/audio/directsound/SDL_directsound.c +++ b/src/audio/directsound/SDL_directsound.c @@ -40,16 +40,16 @@ static bool SupportsIMMDevice = false; // DirectX function pointers for audio static SDL_SharedObject *DSoundDLL = NULL; -typedef HRESULT(WINAPI *fnDirectSoundCreate8)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN); -typedef HRESULT(WINAPI *fnDirectSoundEnumerateW)(LPDSENUMCALLBACKW, LPVOID); -typedef HRESULT(WINAPI *fnDirectSoundCaptureCreate8)(LPCGUID, LPDIRECTSOUNDCAPTURE8 *, LPUNKNOWN); -typedef HRESULT(WINAPI *fnDirectSoundCaptureEnumerateW)(LPDSENUMCALLBACKW, LPVOID); -typedef HRESULT(WINAPI *fnGetDeviceID)(LPCGUID, LPGUID); -static fnDirectSoundCreate8 pDirectSoundCreate8 = NULL; -static fnDirectSoundEnumerateW pDirectSoundEnumerateW = NULL; -static fnDirectSoundCaptureCreate8 pDirectSoundCaptureCreate8 = NULL; -static fnDirectSoundCaptureEnumerateW pDirectSoundCaptureEnumerateW = NULL; -static fnGetDeviceID pGetDeviceID = NULL; +typedef HRESULT (WINAPI *pfnDirectSoundCreate8)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN); +typedef HRESULT (WINAPI *pfnDirectSoundEnumerateW)(LPDSENUMCALLBACKW, LPVOID); +typedef HRESULT (WINAPI *pfnDirectSoundCaptureCreate8)(LPCGUID, LPDIRECTSOUNDCAPTURE8 *, LPUNKNOWN); +typedef HRESULT (WINAPI *pfnDirectSoundCaptureEnumerateW)(LPDSENUMCALLBACKW, LPVOID); +typedef HRESULT (WINAPI *pfnGetDeviceID)(LPCGUID, LPGUID); +static pfnDirectSoundCreate8 pDirectSoundCreate8 = NULL; +static pfnDirectSoundEnumerateW pDirectSoundEnumerateW = NULL; +static pfnDirectSoundCaptureCreate8 pDirectSoundCaptureCreate8 = NULL; +static pfnDirectSoundCaptureEnumerateW pDirectSoundCaptureEnumerateW = NULL; +static pfnGetDeviceID pGetDeviceID = NULL; #include 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... #define DSOUNDLOAD(f) \ { \ - p##f = (fn##f)SDL_LoadFunction(DSoundDLL, #f); \ + p##f = (pfn##f)SDL_LoadFunction(DSoundDLL, #f); \ if (!p##f) \ loaded = false; \ } diff --git a/src/audio/wasapi/SDL_wasapi.c b/src/audio/wasapi/SDL_wasapi.c index 46e2ac005f..ab27eb0ef1 100644 --- a/src/audio/wasapi/SDL_wasapi.c +++ b/src/audio/wasapi/SDL_wasapi.c @@ -45,8 +45,8 @@ // handle to Avrt.dll--Vista and later!--for flagging the callback thread as "Pro Audio" (low latency). static HMODULE libavrt = NULL; -typedef HANDLE(WINAPI *pfnAvSetMmThreadCharacteristicsW)(LPCWSTR, LPDWORD); -typedef BOOL(WINAPI *pfnAvRevertMmThreadCharacteristics)(HANDLE); +typedef HANDLE (WINAPI *pfnAvSetMmThreadCharacteristicsW)(LPCWSTR, LPDWORD); +typedef BOOL (WINAPI *pfnAvRevertMmThreadCharacteristics)(HANDLE); static pfnAvSetMmThreadCharacteristicsW pAvSetMmThreadCharacteristicsW = NULL; static pfnAvRevertMmThreadCharacteristics pAvRevertMmThreadCharacteristics = NULL; diff --git a/src/camera/mediafoundation/SDL_camera_mediafoundation.c b/src/camera/mediafoundation/SDL_camera_mediafoundation.c index 433be4d86b..a059b131fe 100644 --- a/src/camera/mediafoundation/SDL_camera_mediafoundation.c +++ b/src/camera/mediafoundation/SDL_camera_mediafoundation.c @@ -324,18 +324,18 @@ static const GUID *SDLFmtToMFVidFmtGuid(SDL_PixelFormat format) // mf.dll ... static HMODULE libmf = NULL; -typedef HRESULT(WINAPI *pfnMFEnumDeviceSources)(IMFAttributes *,IMFActivate ***,UINT32 *); -typedef HRESULT(WINAPI *pfnMFCreateDeviceSource)(IMFAttributes *, IMFMediaSource **); +typedef HRESULT (WINAPI *pfnMFEnumDeviceSources)(IMFAttributes *,IMFActivate ***,UINT32 *); +typedef HRESULT (WINAPI *pfnMFCreateDeviceSource)(IMFAttributes *, IMFMediaSource **); static pfnMFEnumDeviceSources pMFEnumDeviceSources = NULL; static pfnMFCreateDeviceSource pMFCreateDeviceSource = NULL; // mfplat.dll ... static HMODULE libmfplat = NULL; -typedef HRESULT(WINAPI *pfnMFStartup)(ULONG, DWORD); -typedef HRESULT(WINAPI *pfnMFShutdown)(void); -typedef HRESULT(WINAPI *pfnMFCreateAttributes)(IMFAttributes **, UINT32); -typedef HRESULT(WINAPI *pfnMFCreateMediaType)(IMFMediaType **); -typedef HRESULT(WINAPI *pfnMFGetStrideForBitmapInfoHeader)(DWORD, DWORD, LONG *); +typedef HRESULT (WINAPI *pfnMFStartup)(ULONG, DWORD); +typedef HRESULT (WINAPI *pfnMFShutdown)(void); +typedef HRESULT (WINAPI *pfnMFCreateAttributes)(IMFAttributes **, UINT32); +typedef HRESULT (WINAPI *pfnMFCreateMediaType)(IMFMediaType **); +typedef HRESULT (WINAPI *pfnMFGetStrideForBitmapInfoHeader)(DWORD, DWORD, LONG *); static pfnMFStartup pMFStartup = NULL; static pfnMFShutdown pMFShutdown = NULL; @@ -345,7 +345,7 @@ static pfnMFGetStrideForBitmapInfoHeader pMFGetStrideForBitmapInfoHeader = NULL; // mfreadwrite.dll ... static HMODULE libmfreadwrite = NULL; -typedef HRESULT(WINAPI *pfnMFCreateSourceReaderFromMediaSource)(IMFMediaSource *, IMFAttributes *, IMFSourceReader **); +typedef HRESULT (WINAPI *pfnMFCreateSourceReaderFromMediaSource)(IMFMediaSource *, IMFAttributes *, IMFSourceReader **); static pfnMFCreateSourceReaderFromMediaSource pMFCreateSourceReaderFromMediaSource = NULL; diff --git a/src/core/windows/SDL_gameinput.cpp b/src/core/windows/SDL_gameinput.cpp index e2ea3fb4ab..9ed6dc8b6b 100644 --- a/src/core/windows/SDL_gameinput.cpp +++ b/src/core/windows/SDL_gameinput.cpp @@ -38,15 +38,15 @@ bool SDL_InitGameInput(IGameInput **ppGameInput) return false; } - typedef HRESULT (WINAPI *GameInputCreate_t)(IGameInput **gameInput); - GameInputCreate_t GameInputCreateFunc = (GameInputCreate_t)SDL_LoadFunction(g_hGameInputDLL, "GameInputCreate"); - if (!GameInputCreateFunc) { + typedef HRESULT (WINAPI *pfnGameInputCreate)(IGameInput **gameInput); + pfnGameInputCreate pGameInputCreate = (pfnGameInputCreate)SDL_LoadFunction(g_hGameInputDLL, "GameInputCreate"); + if (!pGameInputCreate) { SDL_UnloadObject(g_hGameInputDLL); return false; } IGameInput *pGameInput = NULL; - HRESULT hr = GameInputCreateFunc(&pGameInput); + HRESULT hr = pGameInputCreate(&pGameInput); if (FAILED(hr)) { SDL_UnloadObject(g_hGameInputDLL); return WIN_SetErrorFromHRESULT("GameInputCreate failed", hr); diff --git a/src/core/windows/SDL_windows.c b/src/core/windows/SDL_windows.c index b402a94c1f..7c433b252c 100644 --- a/src/core/windows/SDL_windows.c +++ b/src/core/windows/SDL_windows.c @@ -37,16 +37,6 @@ typedef enum RO_INIT_TYPE } RO_INIT_TYPE; #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 #define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800 #endif diff --git a/src/core/windows/SDL_windows.h b/src/core/windows/SDL_windows.h index 1cd1aca334..80eb0997e5 100644 --- a/src/core/windows/SDL_windows.h +++ b/src/core/windows/SDL_windows.h @@ -21,10 +21,39 @@ // This is an include file for windows.h with the SDL build settings -#ifndef _INCLUDED_WINDOWS_H -#define _INCLUDED_WINDOWS_H +#ifndef SDL_windows_h_ +#define SDL_windows_h_ #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 #define WIN32_LEAN_AND_MEAN 1 #endif @@ -37,11 +66,17 @@ #undef WINVER #undef _WIN32_WINNT #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) -#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 -#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 #define WINVER _WIN32_WINNT @@ -173,4 +208,4 @@ extern int WIN_WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWCH lpWideCh } #endif -#endif // _INCLUDED_WINDOWS_H +#endif // SDL_windows_h_ diff --git a/src/dialog/windows/SDL_windowsdialog.c b/src/dialog/windows/SDL_windowsdialog.c index d1d034ea6f..4ae24fea3f 100644 --- a/src/dialog/windows/SDL_windowsdialog.c +++ b/src/dialog/windows/SDL_windowsdialog.c @@ -29,9 +29,226 @@ #include "../../core/windows/SDL_windows.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 #ifndef __IFileDialog_INTERFACE_DEFINED__ -enum _FILEOPENDIALOGOPTIONS { +enum _FILEOPENDIALOGOPTIONS +{ FOS_OVERWRITEPROMPT = 0x2, FOS_STRICTFILETYPES = 0x4, FOS_NOCHANGEDIR = 0x8, @@ -49,6 +266,7 @@ enum _FILEOPENDIALOGOPTIONS { FOS_HIDEMRUPLACES = 0x20000, FOS_HIDEPINNEDPLACES = 0x40000, FOS_NODEREFERENCELINKS = 0x100000, + FOS_OKBUTTONNEEDSINTERACTION = 0x200000, FOS_DONTADDTORECENT = 0x2000000, FOS_FORCESHOWHIDDEN = 0x10000000, FOS_DEFAULTNOMINIMODE = 0x20000000, @@ -58,133 +276,127 @@ enum _FILEOPENDIALOGOPTIONS { typedef DWORD FILEOPENDIALOGOPTIONS; -typedef enum FDAP { - FDAP_BOTTOM = 0, - FDAP_TOP = 1 -} FDAP; +extern const IID IID_IFileDialog; -/* *INDENT-OFF* */ // clang-format off typedef struct IFileDialogVtbl { - HRESULT (STDMETHODCALLTYPE *QueryInterface)(IFileDialog *, REFIID, void **); - ULONG (STDMETHODCALLTYPE *AddRef)(IFileDialog *); - ULONG (STDMETHODCALLTYPE *Release)(IFileDialog *); - HRESULT (STDMETHODCALLTYPE *Show)(IFileDialog *, HWND); - HRESULT (STDMETHODCALLTYPE *SetFileTypes)(IFileDialog *, UINT, const COMDLG_FILTERSPEC *); - HRESULT (STDMETHODCALLTYPE *SetFileTypeIndex)(IFileDialog *, UINT); - HRESULT (STDMETHODCALLTYPE *GetFileTypeIndex)(IFileDialog *, UINT *); - HRESULT (STDMETHODCALLTYPE *Advise)(IFileDialog *, IFileDialogEvents *, DWORD *); - HRESULT (STDMETHODCALLTYPE *Unadvise)(IFileDialog *, DWORD); - HRESULT (STDMETHODCALLTYPE *SetOptions)(IFileDialog *, FILEOPENDIALOGOPTIONS); - HRESULT (STDMETHODCALLTYPE *GetOptions)(IFileDialog *, FILEOPENDIALOGOPTIONS *); - HRESULT (STDMETHODCALLTYPE *SetDefaultFolder)(IFileDialog *, IShellItem *); - HRESULT (STDMETHODCALLTYPE *SetFolder)(IFileDialog *, IShellItem *); - HRESULT (STDMETHODCALLTYPE *GetFolder)(IFileDialog *, IShellItem **); - HRESULT (STDMETHODCALLTYPE *GetCurrentSelection)(IFileDialog *, IShellItem **); - HRESULT (STDMETHODCALLTYPE *SetFileName)(IFileDialog *, LPCWSTR); - HRESULT (STDMETHODCALLTYPE *GetFileName)(IFileDialog *, LPWSTR *); - HRESULT (STDMETHODCALLTYPE *SetTitle)(IFileDialog *, LPCWSTR); - HRESULT (STDMETHODCALLTYPE *SetOkButtonLabel)(IFileDialog *, LPCWSTR); - HRESULT (STDMETHODCALLTYPE *SetFileNameLabel)(IFileDialog *, LPCWSTR); - HRESULT (STDMETHODCALLTYPE *GetResult)(IFileDialog *, IShellItem **); - HRESULT (STDMETHODCALLTYPE *AddPlace)(IFileDialog *, IShellItem *, FDAP); - HRESULT (STDMETHODCALLTYPE *SetDefaultExtension)(IFileDialog *, LPCWSTR); - HRESULT (STDMETHODCALLTYPE *Close)(IFileDialog *, HRESULT); - HRESULT (STDMETHODCALLTYPE *SetClientGuid)(IFileDialog *, REFGUID); - HRESULT (STDMETHODCALLTYPE *ClearClientData)(IFileDialog *); - HRESULT (STDMETHODCALLTYPE *SetFilter)(IFileDialog *,IShellItemFilter *); + HRESULT (__stdcall *QueryInterface)(IFileDialog *This, REFIID riid, void **ppvObject); + ULONG (__stdcall *AddRef)(IFileDialog *This); + ULONG (__stdcall *Release)(IFileDialog *This); + HRESULT (__stdcall *Show)(IFileDialog *This, HWND hwndOwner); + HRESULT (__stdcall *SetFileTypes)(IFileDialog *This, UINT cFileTypes, const COMDLG_FILTERSPEC *rgFilterSpec); + HRESULT (__stdcall *SetFileTypeIndex)(IFileDialog *This, UINT iFileType); + HRESULT (__stdcall *GetFileTypeIndex)(IFileDialog *This, UINT *piFileType); + HRESULT (__stdcall *Advise)(IFileDialog *This, IFileDialogEvents *pfde, DWORD *pdwCookie); + HRESULT (__stdcall *Unadvise)(IFileDialog *This, DWORD dwCookie); + HRESULT (__stdcall *SetOptions)(IFileDialog *This, FILEOPENDIALOGOPTIONS fos); + HRESULT (__stdcall *GetOptions)(IFileDialog *This, FILEOPENDIALOGOPTIONS *pfos); + HRESULT (__stdcall *SetDefaultFolder)(IFileDialog *This, IShellItem *psi); + HRESULT (__stdcall *SetFolder)(IFileDialog *This, IShellItem *psi); + HRESULT (__stdcall *GetFolder)(IFileDialog *This, IShellItem **ppsi); + HRESULT (__stdcall *GetCurrentSelection)(IFileDialog *This, IShellItem **ppsi); + HRESULT (__stdcall *SetFileName)(IFileDialog *This, LPCWSTR pszName); + HRESULT (__stdcall *GetFileName)(IFileDialog *This, LPWSTR *pszName); + HRESULT (__stdcall *SetTitle)(IFileDialog *This, LPCWSTR pszTitle); + HRESULT (__stdcall *SetOkButtonLabel)(IFileDialog *This, LPCWSTR pszText); + HRESULT (__stdcall *SetFileNameLabel)(IFileDialog *This, LPCWSTR pszLabel); + HRESULT (__stdcall *GetResult)(IFileDialog *This, IShellItem **ppsi); + HRESULT (__stdcall *AddPlace)(IFileDialog *This, IShellItem *psi, FDAP fdap); + HRESULT (__stdcall *SetDefaultExtension)(IFileDialog *This, LPCWSTR pszDefaultExtension); + HRESULT (__stdcall *Close)(IFileDialog *This, HRESULT hr); + HRESULT (__stdcall *SetClientGuid)(IFileDialog *This, REFGUID guid); + HRESULT (__stdcall *ClearClientData)(IFileDialog *This); + HRESULT (__stdcall *SetFilter)(IFileDialog *This, IShellItemFilter *pFilter); } IFileDialogVtbl; -/* *INDENT-ON* */ // clang-format on struct IFileDialog { - const struct IFileDialogVtbl *lpVtbl; + IFileDialogVtbl *lpVtbl; }; -#endif -#ifndef __IFileDialog2_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 +#endif // #ifndef __IFileDialog_INTERFACE_DEFINED__ #ifndef __IFileOpenDialog_INTERFACE_DEFINED__ -/* *INDENT-OFF* */ // clang-format off typedef struct IFileOpenDialogVtbl { - HRESULT (STDMETHODCALLTYPE *QueryInterface)(IFileOpenDialog *, REFIID, void **); - ULONG (STDMETHODCALLTYPE *AddRef)(IFileOpenDialog *); - ULONG (STDMETHODCALLTYPE *Release)(IFileOpenDialog *); - HRESULT (STDMETHODCALLTYPE *Show)(IFileOpenDialog *, HWND); - HRESULT (STDMETHODCALLTYPE *SetFileTypes)(IFileOpenDialog *, UINT, const COMDLG_FILTERSPEC *); - HRESULT (STDMETHODCALLTYPE *SetFileTypeIndex)(IFileOpenDialog *, UINT); - HRESULT (STDMETHODCALLTYPE *GetFileTypeIndex)(IFileOpenDialog *, UINT *); - HRESULT (STDMETHODCALLTYPE *Advise)(IFileOpenDialog *, IFileDialogEvents *, DWORD *); - HRESULT (STDMETHODCALLTYPE *Unadvise)(IFileOpenDialog *, DWORD); - HRESULT (STDMETHODCALLTYPE *SetOptions)(IFileOpenDialog *, FILEOPENDIALOGOPTIONS); - HRESULT (STDMETHODCALLTYPE *GetOptions)(IFileOpenDialog *, FILEOPENDIALOGOPTIONS *); - HRESULT (STDMETHODCALLTYPE *SetDefaultFolder)(IFileOpenDialog *, IShellItem *); - HRESULT (STDMETHODCALLTYPE *SetFolder)(IFileOpenDialog *, IShellItem *); - HRESULT (STDMETHODCALLTYPE *GetFolder)(IFileOpenDialog *, IShellItem **); - HRESULT (STDMETHODCALLTYPE *GetCurrentSelection)(IFileOpenDialog *, IShellItem **); - HRESULT (STDMETHODCALLTYPE *SetFileName)(IFileOpenDialog *, LPCWSTR); - HRESULT (STDMETHODCALLTYPE *GetFileName)(IFileOpenDialog *, LPWSTR *); - HRESULT (STDMETHODCALLTYPE *SetTitle)(IFileOpenDialog *, LPCWSTR); - HRESULT (STDMETHODCALLTYPE *SetOkButtonLabel)(IFileOpenDialog *, LPCWSTR); - HRESULT (STDMETHODCALLTYPE *SetFileNameLabel)(IFileOpenDialog *, LPCWSTR); - HRESULT (STDMETHODCALLTYPE *GetResult)(IFileOpenDialog *, IShellItem **); - HRESULT (STDMETHODCALLTYPE *AddPlace)(IFileOpenDialog *, IShellItem *, FDAP); - HRESULT (STDMETHODCALLTYPE *SetDefaultExtension)(IFileOpenDialog *, LPCWSTR); - HRESULT (STDMETHODCALLTYPE *Close)(IFileOpenDialog *, HRESULT); - HRESULT (STDMETHODCALLTYPE *SetClientGuid)(IFileOpenDialog *, REFGUID); - HRESULT (STDMETHODCALLTYPE *ClearClientData)(IFileOpenDialog *); - HRESULT (STDMETHODCALLTYPE *SetFilter)(IFileOpenDialog *, IShellItemFilter *); - HRESULT (STDMETHODCALLTYPE *GetResults)(IFileOpenDialog *, IShellItemArray **); - HRESULT (STDMETHODCALLTYPE *GetSelectedItems)(IFileOpenDialog *, IShellItemArray **); + HRESULT (__stdcall *QueryInterface)(IFileOpenDialog *This, REFIID riid, void **ppvObject); + ULONG (__stdcall *AddRef)(IFileOpenDialog *This); + ULONG (__stdcall *Release)(IFileOpenDialog *This); + HRESULT (__stdcall *Show)(IFileOpenDialog *This, HWND hwndOwner); + HRESULT (__stdcall *SetFileTypes)(IFileOpenDialog *This, UINT cFileTypes, const COMDLG_FILTERSPEC *rgFilterSpec); + HRESULT (__stdcall *SetFileTypeIndex)(IFileOpenDialog *This, UINT iFileType); + HRESULT (__stdcall *GetFileTypeIndex)(IFileOpenDialog *This, UINT *piFileType); + HRESULT (__stdcall *Advise)(IFileOpenDialog *This, IFileDialogEvents *pfde, DWORD *pdwCookie); + HRESULT (__stdcall *Unadvise)(IFileOpenDialog *This, DWORD dwCookie); + HRESULT (__stdcall *SetOptions)(IFileOpenDialog *This, FILEOPENDIALOGOPTIONS fos); + HRESULT (__stdcall *GetOptions)(IFileOpenDialog *This, FILEOPENDIALOGOPTIONS *pfos); + HRESULT (__stdcall *SetDefaultFolder)(IFileOpenDialog *This, IShellItem *psi); + HRESULT (__stdcall *SetFolder)(IFileOpenDialog *This, IShellItem *psi); + HRESULT (__stdcall *GetFolder)(IFileOpenDialog *This, IShellItem **ppsi); + HRESULT (__stdcall *GetCurrentSelection)(IFileOpenDialog *This, IShellItem **ppsi); + HRESULT (__stdcall *SetFileName)(IFileOpenDialog *This, LPCWSTR pszName); + HRESULT (__stdcall *GetFileName)(IFileOpenDialog *This, LPWSTR *pszName); + HRESULT (__stdcall *SetTitle)(IFileOpenDialog *This, LPCWSTR pszTitle); + HRESULT (__stdcall *SetOkButtonLabel)(IFileOpenDialog *This, LPCWSTR pszText); + HRESULT (__stdcall *SetFileNameLabel)(IFileOpenDialog *This, LPCWSTR pszLabel); + HRESULT (__stdcall *GetResult)(IFileOpenDialog *This, IShellItem **ppsi); + HRESULT (__stdcall *AddPlace)(IFileOpenDialog *This, IShellItem *psi, FDAP fdap); + HRESULT (__stdcall *SetDefaultExtension)(IFileOpenDialog *This, LPCWSTR pszDefaultExtension); + HRESULT (__stdcall *Close)(IFileOpenDialog *This, HRESULT hr); + HRESULT (__stdcall *SetClientGuid)(IFileOpenDialog *This, REFGUID guid); + HRESULT (__stdcall *ClearClientData)(IFileOpenDialog *This); + HRESULT (__stdcall *SetFilter)(IFileOpenDialog *This, IShellItemFilter *pFilter); + HRESULT (__stdcall *GetResults)(IFileOpenDialog *This, IShellItemArray **ppenum); + HRESULT (__stdcall *GetSelectedItems)(IFileOpenDialog *This, IShellItemArray **ppsai); } IFileOpenDialogVtbl; -/* *INDENT-ON* */ // clang-format on 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 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 co_init = false; + if (!WIN_IsWindows7OrGreater()) { + goto quit; + } + // We can assume shell32 is already loaded here. shell32_handle = GetModuleHandle(TEXT("shell32.dll")); if (!shell32_handle) { diff --git a/src/filesystem/windows/SDL_sysfsops.c b/src/filesystem/windows/SDL_sysfsops.c index 9c48ba957b..91394ed7ee 100644 --- a/src/filesystem/windows/SDL_sysfsops.c +++ b/src/filesystem/windows/SDL_sysfsops.c @@ -29,6 +29,10 @@ #include "../../core/windows/SDL_windows.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) { SDL_EnumerationResult result = SDL_ENUM_CONTINUE; diff --git a/src/gpu/d3d12/SDL_gpu_d3d12.c b/src/gpu/d3d12/SDL_gpu_d3d12.c index 75951c711e..e2d3b3cbe2 100644 --- a/src/gpu/d3d12/SDL_gpu_d3d12.c +++ b/src/gpu/d3d12/SDL_gpu_d3d12.c @@ -128,8 +128,8 @@ #endif // Function Pointer Signatures -typedef HRESULT(WINAPI *PFN_CREATE_DXGI_FACTORY1)(const GUID *riid, void **ppFactory); -typedef HRESULT(WINAPI *PFN_DXGI_GET_DEBUG_INTERFACE)(const GUID *riid, void **ppDebug); +typedef HRESULT (WINAPI *pfnCreateDXGIFactory1)(const GUID *riid, void **ppFactory); +typedef HRESULT (WINAPI *pfnDXGIGetDebugInterface)(const GUID *riid, void **ppDebug); // IIDs (from https://www.magnumdb.com/) 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; SDL_SharedObject *d3d12_dll; ID3D12Device *device; - PFN_D3D12_SERIALIZE_ROOT_SIGNATURE D3D12SerializeRootSignature_func; + PFN_D3D12_SERIALIZE_ROOT_SIGNATURE pD3D12SerializeRootSignature; const char *semantic; SDL_iconv_t iconv; @@ -1700,7 +1700,7 @@ static void D3D12_INTERNAL_DestroyRenderer(D3D12Renderer *renderer) renderer->dxgidebug_dll = NULL; } #endif - renderer->D3D12SerializeRootSignature_func = NULL; + renderer->pD3D12SerializeRootSignature = NULL; if (renderer->iconv) { SDL_iconv_close(renderer->iconv); @@ -2556,7 +2556,7 @@ static D3D12GraphicsRootSignature *D3D12_INTERNAL_CreateGraphicsRootSignature( // Serialize the root signature ID3DBlob *serializedRootSignature; 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 (errorBlob) { @@ -2786,7 +2786,7 @@ static D3D12ComputeRootSignature *D3D12_INTERNAL_CreateComputeRootSignature( ID3DBlob *serializedRootSignature; ID3DBlob *errorBlob; - HRESULT res = renderer->D3D12SerializeRootSignature_func( + HRESULT res = renderer->pD3D12SerializeRootSignature( &rootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &serializedRootSignature, @@ -8339,8 +8339,8 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props) #else SDL_SharedObject *d3d12Dll; SDL_SharedObject *dxgiDll; - PFN_D3D12_CREATE_DEVICE D3D12CreateDeviceFunc; - PFN_CREATE_DXGI_FACTORY1 CreateDXGIFactoryFunc; + PFN_D3D12_CREATE_DEVICE pD3D12CreateDevice; + pfnCreateDXGIFactory1 pCreateDXGIFactory1; HRESULT res; ID3D12Device *device; IDXGIFactory1 *factory; @@ -8368,10 +8368,10 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props) return false; } - D3D12CreateDeviceFunc = (PFN_D3D12_CREATE_DEVICE)SDL_LoadFunction( + pD3D12CreateDevice = (PFN_D3D12_CREATE_DEVICE)SDL_LoadFunction( d3d12Dll, 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_UnloadObject(d3d12Dll); return false; @@ -8385,10 +8385,10 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props) return false; } - CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY1)SDL_LoadFunction( + pCreateDXGIFactory1 = (pfnCreateDXGIFactory1)SDL_LoadFunction( dxgiDll, 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_UnloadObject(dxgiDll); return false; @@ -8397,7 +8397,7 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props) // Can we create a device? // Create the DXGI factory - res = CreateDXGIFactoryFunc( + res = pCreateDXGIFactory1( &D3D_IID_IDXGIFactory1, (void **)&factory); 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); // Check feature level 11_1 first, guarantees 64+ UAVs unlike 11_0 Tier1 - res = D3D12CreateDeviceFunc( + res = pD3D12CreateDevice( (IUnknown *)adapter, D3D_FEATURE_LEVEL_11_1, D3D_GUID(D3D_IID_ID3D12Device), @@ -8459,7 +8459,7 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props) if (SUCCEEDED(res)) { supports_64UAVs = true; } else { - res = D3D12CreateDeviceFunc( + res = pD3D12CreateDevice( (IUnknown *)adapter, D3D_FEATURE_LEVEL_CHOICE, 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) static bool D3D12_INTERNAL_TryInitializeDXGIDebug(D3D12Renderer *renderer) { - PFN_DXGI_GET_DEBUG_INTERFACE DXGIGetDebugInterfaceFunc; + pfnDXGIGetDebugInterface pDXGIGetDebugInterface; HRESULT res; renderer->dxgidebug_dll = SDL_LoadObject(DXGIDEBUG_DLL); @@ -8531,19 +8531,19 @@ static bool D3D12_INTERNAL_TryInitializeDXGIDebug(D3D12Renderer *renderer) return false; } - DXGIGetDebugInterfaceFunc = (PFN_DXGI_GET_DEBUG_INTERFACE)SDL_LoadFunction( + pDXGIGetDebugInterface = (pfnDXGIGetDebugInterface)SDL_LoadFunction( renderer->dxgidebug_dll, DXGI_GET_DEBUG_INTERFACE_FUNC); - if (DXGIGetDebugInterfaceFunc == NULL) { + if (pDXGIGetDebugInterface == NULL) { return false; } - res = DXGIGetDebugInterfaceFunc(&D3D_IID_IDXGIDebug, (void **)&renderer->dxgiDebug); + res = pDXGIGetDebugInterface(&D3D_IID_IDXGIDebug, (void **)&renderer->dxgiDebug); if (FAILED(res)) { return false; } - res = DXGIGetDebugInterfaceFunc(&D3D_IID_IDXGIInfoQueue, (void **)&renderer->dxgiInfoQueue); + res = pDXGIGetDebugInterface(&D3D_IID_IDXGIInfoQueue, (void **)&renderer->dxgiInfoQueue); if (FAILED(res)) { return false; } @@ -8554,17 +8554,17 @@ static bool D3D12_INTERNAL_TryInitializeDXGIDebug(D3D12Renderer *renderer) static bool D3D12_INTERNAL_TryInitializeD3D12Debug(D3D12Renderer *renderer) { - PFN_D3D12_GET_DEBUG_INTERFACE D3D12GetDebugInterfaceFunc; + PFN_D3D12_GET_DEBUG_INTERFACE pD3D12GetDebugInterface; HRESULT res; - D3D12GetDebugInterfaceFunc = (PFN_D3D12_GET_DEBUG_INTERFACE)SDL_LoadFunction( + pD3D12GetDebugInterface = (PFN_D3D12_GET_DEBUG_INTERFACE)SDL_LoadFunction( renderer->d3d12_dll, D3D12_GET_DEBUG_INTERFACE_FUNC); - if (D3D12GetDebugInterfaceFunc == NULL) { + if (pD3D12GetDebugInterface == NULL) { 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)) { return false; } @@ -8727,13 +8727,13 @@ static SDL_GPUDevice *D3D12_CreateDevice(bool debugMode, bool preferLowPower, SD PFN_D3D12_XBOX_CREATE_DEVICE D3D12XboxCreateDeviceFunc; D3D12XBOX_CREATE_DEVICE_PARAMETERS createDeviceParams; #else - PFN_CREATE_DXGI_FACTORY1 CreateDXGIFactoryFunc; + pfnCreateDXGIFactory1 pCreateDXGIFactory1; IDXGIFactory1 *factory1; IDXGIFactory5 *factory5; IDXGIFactory6 *factory6; DXGI_ADAPTER_DESC1 adapterDesc; LARGE_INTEGER umdVersion; - PFN_D3D12_CREATE_DEVICE D3D12CreateDeviceFunc; + PFN_D3D12_CREATE_DEVICE pD3D12CreateDevice; #endif D3D12_FEATURE_DATA_ARCHITECTURE architecture; D3D12_COMMAND_QUEUE_DESC queueDesc; @@ -8764,16 +8764,16 @@ static SDL_GPUDevice *D3D12_CreateDevice(bool debugMode, bool preferLowPower, SD #endif // Load the CreateDXGIFactory1 function - CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY1)SDL_LoadFunction( + pCreateDXGIFactory1 = (pfnCreateDXGIFactory1)SDL_LoadFunction( renderer->dxgi_dll, CREATE_DXGI_FACTORY1_FUNC); - if (CreateDXGIFactoryFunc == NULL) { + if (pCreateDXGIFactory1 == NULL) { D3D12_INTERNAL_DestroyRenderer(renderer); SET_STRING_ERROR_AND_RETURN("Could not load function: " CREATE_DXGI_FACTORY1_FUNC, NULL); } // Create the DXGI factory - res = CreateDXGIFactoryFunc( + res = pCreateDXGIFactory1( &D3D_IID_IDXGIFactory1, (void **)&factory1); 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); } #else - D3D12CreateDeviceFunc = (PFN_D3D12_CREATE_DEVICE)SDL_LoadFunction( + pD3D12CreateDevice = (PFN_D3D12_CREATE_DEVICE)SDL_LoadFunction( renderer->d3d12_dll, D3D12_CREATE_DEVICE_FUNC); - if (D3D12CreateDeviceFunc == NULL) { + if (pD3D12CreateDevice == NULL) { D3D12_INTERNAL_DestroyRenderer(renderer); SET_STRING_ERROR_AND_RETURN("Could not load function: " D3D12_CREATE_DEVICE_FUNC, NULL); } #endif - renderer->D3D12SerializeRootSignature_func = (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)SDL_LoadFunction( + renderer->pD3D12SerializeRootSignature = (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)SDL_LoadFunction( renderer->d3d12_dll, D3D12_SERIALIZE_ROOT_SIGNATURE_FUNC); - if (renderer->D3D12SerializeRootSignature_func == NULL) { + if (renderer->pD3D12SerializeRootSignature == NULL) { D3D12_INTERNAL_DestroyRenderer(renderer); 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; } #else - res = D3D12CreateDeviceFunc( + res = pD3D12CreateDevice( (IUnknown *)renderer->adapter, D3D_FEATURE_LEVEL_CHOICE, D3D_GUID(D3D_IID_ID3D12Device), diff --git a/src/joystick/windows/SDL_windowsjoystick.c b/src/joystick/windows/SDL_windowsjoystick.c index e7fbfcb346..805f8cb6aa 100644 --- a/src/joystick/windows/SDL_windowsjoystick.c +++ b/src/joystick/windows/SDL_windowsjoystick.c @@ -416,11 +416,15 @@ void WINDOWS_JoystickDetect(void) while (pCurList) { JoyStick_DeviceData *pListNext = NULL; - if (!pCurList->bXInputDevice) { #ifdef SDL_HAPTIC_DINPUT +#ifdef SDL_JOYSTICK_XINPUT + if (!pCurList->bXInputDevice) { SDL_DINPUT_HapticMaybeRemoveDevice(&pCurList->dxdevice); -#endif } +#else + SDL_DINPUT_HapticMaybeRemoveDevice(&pCurList->dxdevice); +#endif +#endif SDL_PrivateJoystickRemoved(pCurList->nInstanceID); @@ -432,11 +436,15 @@ void WINDOWS_JoystickDetect(void) for (pCurList = SYS_Joystick; pCurList; pCurList = pCurList->pNext) { if (pCurList->send_add_event) { - if (!pCurList->bXInputDevice) { #ifdef SDL_HAPTIC_DINPUT +#ifdef SDL_JOYSTICK_XINPUT + if (!pCurList->bXInputDevice) { SDL_DINPUT_HapticMaybeAddDevice(&pCurList->dxdevice); -#endif } +#else + SDL_DINPUT_HapticMaybeAddDevice(&pCurList->dxdevice); +#endif +#endif SDL_PrivateJoystickAdded(pCurList->nInstanceID); @@ -489,16 +497,18 @@ static int WINDOWS_JoystickGetDeviceSteamVirtualGamepadSlot(int device_index) device = device->pNext; } +#ifdef SDL_JOYSTICK_XINPUT if (device->bXInputDevice) { // The slot for XInput devices can change as controllers are seated 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) { +#ifdef SDL_JOYSTICK_XINPUT JoyStick_DeviceData *device = SYS_Joystick; int index; @@ -507,6 +517,9 @@ static int WINDOWS_JoystickGetDevicePlayerIndex(int device_index) } return device->bXInputDevice ? (int)device->XInputUserId : -1; +#else + return -1; +#endif } 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; +#ifdef SDL_JOYSTICK_XINPUT if (device->bXInputDevice) { 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) { +#ifdef SDL_JOYSTICK_XINPUT if (joystick->hwdata->bXInputDevice) { 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) @@ -602,21 +617,27 @@ static void WINDOWS_JoystickUpdate(SDL_Joystick *joystick) return; } +#ifdef SDL_JOYSTICK_XINPUT if (joystick->hwdata->bXInputDevice) { SDL_XINPUT_JoystickUpdate(joystick); - } else { - SDL_DINPUT_JoystickUpdate(joystick); + return; } +#endif + SDL_DINPUT_JoystickUpdate(joystick); } // Function to close a joystick after use static void WINDOWS_JoystickClose(SDL_Joystick *joystick) { +#ifdef SDL_JOYSTICK_XINPUT if (joystick->hwdata->bXInputDevice) { SDL_XINPUT_JoystickClose(joystick); } else { SDL_DINPUT_JoystickClose(joystick); } +#else + SDL_DINPUT_JoystickClose(joystick); +#endif SDL_free(joystick->hwdata); } diff --git a/src/joystick/windows/SDL_windowsjoystick_c.h b/src/joystick/windows/SDL_windowsjoystick_c.h index 16b91848db..963571a85b 100644 --- a/src/joystick/windows/SDL_windowsjoystick_c.h +++ b/src/joystick/windows/SDL_windowsjoystick_c.h @@ -37,9 +37,11 @@ typedef struct JoyStick_DeviceData char *joystickname; Uint8 send_add_event; SDL_JoystickID nInstanceID; +#ifdef SDL_JOYSTICK_XINPUT bool bXInputDevice; BYTE SubType; Uint8 XInputUserId; +#endif DIDEVICEINSTANCE dxdevice; char path[MAX_PATH]; int steam_virtual_gamepad_slot; @@ -85,10 +87,12 @@ struct joystick_hwdata LPDIRECTINPUTEFFECT ffeffect_ref; #endif +#ifdef SDL_JOYSTICK_XINPUT bool bXInputDevice; // true if this device supports using the xinput API rather than DirectInput bool bXInputHaptic; // Supports force feedback via XInput. Uint8 userid; // XInput userid index for this joystick DWORD dwPacketNumber; +#endif }; #ifdef SDL_JOYSTICK_DINPUT diff --git a/src/locale/windows/SDL_syslocale.c b/src/locale/windows/SDL_syslocale.c index 7f69c56974..452682d0c1 100644 --- a/src/locale/windows/SDL_syslocale.c +++ b/src/locale/windows/SDL_syslocale.c @@ -23,7 +23,7 @@ #include "../../core/windows/SDL_windows.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 #define MUI_LANGUAGE_NAME 0x8 #endif diff --git a/src/render/direct3d11/SDL_render_d3d11.c b/src/render/direct3d11/SDL_render_d3d11.c index 113c5921ae..9902873aed 100644 --- a/src/render/direct3d11/SDL_render_d3d11.c +++ b/src/render/direct3d11/SDL_render_d3d11.c @@ -504,12 +504,12 @@ static ID3D11BlendState *D3D11_CreateBlendState(SDL_Renderer *renderer, SDL_Blen // Create resources that depend on the device. static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer) { - typedef HRESULT(WINAPI * PFN_CREATE_DXGI_FACTORY)(REFIID riid, void **ppFactory); - typedef HRESULT(WINAPI * PFN_CREATE_DXGI_FACTORY2)(UINT flags, REFIID riid, void **ppFactory); - PFN_CREATE_DXGI_FACTORY CreateDXGIFactoryFunc = NULL; - PFN_CREATE_DXGI_FACTORY2 CreateDXGIFactory2Func = NULL; + typedef HRESULT (WINAPI *pfnCreateDXGIFactory)(REFIID riid, void **ppFactory); + typedef HRESULT (WINAPI *pfnCreateDXGIFactory2)(UINT flags, REFIID riid, void **ppFactory); + pfnCreateDXGIFactory pCreateDXGIFactory = NULL; + pfnCreateDXGIFactory2 pCreateDXGIFactory2 = NULL; D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal; - PFN_D3D11_CREATE_DEVICE D3D11CreateDeviceFunc; + PFN_D3D11_CREATE_DEVICE pD3D11CreateDevice; IDXGIAdapter *dxgiAdapter = NULL; ID3D11Device *d3dDevice = NULL; ID3D11DeviceContext *d3dContext = NULL; @@ -549,10 +549,10 @@ static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer) goto done; } - CreateDXGIFactory2Func = (PFN_CREATE_DXGI_FACTORY2)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory2"); - if (!CreateDXGIFactory2Func) { - CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory"); - if (!CreateDXGIFactoryFunc) { + pCreateDXGIFactory2 = (pfnCreateDXGIFactory2)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory2"); + if (!pCreateDXGIFactory2) { + pCreateDXGIFactory = (pfnCreateDXGIFactory)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory"); + if (!pCreateDXGIFactory) { result = E_FAIL; goto done; } @@ -564,8 +564,8 @@ static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer) goto done; } - D3D11CreateDeviceFunc = (PFN_D3D11_CREATE_DEVICE)SDL_LoadFunction(data->hD3D11Mod, "D3D11CreateDevice"); - if (!D3D11CreateDeviceFunc) { + pD3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE)SDL_LoadFunction(data->hD3D11Mod, "D3D11CreateDevice"); + if (!pD3D11CreateDevice) { result = E_FAIL; goto done; } @@ -573,22 +573,22 @@ static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer) if (createDebug) { #ifdef __IDXGIInfoQueue_INTERFACE_DEFINED__ IDXGIInfoQueue *dxgiInfoQueue = NULL; - PFN_CREATE_DXGI_FACTORY2 DXGIGetDebugInterfaceFunc; + pfnCreateDXGIFactory2 pDXGIGetDebugInterface1; // If the debug hint is set, also create the DXGI factory in debug mode - DXGIGetDebugInterfaceFunc = (PFN_CREATE_DXGI_FACTORY2)SDL_LoadFunction(data->hDXGIMod, "DXGIGetDebugInterface1"); - if (!DXGIGetDebugInterfaceFunc) { + pDXGIGetDebugInterface1 = (pfnCreateDXGIFactory2)SDL_LoadFunction(data->hDXGIMod, "DXGIGetDebugInterface1"); + if (!pDXGIGetDebugInterface1) { result = E_FAIL; goto done; } - result = DXGIGetDebugInterfaceFunc(0, &SDL_IID_IDXGIDebug1, (void **)&data->dxgiDebug); + result = pDXGIGetDebugInterface1(0, &SDL_IID_IDXGIDebug1, (void **)&data->dxgiDebug); if (FAILED(result)) { WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("DXGIGetDebugInterface1"), result); goto done; } - result = DXGIGetDebugInterfaceFunc(0, &SDL_IID_IDXGIInfoQueue, (void **)&dxgiInfoQueue); + result = pDXGIGetDebugInterface1(0, &SDL_IID_IDXGIInfoQueue, (void **)&dxgiInfoQueue); if (FAILED(result)) { WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("DXGIGetDebugInterface1"), result); goto done; @@ -601,10 +601,10 @@ static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer) creationFlags = DXGI_CREATE_FACTORY_DEBUG; } - if (CreateDXGIFactory2Func) { - result = CreateDXGIFactory2Func(creationFlags, &SDL_IID_IDXGIFactory2, (void **)&data->dxgiFactory); + if (pCreateDXGIFactory2) { + result = pCreateDXGIFactory2(creationFlags, &SDL_IID_IDXGIFactory2, (void **)&data->dxgiFactory); } else { - result = CreateDXGIFactoryFunc(&SDL_IID_IDXGIFactory2, (void **)&data->dxgiFactory); + result = pCreateDXGIFactory(&SDL_IID_IDXGIFactory2, (void **)&data->dxgiFactory); } if (FAILED(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. - result = D3D11CreateDeviceFunc( + result = pD3D11CreateDevice( dxgiAdapter, driverType, NULL, diff --git a/src/render/direct3d12/SDL_render_d3d12.c b/src/render/direct3d12/SDL_render_d3d12.c index 8a560614a4..8f60b9eb8a 100644 --- a/src/render/direct3d12/SDL_render_d3d12.c +++ b/src/render/direct3d12/SDL_render_d3d12.c @@ -771,12 +771,12 @@ static HRESULT D3D12_CreateVertexBuffer(D3D12_RenderData *data, size_t vbidx, si static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer) { #if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) - typedef HRESULT(WINAPI * PFN_CREATE_DXGI_FACTORY)(UINT flags, REFIID riid, void **ppFactory); - PFN_CREATE_DXGI_FACTORY CreateDXGIFactoryFunc; - PFN_D3D12_CREATE_DEVICE D3D12CreateDeviceFunc; + typedef HRESULT (WINAPI *pfnCreateDXGIFactory2)(UINT flags, REFIID riid, void **ppFactory); + pfnCreateDXGIFactory2 pCreateDXGIFactory2; + PFN_D3D12_CREATE_DEVICE pD3D12CreateDevice; #endif - typedef HANDLE(WINAPI * PFN_CREATE_EVENT_EX)(LPSECURITY_ATTRIBUTES lpEventAttributes, LPCWSTR lpName, DWORD dwFlags, DWORD dwDesiredAccess); - PFN_CREATE_EVENT_EX CreateEventExFunc; + typedef HANDLE (WINAPI *pfnCreateEventExW)(LPSECURITY_ATTRIBUTES lpEventAttributes, LPCWSTR lpName, DWORD dwFlags, DWORD dwDesiredAccess); + pfnCreateEventExW pCreateEventExW; D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal; ID3D12Device *d3dDevice = NULL; @@ -793,18 +793,18 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer) createDebug = SDL_GetHintBoolean(SDL_HINT_RENDER_DIRECT3D11_DEBUG, false); #ifdef SDL_PLATFORM_GDK - CreateEventExFunc = CreateEventExW; + pCreateEventExW = CreateEventExW; #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")); - CreateEventExFunc = NULL; + pCreateEventExW = NULL; if (kernel32) { - CreateEventExFunc = (PFN_CREATE_EVENT_EX)GetProcAddress(kernel32, "CreateEventExW"); + pCreateEventExW = (pfnCreateEventExW)GetProcAddress(kernel32, "CreateEventExW"); } } #endif - if (!CreateEventExFunc) { + if (!pCreateEventExW) { result = E_FAIL; goto done; } @@ -816,8 +816,8 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer) goto done; } - CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory2"); - if (!CreateDXGIFactoryFunc) { + pCreateDXGIFactory2 = (pfnCreateDXGIFactory2)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory2"); + if (!pCreateDXGIFactory2) { result = E_FAIL; goto done; } @@ -828,8 +828,8 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer) goto done; } - D3D12CreateDeviceFunc = (PFN_D3D12_CREATE_DEVICE)SDL_LoadFunction(data->hD3D12Mod, "D3D12CreateDevice"); - if (!D3D12CreateDeviceFunc) { + pD3D12CreateDevice = (PFN_D3D12_CREATE_DEVICE)SDL_LoadFunction(data->hD3D12Mod, "D3D12CreateDevice"); + if (!pD3D12CreateDevice) { result = E_FAIL; goto done; } @@ -858,10 +858,10 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer) if (createDebug) { #ifdef __IDXGIInfoQueue_INTERFACE_DEFINED__ IDXGIInfoQueue *dxgiInfoQueue = NULL; - PFN_CREATE_DXGI_FACTORY DXGIGetDebugInterfaceFunc; + pfnCreateDXGIFactory2 DXGIGetDebugInterfaceFunc; // 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) { result = E_FAIL; goto done; @@ -886,7 +886,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer) 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)) { WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("CreateDXGIFactory"), result); goto done; @@ -903,7 +903,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer) 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_GUID(SDL_IID_ID3D12Device1), (void **)&d3dDevice); @@ -1051,7 +1051,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer) 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) { WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("CreateEventEx"), result); goto done; diff --git a/src/thread/windows/SDL_syscond_cv.c b/src/thread/windows/SDL_syscond_cv.c index b29ef634e0..7d748d6cb1 100644 --- a/src/thread/windows/SDL_syscond_cv.c +++ b/src/thread/windows/SDL_syscond_cv.c @@ -56,10 +56,10 @@ typedef struct CONDITION_VARIABLE } CONDITION_VARIABLE, *PCONDITION_VARIABLE; #endif -typedef VOID(WINAPI *pfnWakeConditionVariable)(PCONDITION_VARIABLE); -typedef VOID(WINAPI *pfnWakeAllConditionVariable)(PCONDITION_VARIABLE); -typedef BOOL(WINAPI *pfnSleepConditionVariableSRW)(PCONDITION_VARIABLE, PSRWLOCK, DWORD, ULONG); -typedef BOOL(WINAPI *pfnSleepConditionVariableCS)(PCONDITION_VARIABLE, PCRITICAL_SECTION, DWORD); +typedef VOID (WINAPI *pfnWakeConditionVariable)(PCONDITION_VARIABLE); +typedef VOID (WINAPI *pfnWakeAllConditionVariable)(PCONDITION_VARIABLE); +typedef BOOL (WINAPI *pfnSleepConditionVariableSRW)(PCONDITION_VARIABLE, PSRWLOCK, DWORD, ULONG); +typedef BOOL (WINAPI *pfnSleepConditionVariableCS)(PCONDITION_VARIABLE, PCRITICAL_SECTION, DWORD); static pfnWakeConditionVariable pWakeConditionVariable = NULL; static pfnWakeAllConditionVariable pWakeAllConditionVariable = NULL; diff --git a/src/thread/windows/SDL_sysmutex.c b/src/thread/windows/SDL_sysmutex.c index 88ec0047c4..92e5862aef 100644 --- a/src/thread/windows/SDL_sysmutex.c +++ b/src/thread/windows/SDL_sysmutex.c @@ -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. */ -typedef VOID(WINAPI *pfnInitializeSRWLock)(PSRWLOCK); -typedef VOID(WINAPI *pfnReleaseSRWLockExclusive)(PSRWLOCK); -typedef VOID(WINAPI *pfnAcquireSRWLockExclusive)(PSRWLOCK); -typedef BOOLEAN(WINAPI *pfnTryAcquireSRWLockExclusive)(PSRWLOCK); +typedef VOID (WINAPI *pfnInitializeSRWLock)(PSRWLOCK); +typedef VOID (WINAPI *pfnReleaseSRWLockExclusive)(PSRWLOCK); +typedef VOID (WINAPI *pfnAcquireSRWLockExclusive)(PSRWLOCK); +typedef BOOLEAN (WINAPI *pfnTryAcquireSRWLockExclusive)(PSRWLOCK); static pfnInitializeSRWLock pInitializeSRWLock = NULL; static pfnReleaseSRWLockExclusive pReleaseSRWLockExclusive = NULL; static pfnAcquireSRWLockExclusive pAcquireSRWLockExclusive = NULL; diff --git a/src/thread/windows/SDL_sysrwlock_srw.c b/src/thread/windows/SDL_sysrwlock_srw.c index ca1a48eb84..7dac0955fd 100644 --- a/src/thread/windows/SDL_sysrwlock_srw.c +++ b/src/thread/windows/SDL_sysrwlock_srw.c @@ -27,13 +27,13 @@ // This header makes sure SRWLOCK is actually declared, even on ancient WinSDKs. #include "SDL_sysmutex_c.h" -typedef VOID(WINAPI *pfnInitializeSRWLock)(PSRWLOCK); -typedef VOID(WINAPI *pfnReleaseSRWLockShared)(PSRWLOCK); -typedef VOID(WINAPI *pfnAcquireSRWLockShared)(PSRWLOCK); -typedef BOOLEAN(WINAPI *pfnTryAcquireSRWLockShared)(PSRWLOCK); -typedef VOID(WINAPI *pfnReleaseSRWLockExclusive)(PSRWLOCK); -typedef VOID(WINAPI *pfnAcquireSRWLockExclusive)(PSRWLOCK); -typedef BOOLEAN(WINAPI *pfnTryAcquireSRWLockExclusive)(PSRWLOCK); +typedef VOID (WINAPI *pfnInitializeSRWLock)(PSRWLOCK); +typedef VOID (WINAPI *pfnReleaseSRWLockShared)(PSRWLOCK); +typedef VOID (WINAPI *pfnAcquireSRWLockShared)(PSRWLOCK); +typedef BOOLEAN (WINAPI *pfnTryAcquireSRWLockShared)(PSRWLOCK); +typedef VOID (WINAPI *pfnReleaseSRWLockExclusive)(PSRWLOCK); +typedef VOID (WINAPI *pfnAcquireSRWLockExclusive)(PSRWLOCK); +typedef BOOLEAN (WINAPI *pfnTryAcquireSRWLockExclusive)(PSRWLOCK); static pfnInitializeSRWLock pInitializeSRWLock = NULL; static pfnReleaseSRWLockShared pReleaseSRWLockShared = NULL; diff --git a/src/thread/windows/SDL_syssem.c b/src/thread/windows/SDL_syssem.c index ba35add7d8..2717375730 100644 --- a/src/thread/windows/SDL_syssem.c +++ b/src/thread/windows/SDL_syssem.c @@ -60,8 +60,8 @@ static SDL_sem_impl_t SDL_sem_impl_active = { 0 }; // APIs not available on WinPhone 8.1 // https://www.microsoft.com/en-us/download/details.aspx?id=47328 -typedef BOOL(WINAPI *pfnWaitOnAddress)(volatile VOID *, PVOID, SIZE_T, DWORD); -typedef VOID(WINAPI *pfnWakeByAddressSingle)(PVOID); +typedef BOOL (WINAPI *pfnWaitOnAddress)(volatile VOID *, PVOID, SIZE_T, DWORD); +typedef VOID (WINAPI *pfnWakeByAddressSingle)(PVOID); static pfnWaitOnAddress pWaitOnAddress = NULL; static pfnWakeByAddressSingle pWakeByAddressSingle = NULL; diff --git a/src/thread/windows/SDL_systhread.c b/src/thread/windows/SDL_systhread.c index c5bee81f23..8ebe1b45ff 100644 --- a/src/thread/windows/SDL_systhread.c +++ b/src/thread/windows/SDL_systhread.c @@ -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) { diff --git a/src/time/windows/SDL_systime.c b/src/time/windows/SDL_systime.c index 4bc1e99293..e0fffc169a 100644 --- a/src/time/windows/SDL_systime.c +++ b/src/time/windows/SDL_systime.c @@ -30,7 +30,7 @@ #define WINDOWS_TICK 10000000ULL #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) { diff --git a/src/timer/windows/SDL_systimer.c b/src/timer/windows/SDL_systimer.c index f6f4b15c72..aed0476eba 100644 --- a/src/timer/windows/SDL_systimer.c +++ b/src/timer/windows/SDL_systimer.c @@ -24,54 +24,27 @@ #include "../../core/windows/SDL_windows.h" -/* CREATE_WAITABLE_TIMER_HIGH_RESOLUTION flag was added in Windows 10 version 1803. */ -#ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION -#define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x2 -#endif +Uint64 SDL_GetPerformanceCounter(void) +{ + LARGE_INTEGER counter; + 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); -static CreateWaitableTimerExW_t pCreateWaitableTimerExW; - -typedef BOOL (WINAPI *SetWaitableTimerEx_t)(HANDLE hTimer, const LARGE_INTEGER *lpDueTime, LONG lPeriod, PTIMERAPCROUTINE pfnCompletionRoutine, LPVOID lpArgToCompletionRoutine, PREASON_CONTEXT WakeContext, ULONG TolerableDelay); -static SetWaitableTimerEx_t pSetWaitableTimerEx; +Uint64 SDL_GetPerformanceFrequency(void) +{ + LARGE_INTEGER frequency; + const BOOL rc = QueryPerformanceFrequency(&frequency); + 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) { 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 SDL_TLSID TLS_event_handle; @@ -87,20 +60,65 @@ static HANDLE SDL_GetWaitableEvent(void) return event; } -Uint64 SDL_GetPerformanceCounter(void) -{ - LARGE_INTEGER counter; - const BOOL rc = QueryPerformanceCounter(&counter); - SDL_assert(rc != 0); // this should _never_ fail if you're on XP or later. - return (Uint64)counter.QuadPart; -} +/* CREATE_WAITABLE_TIMER_HIGH_RESOLUTION flag was added in Windows 10 version 1803. */ +#ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION +#define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x2 +#endif -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; - const BOOL rc = QueryPerformanceFrequency(&frequency); - SDL_assert(rc != 0); // this should _never_ fail if you're on XP or later. - return (Uint64)frequency.QuadPart; + static SDL_TLSID TLS_timer_handle; + HANDLE timer; + static bool initialized; + + 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) @@ -109,7 +127,7 @@ void SDL_SYS_DelayNS(Uint64 ns) if (timer) { LARGE_INTEGER due_time; 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); } return; diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index bac6179c69..f5776a73fb 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -2410,10 +2410,13 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara break; #endif // !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) + + default: + break; } #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; WIN_ApplyWindowProgress(SDL_GetVideoDevice(), data->window); } diff --git a/src/video/windows/SDL_windowsmessagebox.c b/src/video/windows/SDL_windowsmessagebox.c index c174e3d6ed..fcb0107d5c 100644 --- a/src/video/windows/SDL_windowsmessagebox.c +++ b/src/video/windows/SDL_windowsmessagebox.c @@ -944,7 +944,7 @@ bool WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID) TASKDIALOG_BUTTON *pButtons; TASKDIALOG_BUTTON *pButton; HMODULE hComctl32; - TASKDIALOGINDIRECTPROC pfnTaskDialogIndirect; + TASKDIALOGINDIRECTPROC pTaskDialogIndirect; HRESULT hr; char *ampescape = NULL; size_t ampescapesize = 0; @@ -958,11 +958,11 @@ bool WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID) } HMODULE hUser32 = GetModuleHandle(TEXT("user32.dll")); - typedef DPI_AWARENESS_CONTEXT (WINAPI * SetThreadDpiAwarenessContext_t)(DPI_AWARENESS_CONTEXT); - SetThreadDpiAwarenessContext_t SetThreadDpiAwarenessContextFunc = (SetThreadDpiAwarenessContext_t)GetProcAddress(hUser32, "SetThreadDpiAwarenessContext"); + typedef DPI_AWARENESS_CONTEXT (WINAPI *pfnSetThreadDpiAwarenessContext)(DPI_AWARENESS_CONTEXT); + pfnSetThreadDpiAwarenessContext pSetThreadDpiAwarenessContext = (pfnSetThreadDpiAwarenessContext)GetProcAddress(hUser32, "SetThreadDpiAwarenessContext"); DPI_AWARENESS_CONTEXT previous_context = DPI_AWARENESS_CONTEXT_UNAWARE; - if (SetThreadDpiAwarenessContextFunc) { - previous_context = SetThreadDpiAwarenessContextFunc(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); + if (pSetThreadDpiAwarenessContext) { + previous_context = pSetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); } // 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: #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"); - if (!pfnTaskDialogIndirect) { + pTaskDialogIndirect = (TASKDIALOGINDIRECTPROC)GetProcAddress(hComctl32, "TaskDialogIndirect"); + if (!pTaskDialogIndirect) { FreeLibrary(hComctl32); result = WIN_ShowOldMessageBox(messageboxdata, buttonID); goto done; @@ -1049,7 +1049,7 @@ bool WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID) TaskConfig.pButtons = pButtons; // Show the Task Dialog - hr = pfnTaskDialogIndirect(&TaskConfig, &nButton, NULL, NULL); + hr = pTaskDialogIndirect(&TaskConfig, &nButton, NULL, NULL); // Free everything FreeLibrary(hComctl32); @@ -1077,8 +1077,8 @@ bool WIN_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID) } done: - if (SetThreadDpiAwarenessContextFunc) { - SetThreadDpiAwarenessContextFunc(previous_context); + if (pSetThreadDpiAwarenessContext) { + pSetThreadDpiAwarenessContext(previous_context); } return result; } diff --git a/src/video/windows/SDL_windowsmodes.c b/src/video/windows/SDL_windowsmodes.c index b60e2b28fd..aeb758c6fc 100644 --- a/src/video/windows/SDL_windowsmodes.c +++ b/src/video/windows/SDL_windowsmodes.c @@ -34,6 +34,9 @@ #ifndef CDS_FULLSCREEN #define CDS_FULLSCREEN 0 #endif +#ifndef USER_DEFAULT_SCREEN_DPI +#define USER_DEFAULT_SCREEN_DPI 96 +#endif // #define DEBUG_MODES // #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) { - const SDL_VideoData *videodata = (const SDL_VideoData *)_this->internal; int dpi = 0; + const SDL_VideoData *videodata = (const SDL_VideoData *)_this->internal; if (videodata->GetDpiForMonitor) { UINT hdpi_uint, vdpi_uint; 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 static bool WIN_GetMonitorDESC1(HMONITOR hMonitor, DXGI_OUTPUT_DESC1 *desc) { - typedef HRESULT (WINAPI * PFN_CREATE_DXGI_FACTORY)(REFIID riid, void **ppFactory); - PFN_CREATE_DXGI_FACTORY CreateDXGIFactoryFunc = NULL; + typedef HRESULT (WINAPI *pfnCreateDXGIFactory1)(REFIID riid, void **ppFactory); + pfnCreateDXGIFactory1 pCreateDXGIFactory1 = NULL; SDL_SharedObject *hDXGIMod = NULL; bool found = false; hDXGIMod = SDL_LoadObject("dxgi.dll"); 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_IDXGIOutput6 = { 0x068346e8, 0xaaec, 0x4b84, { 0xad, 0xd7, 0x13, 0x7f, 0x51, 0x3f, 0x77, 0xa1 } }; IDXGIFactory1 *dxgiFactory; - if (SUCCEEDED(CreateDXGIFactoryFunc(&SDL_IID_IDXGIFactory1, (void **)&dxgiFactory))) { + if (SUCCEEDED(pCreateDXGIFactory1(&SDL_IID_IDXGIFactory1, (void **)&dxgiFactory))) { IDXGIAdapter1 *dxgiAdapter; UINT adapter = 0; while (!found && SUCCEEDED(IDXGIFactory1_EnumAdapters1(dxgiFactory, adapter, &dxgiAdapter))) { diff --git a/src/video/windows/SDL_windowsvideo.c b/src/video/windows/SDL_windowsvideo.c index aa5d5ab15a..0be5f23ccd 100644 --- a/src/video/windows/SDL_windowsvideo.c +++ b/src/video/windows/SDL_windowsvideo.c @@ -38,6 +38,93 @@ #if !(defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)) #include + +#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 #ifdef SDL_GDK_TEXTINPUT @@ -204,14 +291,14 @@ static SDL_VideoDevice *WIN_CreateDevice(void) data->dxgiDLL = SDL_LoadObject("DXGI.DLL"); if (data->dxgiDLL) { /* *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 - CreateDXGI_t CreateDXGI; + pfnCreateDXGI pCreateDXGI; - CreateDXGI = (CreateDXGI_t)SDL_LoadFunction(data->dxgiDLL, "CreateDXGIFactory"); - if (CreateDXGI) { + pCreateDXGI = (pfnCreateDXGI)SDL_LoadFunction(data->dxgiDLL, "CreateDXGIFactory"); + if (pCreateDXGI) { GUID dxgiGUID = { 0x7b7166ec, 0x21c7, 0x44ae, { 0xb2, 0x1a, 0xc9, 0xae, 0x32, 0x1a, 0xe3, 0x69 } }; - CreateDXGI(&dxgiGUID, (void **)&data->pDXGIFactory); + pCreateDXGI(&dxgiGUID, (void **)&data->pDXGIFactory); } } #endif @@ -374,7 +461,6 @@ static BOOL WIN_DeclareDPIAwareUnaware(SDL_VideoDevice *_this) static BOOL WIN_DeclareDPIAwareSystem(SDL_VideoDevice *_this) { -#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) SDL_VideoData *data = _this->internal; if (data->SetProcessDpiAwarenessContext) { @@ -386,9 +472,9 @@ static BOOL WIN_DeclareDPIAwareSystem(SDL_VideoDevice *_this) } else if (data->SetProcessDPIAware) { // Windows Vista return data->SetProcessDPIAware(); + } else { + return FALSE; } -#endif - return FALSE; } 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) data->_SDL_WAKEUP = RegisterWindowMessageA("_SDL_WAKEUP"); -#endif -#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) - data->WM_TASKBAR_BUTTON_CREATED = RegisterWindowMessageA("TaskbarButtonCreated"); + data->WM_TASKBAR_BUTTON_CREATED = WIN_IsWindows7OrGreater() ? RegisterWindowMessageA("TaskbarButtonCreated") : 0; #endif return true; @@ -580,7 +664,7 @@ void WIN_VideoQuit(SDL_VideoDevice *_this) WIN_QuitMouse(_this); if (data->taskbar_list) { - IUnknown_Release(data->taskbar_list); + data->taskbar_list->lpVtbl->Release(data->taskbar_list); data->taskbar_list = NULL; } @@ -621,18 +705,18 @@ bool D3D_LoadDLL(void **pD3DDLL, IDirect3D9 **pDirect3D9Interface) *pD3DDLL = SDL_LoadObject("D3D9.DLL"); if (*pD3DDLL) { /* *INDENT-OFF* */ // clang-format off - typedef IDirect3D9 *(WINAPI *Direct3DCreate9_t)(UINT SDKVersion); - typedef HRESULT (WINAPI* Direct3DCreate9Ex_t)(UINT SDKVersion, IDirect3D9Ex **ppD3D); + typedef IDirect3D9 *(WINAPI *pfnDirect3DCreate9)(UINT SDKVersion); + typedef HRESULT (WINAPI *pfnDirect3DCreate9Ex)(UINT SDKVersion, IDirect3D9Ex **ppD3D); /* *INDENT-ON* */ // clang-format on - Direct3DCreate9_t Direct3DCreate9Func; + pfnDirect3DCreate9 pDirect3DCreate9; if (SDL_GetHintBoolean(SDL_HINT_WINDOWS_USE_D3D9EX, false)) { - Direct3DCreate9Ex_t Direct3DCreate9ExFunc; + pfnDirect3DCreate9Ex pDirect3DCreate9Ex; - Direct3DCreate9ExFunc = (Direct3DCreate9Ex_t)SDL_LoadFunction(*pD3DDLL, "Direct3DCreate9Ex"); - if (Direct3DCreate9ExFunc) { + pDirect3DCreate9Ex = (pfnDirect3DCreate9Ex)SDL_LoadFunction(*pD3DDLL, "Direct3DCreate9Ex"); + if (pDirect3DCreate9Ex) { IDirect3D9Ex *pDirect3D9ExInterface; - HRESULT hr = Direct3DCreate9ExFunc(D3D_SDK_VERSION, &pDirect3D9ExInterface); + HRESULT hr = pDirect3DCreate9Ex(D3D_SDK_VERSION, &pDirect3D9ExInterface); if (SUCCEEDED(hr)) { const GUID IDirect3D9_GUID = { 0x81bdcbca, 0x64d4, 0x426d, { 0xae, 0x8d, 0xad, 0x1, 0x47, 0xf4, 0x27, 0x5c } }; 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"); - if (Direct3DCreate9Func) { - *pDirect3D9Interface = Direct3DCreate9Func(D3D_SDK_VERSION); + pDirect3DCreate9 = (pfnDirect3DCreate9)SDL_LoadFunction(*pD3DDLL, "Direct3DCreate9"); + if (pDirect3DCreate9) { + *pDirect3D9Interface = pDirect3DCreate9(D3D_SDK_VERSION); if (*pDirect3D9Interface) { return true; } diff --git a/src/video/windows/SDL_windowsvideo.h b/src/video/windows/SDL_windowsvideo.h index f2413ff075..b192fb664c 100644 --- a/src/video/windows/SDL_windowsvideo.h +++ b/src/video/windows/SDL_windowsvideo.h @@ -66,7 +66,7 @@ #define USER_DEFAULT_SCREEN_DPI 96 #endif -#if WINVER < 0x0601 +#if WINVER < _WIN32_WINNT_WIN7 // Touch input definitions #define TWF_FINETOUCH 1 #define TWF_WANTPALM 2 @@ -287,7 +287,100 @@ typedef struct DISPLAYCONFIG_TARGET_DEVICE_NAME #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 @@ -431,12 +524,39 @@ struct SDL_VideoData DWORD clipboard_count; #if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) // Xbox doesn't support user32/shcore - // Touch input functions 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 BOOL (WINAPI *CloseTouchInputHandle)( HTOUCHINPUT ); BOOL (WINAPI *GetTouchInputInfo)( HTOUCHINPUT, UINT, PTOUCHINPUT, int ); 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 *SetProcessDpiAwarenessContext)( DPI_AWARENESS_CONTEXT ); DPI_AWARENESS_CONTEXT (WINAPI *SetThreadDpiAwarenessContext)( DPI_AWARENESS_CONTEXT ); @@ -447,27 +567,11 @@ struct SDL_VideoData UINT (WINAPI *GetDpiForWindow)( HWND ); BOOL (WINAPI *AreDpiAwarenessContextsEqual)(DPI_AWARENESS_CONTEXT, 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, MONITOR_DPI_TYPE dpiType, UINT *dpiX, UINT *dpiY ); 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 #endif // !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) @@ -541,7 +645,7 @@ struct SDL_VideoData BYTE pre_hook_key_state[256]; 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; ITaskbarList3 *taskbar_list; #endif diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index 259ba3c239..a7b30f910a 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -141,7 +141,7 @@ static DWORD GetWindowStyleEx(SDL_Window *window) 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) { 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) { -#if !(defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)) +#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) SDL_WindowData *data = window->internal; if (!data->taskbar_button_created) { return true; diff --git a/test/win32/sdlprocdump.c b/test/win32/sdlprocdump.c index 13259af5fa..6142aa5cf8 100644 --- a/test/win32/sdlprocdump.c +++ b/test/win32/sdlprocdump.c @@ -5,6 +5,28 @@ #include #include +#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 #include #include