Browse Source

update SDL to libsdl-org/SDL@b8036bd

Sasha Szpakowski 11 months ago
parent
commit
f27a1c24b3
100 changed files with 2179 additions and 536 deletions
  1. 8 1
      libs/SDL3/.wikiheaders-options
  2. 3 0
      libs/SDL3/Android.mk
  3. 84 29
      libs/SDL3/CMakeLists.txt
  4. 1 1
      libs/SDL3/INSTALL.md
  5. 37 36
      libs/SDL3/VisualC-GDK/SDL/SDL.vcxproj
  6. 42 45
      libs/SDL3/VisualC-GDK/SDL/SDL.vcxproj.filters
  7. 3 3
      libs/SDL3/VisualC/SDL.sln
  8. 10 26
      libs/SDL3/VisualC/SDL/SDL.vcxproj
  9. 47 96
      libs/SDL3/VisualC/SDL/SDL.vcxproj.filters
  10. 2 2
      libs/SDL3/VisualC/VisualC/examples/game/01-snake/01-snake.vcxproj
  11. 2 2
      libs/SDL3/VisualC/examples/demo/01-snake/01-snake.vcxproj
  12. 2 2
      libs/SDL3/VisualC/examples/demo/02-woodeneye-008/02-woodeneye-008.vcxproj
  13. 2 2
      libs/SDL3/VisualC/examples/demo/03-infinite-monkeys/03-infinite-monkeys.vcxproj
  14. 2 2
      libs/SDL3/Xcode/SDL/Info-Framework.plist
  15. 99 151
      libs/SDL3/Xcode/SDL/SDL.xcodeproj/project.pbxproj
  16. 1 1
      libs/SDL3/Xcode/SDL/pkg-support/SDL.info
  17. 1 1
      libs/SDL3/Xcode/SDL/pkg-support/share/cmake/SDL3/SDL3Config.cmake
  18. 1 1
      libs/SDL3/android-project/app/src/main/java/org/libsdl/app/HIDDeviceBLESteamController.java
  19. 2 2
      libs/SDL3/android-project/app/src/main/java/org/libsdl/app/HIDDeviceManager.java
  20. 10 0
      libs/SDL3/android-project/app/src/main/java/org/libsdl/app/HIDDeviceUSB.java
  21. 1 1
      libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
  22. 5 5
      libs/SDL3/build-scripts/SDL_migration.cocci
  23. 51 13
      libs/SDL3/build-scripts/build-release.py
  24. 198 4
      libs/SDL3/build-scripts/build-web-examples.pl
  25. 6 4
      libs/SDL3/build-scripts/create-release.py
  26. 6 2
      libs/SDL3/build-scripts/fnsince.pl
  27. 1 1
      libs/SDL3/build-scripts/pkg-support/android/cmake/SDL3Config.cmake
  28. 1 1
      libs/SDL3/build-scripts/pkg-support/msvc/cmake/SDL3Config.cmake.in
  29. 0 1
      libs/SDL3/build-scripts/rename_macros.py
  30. 299 1
      libs/SDL3/build-scripts/wikiheaders.pl
  31. 1 1
      libs/SDL3/cmake/android/FindSdlAndroid.cmake
  32. 1 1
      libs/SDL3/cmake/android/FindSdlAndroidBuildTools.cmake
  33. 1 1
      libs/SDL3/cmake/android/FindSdlAndroidPlatform.cmake
  34. 1 1
      libs/SDL3/cmake/android/SdlAndroidFunctions.cmake
  35. 1 1
      libs/SDL3/cmake/android/SdlAndroidScript.cmake
  36. 6 0
      libs/SDL3/cmake/sdlchecks.cmake
  37. 1 1
      libs/SDL3/cmake/sdlcpu.cmake
  38. 9 0
      libs/SDL3/docs/README-documentation-rules.md
  39. 3 1
      libs/SDL3/docs/README-linux.md
  40. 30 0
      libs/SDL3/docs/README-main-functions.md
  41. 4 5
      libs/SDL3/docs/README-migration.md
  42. 3 42
      libs/SDL3/docs/README-ngage.md
  43. 24 16
      libs/SDL3/docs/README-raspberrypi.md
  44. 1 2
      libs/SDL3/docs/README-touch.md
  45. 18 21
      libs/SDL3/docs/release_checklist.md
  46. 9 3
      libs/SDL3/examples/CMakeLists.txt
  47. 6 0
      libs/SDL3/examples/asyncio/01-load-bitmaps/README.txt
  48. 125 0
      libs/SDL3/examples/asyncio/01-load-bitmaps/load-bitmaps.c
  49. BIN
      libs/SDL3/examples/asyncio/01-load-bitmaps/thumbnail.png
  50. 1 0
      libs/SDL3/examples/asyncio/description.txt
  51. 5 0
      libs/SDL3/examples/audio/04-multiple-streams/README.txt
  52. 135 0
      libs/SDL3/examples/audio/04-multiple-streams/multiple-streams.c
  53. BIN
      libs/SDL3/examples/audio/onmouseover.webp
  54. BIN
      libs/SDL3/examples/audio/thumbnail.png
  55. BIN
      libs/SDL3/examples/camera/01-read-and-draw/onmouseover.webp
  56. BIN
      libs/SDL3/examples/camera/01-read-and-draw/thumbnail.png
  57. 13 0
      libs/SDL3/examples/categories.txt
  58. 0 0
      libs/SDL3/examples/demo/01-snake/README.txt
  59. BIN
      libs/SDL3/examples/demo/01-snake/onmouseover.webp
  60. 2 2
      libs/SDL3/examples/demo/01-snake/snake.c
  61. BIN
      libs/SDL3/examples/demo/01-snake/thumbnail.png
  62. 0 0
      libs/SDL3/examples/demo/02-woodeneye-008/README.txt
  63. BIN
      libs/SDL3/examples/demo/02-woodeneye-008/onmouseover.webp
  64. BIN
      libs/SDL3/examples/demo/02-woodeneye-008/thumbnail.png
  65. 1 1
      libs/SDL3/examples/demo/02-woodeneye-008/woodeneye-008.c
  66. 0 0
      libs/SDL3/examples/demo/03-infinite-monkeys/README.txt
  67. 1 1
      libs/SDL3/examples/demo/03-infinite-monkeys/infinite-monkeys.c
  68. BIN
      libs/SDL3/examples/demo/03-infinite-monkeys/onmouseover.webp
  69. BIN
      libs/SDL3/examples/demo/03-infinite-monkeys/thumbnail.png
  70. 4 0
      libs/SDL3/examples/demo/04-bytepusher/README.txt
  71. 416 0
      libs/SDL3/examples/demo/04-bytepusher/bytepusher.c
  72. BIN
      libs/SDL3/examples/demo/04-bytepusher/onmouseover.webp
  73. BIN
      libs/SDL3/examples/demo/04-bytepusher/thumbnail.png
  74. 1 0
      libs/SDL3/examples/demo/description.txt
  75. 2 0
      libs/SDL3/examples/input/01-joystick-polling/README.txt
  76. 193 0
      libs/SDL3/examples/input/01-joystick-polling/joystick-polling.c
  77. BIN
      libs/SDL3/examples/input/01-joystick-polling/onmouseover.webp
  78. BIN
      libs/SDL3/examples/input/01-joystick-polling/thumbnail.png
  79. 2 0
      libs/SDL3/examples/input/02-joystick-events/README.txt
  80. 232 0
      libs/SDL3/examples/input/02-joystick-events/joystick-events.c
  81. BIN
      libs/SDL3/examples/input/02-joystick-events/onmouseover.webp
  82. BIN
      libs/SDL3/examples/input/02-joystick-events/thumbnail.png
  83. BIN
      libs/SDL3/examples/pen/01-drawing-lines/onmouseover.webp
  84. BIN
      libs/SDL3/examples/pen/01-drawing-lines/thumbnail.png
  85. BIN
      libs/SDL3/examples/renderer/01-clear/onmouseover.webp
  86. BIN
      libs/SDL3/examples/renderer/01-clear/thumbnail.png
  87. BIN
      libs/SDL3/examples/renderer/02-primitives/thumbnail.png
  88. BIN
      libs/SDL3/examples/renderer/03-lines/onmouseover.webp
  89. BIN
      libs/SDL3/examples/renderer/03-lines/thumbnail.png
  90. BIN
      libs/SDL3/examples/renderer/04-points/onmouseover.webp
  91. BIN
      libs/SDL3/examples/renderer/04-points/thumbnail.png
  92. BIN
      libs/SDL3/examples/renderer/05-rectangles/onmouseover.webp
  93. BIN
      libs/SDL3/examples/renderer/05-rectangles/thumbnail.png
  94. BIN
      libs/SDL3/examples/renderer/06-textures/onmouseover.webp
  95. BIN
      libs/SDL3/examples/renderer/06-textures/thumbnail.png
  96. BIN
      libs/SDL3/examples/renderer/07-streaming-textures/onmouseover.webp
  97. BIN
      libs/SDL3/examples/renderer/07-streaming-textures/thumbnail.png
  98. BIN
      libs/SDL3/examples/renderer/08-rotating-textures/onmouseover.webp
  99. BIN
      libs/SDL3/examples/renderer/08-rotating-textures/thumbnail.png
  100. BIN
      libs/SDL3/examples/renderer/09-scaling-textures/onmouseover.webp

+ 8 - 1
libs/SDL3/.wikiheaders-options

@@ -3,7 +3,7 @@ projectshortname = SDL
 incsubdir = include/SDL3
 incsubdir = include/SDL3
 wikisubdir =
 wikisubdir =
 readmesubdir = docs
 readmesubdir = docs
-apiprefixregex = (SDL_|SDLK_)
+apiprefixregex = (SDL_|SDLK_|[US]int\d+)
 mainincludefname = SDL3/SDL.h
 mainincludefname = SDL3/SDL.h
 versionfname = include/SDL3/SDL_version.h
 versionfname = include/SDL3/SDL_version.h
 versionmajorregex = \A\#define\s+SDL_MAJOR_VERSION\s+(\d+)\Z
 versionmajorregex = \A\#define\s+SDL_MAJOR_VERSION\s+(\d+)\Z
@@ -21,3 +21,10 @@ manpageheaderfiletext = Defined in SDL3/%fname%
 # All SDL_test_* headers become undefined categories, everything else just converts like SDL_audio.h -> Audio
 # All SDL_test_* headers become undefined categories, everything else just converts like SDL_audio.h -> Audio
 # A handful of others we fix up in the header itself with /* WIKI CATEGORY: x */ comments.
 # A handful of others we fix up in the header itself with /* WIKI CATEGORY: x */ comments.
 headercategoryeval = s/\ASDL_test_?.*?\.h\Z//; s/\ASDL_?(.*?)\.h\Z/$1/; ucfirst();
 headercategoryeval = s/\ASDL_test_?.*?\.h\Z//; s/\ASDL_?(.*?)\.h\Z/$1/; ucfirst();
+
+quickrefenabled = 1
+quickrefcategoryorder = Init,Hints,Error,Version,Properties,Log,Video,Events,Keyboard,Mouse,Touch,Gamepad,Joystick,Haptic,Audio,Time,Timer,Render,SharedObject,Thread,Mutex,Atomic,Filesystem,IOStream,AsyncIO,Storage,Pixels,Surface,Blendmode,Rect,Camera,Clipboard,Dialog,GPU,Messagebox,Vulkan,Metal,Platform,Power,Sensor,Process,Bits,Endian,Assert,CPUInfo,Intrinsics,Locale,System,Misc,GUID,Main,Stdinc
+quickreftitle = SDL3 API Quick Reference
+quickrefurl = https://libsdl.org/
+quickrefdesc = The latest version of this document can be found at https://wiki.libsdl.org/SDL3/QuickReference
+quickrefmacroregex = \A(SDL_PLATFORM_.*|SDL_.*_INTRINSICS|SDL_Atomic...Ref|SDL_assert.*?|SDL_COMPILE_TIME_ASSERT|SDL_arraysize|SDL_Swap[BL]E\d\d|SDL_[a-z]+_cast)\Z

+ 3 - 0
libs/SDL3/Android.mk

@@ -30,11 +30,13 @@ LOCAL_SRC_FILES := \
 	$(wildcard $(LOCAL_PATH)/src/core/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/core/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/core/android/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/core/android/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/cpuinfo/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/cpuinfo/*.c) \
+	$(LOCAL_PATH)/src/dialog/SDL_dialog.c \
 	$(LOCAL_PATH)/src/dialog/SDL_dialog_utils.c \
 	$(LOCAL_PATH)/src/dialog/SDL_dialog_utils.c \
 	$(LOCAL_PATH)/src/dialog/android/SDL_androiddialog.c \
 	$(LOCAL_PATH)/src/dialog/android/SDL_androiddialog.c \
 	$(wildcard $(LOCAL_PATH)/src/dynapi/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/dynapi/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/events/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/events/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/file/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/file/*.c) \
+	$(wildcard $(LOCAL_PATH)/src/file/generic/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/gpu/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/gpu/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/gpu/vulkan/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/gpu/vulkan/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/haptic/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/haptic/*.c) \
@@ -76,6 +78,7 @@ LOCAL_SRC_FILES := \
 	$(wildcard $(LOCAL_PATH)/src/time/unix/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/time/unix/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/timer/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/timer/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/timer/unix/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/timer/unix/*.c) \
+	$(wildcard $(LOCAL_PATH)/src/tray/dummy/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/video/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/video/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/video/android/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/video/android/*.c) \
 	$(wildcard $(LOCAL_PATH)/src/video/yuv2rgb/*.c))
 	$(wildcard $(LOCAL_PATH)/src/video/yuv2rgb/*.c))

+ 84 - 29
libs/SDL3/CMakeLists.txt

@@ -1,7 +1,11 @@
 cmake_minimum_required(VERSION 3.16)
 cmake_minimum_required(VERSION 3.16)
 
 
+if(NOT DEFINED CMAKE_BUILD_TYPE)
+  set(cmake_build_type_undefined 1)
+endif()
+
 # See docs/release_checklist.md
 # See docs/release_checklist.md
-project(SDL3 LANGUAGES C VERSION "3.1.6")
+project(SDL3 LANGUAGES C VERSION "3.1.7")
 
 
 if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
 if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
   set(SDL3_SUBPROJECT OFF)
   set(SDL3_SUBPROJECT OFF)
@@ -9,6 +13,23 @@ else()
   set(SDL3_SUBPROJECT ON)
   set(SDL3_SUBPROJECT ON)
 endif()
 endif()
 
 
+# By default, configure SDL3 in RelWithDebInfo configuration
+if(NOT SDL3_SUBPROJECT)
+  get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+  if(is_multi_config)
+      # The first item in CMAKE_CONFIGURATION_TYPES is the default configuration
+      if(DEFINED CMAKE_CONFIGURATION_TYPES AND "RelWithDebInfo" IN_LIST CMAKE_CONFIGURATION_TYPES)
+        list(REMOVE_ITEM CMAKE_CONFIGURATION_TYPES "RelWithDebInfo")
+        list(INSERT CMAKE_CONFIGURATION_TYPES 0 "RelWithDebInfo")
+        set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING "CMake configuration types" FORCE)
+      endif()
+  else()
+    if(cmake_build_type_undefined)
+      set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "CMake build type" FORCE)
+    endif()
+  endif()
+endif()
+
 # CMake 3.0 expands the "if(${A})" in "set(OFF 1);set(A OFF);if(${A})" to "if(1)"
 # CMake 3.0 expands the "if(${A})" in "set(OFF 1);set(A OFF);if(${A})" to "if(1)"
 # CMake 3.24+ emits a warning when not set.
 # CMake 3.24+ emits a warning when not set.
 unset(OFF)
 unset(OFF)
@@ -286,6 +307,7 @@ set_option(SDL_SYSTEM_ICONV        "Use iconv() from system-installed libraries"
 set_option(SDL_LIBICONV            "Prefer iconv() from libiconv, if available, over libc version" OFF)
 set_option(SDL_LIBICONV            "Prefer iconv() from libiconv, if available, over libc version" OFF)
 set_option(SDL_GCC_ATOMICS         "Use gcc builtin atomics" ${SDL_GCC_ATOMICS_DEFAULT})
 set_option(SDL_GCC_ATOMICS         "Use gcc builtin atomics" ${SDL_GCC_ATOMICS_DEFAULT})
 dep_option(SDL_DBUS                "Enable D-Bus support" ON "${UNIX_SYS}" OFF)
 dep_option(SDL_DBUS                "Enable D-Bus support" ON "${UNIX_SYS}" OFF)
+dep_option(SDL_LIBURING            "Enable liburing support" ON "${UNIX_SYS}" OFF)
 dep_option(SDL_DISKAUDIO           "Support the disk writer audio driver" ON "SDL_AUDIO" OFF)
 dep_option(SDL_DISKAUDIO           "Support the disk writer audio driver" ON "SDL_AUDIO" OFF)
 dep_option(SDL_DUMMYAUDIO          "Support the dummy audio driver" ON "SDL_AUDIO" OFF)
 dep_option(SDL_DUMMYAUDIO          "Support the dummy audio driver" ON "SDL_AUDIO" OFF)
 dep_option(SDL_DUMMYVIDEO          "Use dummy video driver" ON "SDL_VIDEO" OFF)
 dep_option(SDL_DUMMYVIDEO          "Use dummy video driver" ON "SDL_VIDEO" OFF)
@@ -309,7 +331,7 @@ set_option(SDL_RPATH               "Use an rpath when linking SDL" ${SDL_RPATH_D
 set_option(SDL_CLOCK_GETTIME       "Use clock_gettime() instead of gettimeofday()" ${SDL_CLOCK_GETTIME_DEFAULT})
 set_option(SDL_CLOCK_GETTIME       "Use clock_gettime() instead of gettimeofday()" ${SDL_CLOCK_GETTIME_DEFAULT})
 dep_option(SDL_X11                 "Use X11 video driver" ${UNIX_SYS} "SDL_VIDEO" OFF)
 dep_option(SDL_X11                 "Use X11 video driver" ${UNIX_SYS} "SDL_VIDEO" OFF)
 dep_option(SDL_X11_SHARED          "Dynamically load X11 support" ON "SDL_X11" OFF)
 dep_option(SDL_X11_SHARED          "Dynamically load X11 support" ON "SDL_X11" OFF)
-set(SDL_X11_OPTIONS Xcursor Xdbe XInput Xfixes Xrandr Xscrnsaver XShape)
+set(SDL_X11_OPTIONS Xcursor Xdbe XInput Xfixes Xrandr Xscrnsaver XShape Xsync)
 foreach(_SUB ${SDL_X11_OPTIONS})
 foreach(_SUB ${SDL_X11_OPTIONS})
   string(TOUPPER "SDL_X11_${_SUB}" _OPT)
   string(TOUPPER "SDL_X11_${_SUB}" _OPT)
   dep_option(${_OPT}               "Enable ${_SUB} support" ON "SDL_X11" OFF)
   dep_option(${_OPT}               "Enable ${_SUB} support" ON "SDL_X11" OFF)
@@ -915,7 +937,7 @@ endif()
 set(SDL_DISABLE_ALLOCA 0)
 set(SDL_DISABLE_ALLOCA 0)
 check_include_file("alloca.h" "HAVE_ALLOCA_H")
 check_include_file("alloca.h" "HAVE_ALLOCA_H")
 if(MSVC)
 if(MSVC)
-  check_include_file("malloc.h" "HAVE_MALLOC")
+  check_include_file("malloc.h" "HAVE_MALLOC_H")
   check_symbol_exists("_alloca" "malloc.h" _ALLOCA_IN_MALLOC_H)
   check_symbol_exists("_alloca" "malloc.h" _ALLOCA_IN_MALLOC_H)
   if(NOT HAVE_ALLOCA_H AND NOT _ALLOCA_IN_MALLOC_H)
   if(NOT HAVE_ALLOCA_H AND NOT _ALLOCA_IN_MALLOC_H)
     set(SDL_DISABLE_ALLOCA 1)
     set(SDL_DISABLE_ALLOCA 1)
@@ -961,15 +983,15 @@ if(SDL_LIBC)
   set(symbols_to_check
   set(symbols_to_check
     abs acos acosf asin asinf atan atan2 atan2f atanf atof atoi
     abs acos acosf asin asinf atan atan2 atan2f atanf atof atoi
     bcopy
     bcopy
-    calloc ceil ceilf copysign copysignf cos cosf
+    ceil ceilf copysign copysignf cos cosf
     _Exit exp expf
     _Exit exp expf
-    fabs fabsf floor floorf fmod fmodf fopen64 free fseeko fseeko64
+    fabs fabsf floor floorf fmod fmodf fopen64 fseeko fseeko64
     getenv
     getenv
     _i64toa index itoa
     _i64toa index itoa
     log log10 log10f logf lround lroundf _ltoa
     log log10 log10f logf lround lroundf _ltoa
     malloc memcmp memcpy memmove memset modf modff
     malloc memcmp memcpy memmove memset modf modff
     pow powf putenv
     pow powf putenv
-    realloc rindex round roundf
+    rindex round roundf
     scalbn scalbnf setenv sin sinf sqr sqrt sqrtf sscanf strchr
     scalbn scalbnf setenv sin sinf sqr sqrt sqrtf sscanf strchr
     strcmp strlcat strlcpy strlen strncmp strnlen strpbrk
     strcmp strlcat strlcpy strlen strncmp strnlen strpbrk
     strrchr strstr strnstr strtod strtok_r strtol strtoll strtoul strtoull
     strrchr strstr strnstr strtod strtok_r strtol strtoll strtoul strtoull
@@ -980,7 +1002,7 @@ if(SDL_LIBC)
   )
   )
   if(WINDOWS)
   if(WINDOWS)
     list(APPEND symbols_to_check
     list(APPEND symbols_to_check
-      _strrev _ui64toa _uitoa _ultoa _wcsdup
+      _copysign _fseeki64 _strrev _ui64toa _uitoa _ultoa _wcsdup
     )
     )
   else()
   else()
     list(APPEND symbols_to_check
     list(APPEND symbols_to_check
@@ -1119,6 +1141,7 @@ sdl_glob_sources(
   "${SDL3_SOURCE_DIR}/src/dynapi/*.c"
   "${SDL3_SOURCE_DIR}/src/dynapi/*.c"
   "${SDL3_SOURCE_DIR}/src/events/*.c"
   "${SDL3_SOURCE_DIR}/src/events/*.c"
   "${SDL3_SOURCE_DIR}/src/file/*.c"
   "${SDL3_SOURCE_DIR}/src/file/*.c"
+  "${SDL3_SOURCE_DIR}/src/file/generic/*.c"
   "${SDL3_SOURCE_DIR}/src/filesystem/*.c"
   "${SDL3_SOURCE_DIR}/src/filesystem/*.c"
   "${SDL3_SOURCE_DIR}/src/gpu/*.c"
   "${SDL3_SOURCE_DIR}/src/gpu/*.c"
   "${SDL3_SOURCE_DIR}/src/joystick/*.c"
   "${SDL3_SOURCE_DIR}/src/joystick/*.c"
@@ -1295,7 +1318,6 @@ if(ANDROID)
     set(SDL_JOYSTICK_ANDROID 1)
     set(SDL_JOYSTICK_ANDROID 1)
     sdl_glob_sources(
     sdl_glob_sources(
       "${SDL3_SOURCE_DIR}/src/joystick/android/*.c"
       "${SDL3_SOURCE_DIR}/src/joystick/android/*.c"
-      "${SDL3_SOURCE_DIR}/src/joystick/steam/*.c"
     )
     )
     set(HAVE_SDL_JOYSTICK TRUE)
     set(HAVE_SDL_JOYSTICK TRUE)
   endif()
   endif()
@@ -1545,6 +1567,9 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
     CheckVivante()
     CheckVivante()
     CheckVulkan()
     CheckVulkan()
     CheckQNXScreen()
     CheckQNXScreen()
+
+    sdl_glob_sources("${SDL3_SOURCE_DIR}/src/tray/unix/*.c")
+    set(HAVE_SDL_TRAY TRUE)
   endif()
   endif()
 
 
   if(UNIX)
   if(UNIX)
@@ -1657,6 +1682,16 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
         set(SDL_USE_IME 1)
         set(SDL_USE_IME 1)
       endif()
       endif()
 
 
+      if(SDL_LIBURING)
+        pkg_search_module(LIBURING liburing-ffi)
+        find_path(HAVE_LIBURING_H NAMES liburing.h)
+        if(LIBURING_FOUND AND HAVE_LIBURING_H)
+          set(HAVE_LIBURING_LIBURING_H TRUE)
+          sdl_include_directories(PRIVATE SYSTEM ${LIBURING_INCLUDE_DIRS})
+          set(HAVE_LIBURING TRUE)
+        endif()
+      endif()
+
       if((FREEBSD OR NETBSD) AND NOT HAVE_INOTIFY)
       if((FREEBSD OR NETBSD) AND NOT HAVE_INOTIFY)
         set(LibInotify_PKG_CONFIG_SPEC libinotify)
         set(LibInotify_PKG_CONFIG_SPEC libinotify)
         pkg_check_modules(PC_LIBINOTIFY IMPORTED_TARGET ${LibInotify_PKG_CONFIG_SPEC})
         pkg_check_modules(PC_LIBINOTIFY IMPORTED_TARGET ${LibInotify_PKG_CONFIG_SPEC})
@@ -1720,6 +1755,10 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
       endif()
       endif()
     endif()
     endif()
 
 
+    if(HAVE_LIBURING_H)
+      sdl_sources("${SDL3_SOURCE_DIR}/src/file/io_uring/SDL_asyncio_liburing.c")
+    endif()
+
     # Always compiled for Linux, unconditionally:
     # Always compiled for Linux, unconditionally:
     sdl_sources(
     sdl_sources(
       "${SDL3_SOURCE_DIR}/src/core/linux/SDL_evdev_capabilities.c"
       "${SDL3_SOURCE_DIR}/src/core/linux/SDL_evdev_capabilities.c"
@@ -1741,7 +1780,6 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
       set(SDL_JOYSTICK_LINUX 1)
       set(SDL_JOYSTICK_LINUX 1)
       sdl_glob_sources(
       sdl_glob_sources(
         "${SDL3_SOURCE_DIR}/src/joystick/linux/*.c"
         "${SDL3_SOURCE_DIR}/src/joystick/linux/*.c"
-        "${SDL3_SOURCE_DIR}/src/joystick/steam/*.c"
       )
       )
       set(HAVE_SDL_JOYSTICK TRUE)
       set(HAVE_SDL_JOYSTICK TRUE)
     endif()
     endif()
@@ -2040,6 +2078,9 @@ elseif(WINDOWS)
         set(HAVE_RENDER_VULKAN TRUE)
         set(HAVE_RENDER_VULKAN TRUE)
       endif()
       endif()
     endif()
     endif()
+
+    sdl_glob_sources("${SDL3_SOURCE_DIR}/src/tray/windows/*.c")
+    set(HAVE_SDL_TRAY TRUE)
   endif()
   endif()
 
 
   if(SDL_HIDAPI)
   if(SDL_HIDAPI)
@@ -2113,8 +2154,6 @@ elseif(APPLE)
     set(HAVE_SDL_MAIN_CALLBACKS TRUE)
     set(HAVE_SDL_MAIN_CALLBACKS TRUE)
   endif()
   endif()
 
 
-  sdl_glob_sources("${SDL3_SOURCE_DIR}/src/file/cocoa/*.m")
-
   if(SDL_CAMERA)
   if(SDL_CAMERA)
     if(MACOS OR IOS)
     if(MACOS OR IOS)
       set(SDL_CAMERA_DRIVER_COREMEDIA 1)
       set(SDL_CAMERA_DRIVER_COREMEDIA 1)
@@ -2146,7 +2185,6 @@ elseif(APPLE)
   if(SDL_JOYSTICK)
   if(SDL_JOYSTICK)
     sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/apple/*.m")
     sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/apple/*.m")
     if(IOS OR TVOS OR VISIONOS OR WATCHOS)
     if(IOS OR TVOS OR VISIONOS OR WATCHOS)
-      sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/steam/*.c")
       set(SDL_JOYSTICK_MFI 1)
       set(SDL_JOYSTICK_MFI 1)
       if(IOS OR VISIONOS OR WATCHOS)
       if(IOS OR VISIONOS OR WATCHOS)
         set(SDL_FRAMEWORK_COREMOTION 1)
         set(SDL_FRAMEWORK_COREMOTION 1)
@@ -2319,6 +2357,11 @@ elseif(APPLE)
         endif()
         endif()
       endif()
       endif()
     endif()
     endif()
+
+    if(MACOS)
+      sdl_glob_sources("${SDL3_SOURCE_DIR}/src/tray/cocoa/*.m")
+      set(HAVE_SDL_TRAY TRUE)
+    endif()
   endif()
   endif()
 
 
   # Minimum version for $<LINK_LIBRARY:feature,library-list>
   # Minimum version for $<LINK_LIBRARY:feature,library-list>
@@ -2675,7 +2718,9 @@ elseif(PSP)
   sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/psp/*.c")
   sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/psp/*.c")
   set(HAVE_SDL_FILESYSTEM TRUE)
   set(HAVE_SDL_FILESYSTEM TRUE)
 
 
-  # !!! FIXME: do we need a FSops implementation for this?
+  set(SDL_FSOPS_POSIX 1)
+  sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/posix/SDL_sysfsops.c")
+  set(HAVE_SDL_FSOPS TRUE)
 
 
   if(SDL_JOYSTICK)
   if(SDL_JOYSTICK)
     set(SDL_JOYSTICK_PSP 1)
     set(SDL_JOYSTICK_PSP 1)
@@ -2698,6 +2743,9 @@ elseif(PSP)
   )
   )
   set(HAVE_SDL_THREADS TRUE)
   set(HAVE_SDL_THREADS TRUE)
 
 
+  sdl_glob_sources("${SDL3_SOURCE_DIR}/src/locale/psp/*.c")
+  set(HAVE_SDL_LOCALE TRUE)
+
   set(SDL_TIME_PSP 1)
   set(SDL_TIME_PSP 1)
   sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/psp/*.c")
   sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/psp/*.c")
   set(HAVE_SDL_TIME TRUE)
   set(HAVE_SDL_TIME TRUE)
@@ -2729,10 +2777,6 @@ elseif(PSP)
   )
   )
 
 
 elseif(PS2)
 elseif(PS2)
-  sdl_compile_definitions(PRIVATE "PS2" "__PS2__")
-  sdl_include_directories(PRIVATE SYSTEM "$ENV{PS2SDK}/ports/include" "$ENV{PS2DEV}/gsKit/include")
-  target_include_directories(SDL_uclibc PRIVATE "$ENV{PS2SDK}/ports/include" "$ENV{PS2DEV}/gsKit/include")
-
   sdl_glob_sources("${SDL3_SOURCE_DIR}/src/main/ps2/*.c")
   sdl_glob_sources("${SDL3_SOURCE_DIR}/src/main/ps2/*.c")
 
 
   if(SDL_AUDIO)
   if(SDL_AUDIO)
@@ -2745,7 +2789,9 @@ elseif(PS2)
   sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/ps2/*.c")
   sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/ps2/*.c")
   set(HAVE_SDL_FILESYSTEM TRUE)
   set(HAVE_SDL_FILESYSTEM TRUE)
 
 
-  # !!! FIXME: do we need a FSops implementation for this?
+  set(SDL_FSOPS_POSIX 1)
+  sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/posix/SDL_sysfsops.c")
+  set(HAVE_SDL_FSOPS TRUE)
 
 
   if(SDL_JOYSTICK)
   if(SDL_JOYSTICK)
     set(SDL_JOYSTICK_PS2 1)
     set(SDL_JOYSTICK_PS2 1)
@@ -2854,6 +2900,7 @@ elseif(N3DS)
   sdl_glob_sources("${SDL3_SOURCE_DIR}/src/file/n3ds/*.c")
   sdl_glob_sources("${SDL3_SOURCE_DIR}/src/file/n3ds/*.c")
 endif()
 endif()
 
 
+sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/SDL_dialog.c)
 if (SDL_DIALOG)
 if (SDL_DIALOG)
   sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/SDL_dialog_utils.c)
   sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/SDL_dialog_utils.c)
   if(ANDROID)
   if(ANDROID)
@@ -2937,6 +2984,8 @@ if(SDL_VIDEO)
   endif()
   endif()
 endif()
 endif()
 
 
+sdl_glob_sources(${SDL3_SOURCE_DIR}/src/tray/*.c)
+
 if(SDL_GPU)
 if(SDL_GPU)
   if(HAVE_D3D11_H)
   if(HAVE_D3D11_H)
     sdl_glob_sources("${SDL3_SOURCE_DIR}/src/gpu/d3d11/*.c")
     sdl_glob_sources("${SDL3_SOURCE_DIR}/src/gpu/d3d11/*.c")
@@ -3019,6 +3068,10 @@ if(NOT HAVE_SDL_PROCESS)
   set(SDL_PROCESS_DUMMY 1)
   set(SDL_PROCESS_DUMMY 1)
   sdl_glob_sources(${SDL3_SOURCE_DIR}/src/process/dummy/*.c)
   sdl_glob_sources(${SDL3_SOURCE_DIR}/src/process/dummy/*.c)
 endif()
 endif()
+if(NOT HAVE_SDL_TRAY)
+  set(SDL_TRAY_DUMMY 1)
+  sdl_glob_sources(${SDL3_SOURCE_DIR}/src/tray/dummy/*.c)
+endif()
 if(NOT HAVE_CAMERA)
 if(NOT HAVE_CAMERA)
   set(SDL_CAMERA_DRIVER_DUMMY 1)
   set(SDL_CAMERA_DRIVER_DUMMY 1)
   sdl_glob_sources("${SDL3_SOURCE_DIR}/src/camera/dummy/*.c")
   sdl_glob_sources("${SDL3_SOURCE_DIR}/src/camera/dummy/*.c")
@@ -3063,15 +3116,17 @@ endforeach()
 
 
 # If REVISION.txt exists, then we are building from a SDL release.
 # If REVISION.txt exists, then we are building from a SDL release.
 # SDL_revision.h(.cmake) in source releases have SDL_REVISION baked into them.
 # SDL_revision.h(.cmake) in source releases have SDL_REVISION baked into them.
-if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/REVISION.txt")
-  set(SDL_REVISION "" CACHE STRING "Custom SDL revision")
-  if(SDL_REVISION)
-    set(SDL_REVISION_CENTER "${SDL_VERSION_MAJOR}.${SDL_VERSION_MINOR}.${SDL_VERSION_MICRO}-${SDL_REVISION}")
-  else()
-    # If SDL_REVISION is not overrided, use git to describe
-    git_describe(SDL_REVISION_CENTER)
-  endif()
-  set(SDL_REVISION "SDL3-${SDL_REVISION_CENTER}")
+if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/REVISION.txt")
+  file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/REVISION.txt" revisions)
+  list(GET revisions 0 revisions_0)
+  string(STRIP "${revisions_0}" SDL_REVISION)
+else()
+  set(SDL_REVISION "" CACHE STRING "Custom SDL revision (only used when REVISION.txt does not exist)")
+endif()
+if(NOT SDL_REVISION)
+  # If SDL_REVISION is not overrided, use git to describe
+  git_describe(SDL_REVISION_GIT)
+  set(SDL_REVISION "SDL3-${SDL3_VERSION}-${SDL_REVISION_GIT}")
 endif()
 endif()
 
 
 execute_process(COMMAND "${CMAKE_COMMAND}" -E make_directory "${SDL3_BINARY_DIR}/include-revision/SDL3")
 execute_process(COMMAND "${CMAKE_COMMAND}" -E make_directory "${SDL3_BINARY_DIR}/include-revision/SDL3")
@@ -3435,7 +3490,7 @@ endif()
 if(WINDOWS AND NOT MINGW)
 if(WINDOWS AND NOT MINGW)
   set(SDL_INSTALL_CMAKEDIR_ROOT_DEFAULT "cmake")
   set(SDL_INSTALL_CMAKEDIR_ROOT_DEFAULT "cmake")
 else()
 else()
-  set(SDL_INSTALL_CMAKEDIR_ROOT_DEFAULT "${CMAKE_INSTALL_LIBDIR}/cmake")
+  set(SDL_INSTALL_CMAKEDIR_ROOT_DEFAULT "${CMAKE_INSTALL_LIBDIR}/cmake/SDL3")
 endif()
 endif()
 set(SDL_INSTALL_CMAKEDIR_ROOT "${SDL_INSTALL_CMAKEDIR_ROOT_DEFAULT}" CACHE STRING "Root folder where to install SDL3Config.cmake related files (SDL3 subfolder for MSVC projects)")
 set(SDL_INSTALL_CMAKEDIR_ROOT "${SDL_INSTALL_CMAKEDIR_ROOT_DEFAULT}" CACHE STRING "Root folder where to install SDL3Config.cmake related files (SDL3 subfolder for MSVC projects)")
 
 
@@ -3455,7 +3510,7 @@ elseif(SDL_FRAMEWORK)
   set(SDL_INSTALL_LICENSEDIR "Resources")
   set(SDL_INSTALL_LICENSEDIR "Resources")
   set(SDL_INSTALL_HEADERSDIR "Headers")
   set(SDL_INSTALL_HEADERSDIR "Headers")
 else()
 else()
-  set(SDL_INSTALL_CMAKEDIR "${SDL_INSTALL_CMAKEDIR_ROOT}/SDL3")
+  set(SDL_INSTALL_CMAKEDIR "${SDL_INSTALL_CMAKEDIR_ROOT}")
   set(SDL_INSTALL_LICENSEDIR "${CMAKE_INSTALL_DATAROOTDIR}/licenses/${PROJECT_NAME}")
   set(SDL_INSTALL_LICENSEDIR "${CMAKE_INSTALL_DATAROOTDIR}/licenses/${PROJECT_NAME}")
   set(SDL_INSTALL_HEADERSDIR "${CMAKE_INSTALL_INCLUDEDIR}/SDL3")
   set(SDL_INSTALL_HEADERSDIR "${CMAKE_INSTALL_INCLUDEDIR}/SDL3")
 endif()
 endif()

+ 1 - 1
libs/SDL3/INSTALL.md

@@ -26,7 +26,7 @@ Run: `cmake -S . -B build -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" && cmake --bu
 
 
 ## Linux and other UNIX systems:
 ## Linux and other UNIX systems:
 
 
-Run: `cmake -S . -B build && cmake --build build && cmake --install build`
+Run: `cmake -S . -B build && cmake --build build --parallel $(nproc) && cmake --install build`
 
 
 ## Android:
 ## Android:
 
 

+ 37 - 36
libs/SDL3/VisualC-GDK/SDL/SDL.vcxproj

@@ -102,10 +102,10 @@
     <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.XboxOne.x64'" />
     <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.XboxOne.x64'" />
   </PropertyGroup>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Desktop.x64'">
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Desktop.x64'">
-    <IncludePath>$(SolutionDir)/../src;$(IncludePath)</IncludePath>
+    <IncludePath>$(ProjectDir)../../src;$(IncludePath)</IncludePath>
   </PropertyGroup>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Desktop.x64'">
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Desktop.x64'">
-    <IncludePath>$(SolutionDir)/../src;$(IncludePath)</IncludePath>
+    <IncludePath>$(ProjectDir)../../src;$(IncludePath)</IncludePath>
   </PropertyGroup>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Desktop.x64'">
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Desktop.x64'">
     <Midl>
     <Midl>
@@ -165,8 +165,10 @@
       <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
       <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
     </Link>
     </Link>
     <PreBuildEvent>
     <PreBuildEvent>
-      <Command>$(SolutionDir)..\src\render\direct3d12\compile_shaders_xbox.bat $(SolutionDir)</Command>
-      <Command>$(SolutionDir)..\src\gpu\d3d12\compile_shaders_xbox.bat $(SolutionDir)</Command>
+      <Command>
+        call $(ProjectDir)..\..\src\render\direct3d12\compile_shaders_xbox.bat $(ProjectDir)..\
+        call $(ProjectDir)..\..\src\gpu\d3d12\compile_shaders_xbox.bat $(ProjectDir)..\
+      </Command>
     </PreBuildEvent>
     </PreBuildEvent>
     <PreBuildEvent>
     <PreBuildEvent>
       <Message>Building shader blobs (Xbox Series)</Message>
       <Message>Building shader blobs (Xbox Series)</Message>
@@ -200,8 +202,10 @@
       <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
       <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
     </Link>
     </Link>
     <PreBuildEvent>
     <PreBuildEvent>
-      <Command>$(SolutionDir)..\src\render\direct3d12\compile_shaders_xbox.bat $(SolutionDir) one</Command>
-      <Command>$(SolutionDir)..\src\gpu\d3d12\compile_shaders_xbox.bat $(SolutionDir) one</Command>
+      <Command>
+        call $(ProjectDir)..\..\src\render\direct3d12\compile_shaders_xbox.bat $(ProjectDir)..\ one
+        call $(ProjectDir)..\..\src\gpu\d3d12\compile_shaders_xbox.bat $(ProjectDir)..\ one
+      </Command>
     </PreBuildEvent>
     </PreBuildEvent>
     <PreBuildEvent>
     <PreBuildEvent>
       <Message>Building shader blobs (Xbox One)</Message>
       <Message>Building shader blobs (Xbox One)</Message>
@@ -267,8 +271,10 @@
       <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
       <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
     </Link>
     </Link>
     <PreBuildEvent>
     <PreBuildEvent>
-      <Command>$(SolutionDir)..\src\render\direct3d12\compile_shaders_xbox.bat $(SolutionDir)</Command>
-      <Command>$(SolutionDir)..\src\gpu\d3d12\compile_shaders_xbox.bat $(SolutionDir)</Command>
+      <Command>
+        call $(ProjectDir)..\..\src\render\direct3d12\compile_shaders_xbox.bat $(ProjectDir)..\
+        call $(ProjectDir)..\..\src\gpu\d3d12\compile_shaders_xbox.bat $(ProjectDir)..\
+      </Command>
     </PreBuildEvent>
     </PreBuildEvent>
     <PreBuildEvent>
     <PreBuildEvent>
       <Message>Building shader blobs (Xbox Series)</Message>
       <Message>Building shader blobs (Xbox Series)</Message>
@@ -303,8 +309,10 @@
       <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
       <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
     </Link>
     </Link>
     <PreBuildEvent>
     <PreBuildEvent>
-      <Command>$(SolutionDir)..\src\render\direct3d12\compile_shaders_xbox.bat $(SolutionDir) one</Command>
-      <Command>$(SolutionDir)..\src\gpu\d3d12\compile_shaders_xbox.bat $(SolutionDir) one</Command>
+      <Command>
+        call $(ProjectDir)..\..\src\render\direct3d12\compile_shaders_xbox.bat $(ProjectDir)..\ one
+        call $(ProjectDir)..\..\src\gpu\d3d12\compile_shaders_xbox.bat $(ProjectDir)..\ one
+      </Command>
     </PreBuildEvent>
     </PreBuildEvent>
     <PreBuildEvent>
     <PreBuildEvent>
       <Message>Building shader blobs (Xbox One)</Message>
       <Message>Building shader blobs (Xbox One)</Message>
@@ -339,6 +347,7 @@
     <ClInclude Include="..\..\include\SDL3\SDL_haptic.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_haptic.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_hints.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_hints.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_hidapi.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_hidapi.h" />
+    <ClInclude Include="..\..\include\SDL3\SDL_asyncio.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_joystick.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_joystick.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_keyboard.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_keyboard.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_keycode.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_keycode.h" />
@@ -432,6 +441,8 @@
     <ClInclude Include="..\..\src\events\SDL_windowevents_c.h" />
     <ClInclude Include="..\..\src\events\SDL_windowevents_c.h" />
     <ClInclude Include="..\..\src\filesystem\SDL_sysfilesystem.h" />
     <ClInclude Include="..\..\src\filesystem\SDL_sysfilesystem.h" />
     <ClInclude Include="..\..\src\gpu\SDL_sysgpu.h" />
     <ClInclude Include="..\..\src\gpu\SDL_sysgpu.h" />
+    <ClInclude Include="..\..\src\file\SDL_asyncio_c.h" />
+    <ClInclude Include="..\..\src\file\SDL_sysasyncio.h" />
     <ClInclude Include="..\..\src\haptic\SDL_haptic_c.h" />
     <ClInclude Include="..\..\src\haptic\SDL_haptic_c.h" />
     <ClInclude Include="..\..\src\haptic\SDL_syshaptic.h" />
     <ClInclude Include="..\..\src\haptic\SDL_syshaptic.h" />
     <ClInclude Include="..\..\src\haptic\windows\SDL_dinputhaptic_c.h" />
     <ClInclude Include="..\..\src\haptic\windows\SDL_dinputhaptic_c.h" />
@@ -514,9 +525,13 @@
     </ClCompile>
     </ClCompile>
     <ClCompile Include="..\..\src\camera\dummy\SDL_camera_dummy.c" />
     <ClCompile Include="..\..\src\camera\dummy\SDL_camera_dummy.c" />
     <ClCompile Include="..\..\src\camera\SDL_camera.c" />
     <ClCompile Include="..\..\src\camera\SDL_camera.c" />
+    <ClCompile Include="..\..\src\dialog\SDL_dialog.c" />
     <ClCompile Include="..\..\src\dialog\SDL_dialog_utils.c" />
     <ClCompile Include="..\..\src\dialog\SDL_dialog_utils.c" />
     <ClCompile Include="..\..\src\filesystem\SDL_filesystem.c" />
     <ClCompile Include="..\..\src\filesystem\SDL_filesystem.c" />
     <ClCompile Include="..\..\src\filesystem\windows\SDL_sysfsops.c" />
     <ClCompile Include="..\..\src\filesystem\windows\SDL_sysfsops.c" />
+    <ClCompile Include="..\..\src\file\generic\SDL_asyncio_generic.c" />
+    <ClCompile Include="..\..\src\file\SDL_asyncio.c" />
+    <ClCompile Include="..\..\src\file\windows\SDL_asyncio_windows_ioring.c" />
     <ClCompile Include="..\..\src\main\gdk\SDL_sysmain_runapp.cpp" />
     <ClCompile Include="..\..\src\main\gdk\SDL_sysmain_runapp.cpp" />
     <ClCompile Include="..\..\src\main\generic\SDL_sysmain_callbacks.c" />
     <ClCompile Include="..\..\src\main\generic\SDL_sysmain_callbacks.c" />
     <ClCompile Include="..\..\src\main\SDL_main_callbacks.c" />
     <ClCompile Include="..\..\src\main\SDL_main_callbacks.c" />
@@ -577,6 +592,7 @@
     <ClInclude Include="..\..\src\video\SDL_vulkan_internal.h" />
     <ClInclude Include="..\..\src\video\SDL_vulkan_internal.h" />
     <ClInclude Include="..\..\src\video\SDL_yuv_c.h" />
     <ClInclude Include="..\..\src\video\SDL_yuv_c.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_msctf.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_msctf.h" />
+    <ClInclude Include="..\..\src\video\windows\SDL_surface_utils.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsclipboard.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsclipboard.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsevents.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsevents.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsframebuffer.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsframebuffer.h" />
@@ -616,7 +632,6 @@
     <ClCompile Include="..\..\src\audio\SDL_mixer.c" />
     <ClCompile Include="..\..\src\audio\SDL_mixer.c" />
     <ClCompile Include="..\..\src\audio\SDL_wave.c" />
     <ClCompile Include="..\..\src\audio\SDL_wave.c" />
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
-    <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi_win32.c" />
     <ClCompile Include="..\..\src\core\SDL_core_unsupported.c" />
     <ClCompile Include="..\..\src\core\SDL_core_unsupported.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
@@ -725,31 +740,7 @@
       <CompileAs Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.Scarlett.x64'">CompileAsCpp</CompileAs>
       <CompileAs Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.Scarlett.x64'">CompileAsCpp</CompileAs>
       <CompileAs Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.XboxOne.x64'">CompileAsCpp</CompileAs>
       <CompileAs Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.XboxOne.x64'">CompileAsCpp</CompileAs>
     </ClCompile>
     </ClCompile>
-    <ClCompile Include="..\..\src\libm\e_atan2.c" />
-    <ClCompile Include="..\..\src\libm\e_exp.c" />
-    <ClCompile Include="..\..\src\libm\e_fmod.c" />
-    <ClCompile Include="..\..\src\libm\e_log.c" />
-    <ClCompile Include="..\..\src\libm\e_log10.c" />
-    <ClCompile Include="..\..\src\libm\e_pow.c" />
-    <ClCompile Include="..\..\src\libm\e_rem_pio2.c" />
-    <ClCompile Include="..\..\src\libm\e_sqrt.c" />
-    <ClCompile Include="..\..\src\libm\k_cos.c" />
-    <ClCompile Include="..\..\src\libm\k_rem_pio2.c" />
-    <ClCompile Include="..\..\src\libm\k_sin.c" />
-    <ClCompile Include="..\..\src\libm\k_tan.c" />
-    <ClCompile Include="..\..\src\libm\s_atan.c" />
-    <ClCompile Include="..\..\src\libm\s_copysign.c" />
-    <ClCompile Include="..\..\src\libm\s_cos.c" />
-    <ClCompile Include="..\..\src\libm\s_fabs.c" />
-    <ClCompile Include="..\..\src\libm\s_floor.c" />
-    <ClCompile Include="..\..\src\libm\s_isinf.c" />
-    <ClCompile Include="..\..\src\libm\s_isinff.c" />
-    <ClCompile Include="..\..\src\libm\s_isnan.c" />
-    <ClCompile Include="..\..\src\libm\s_isnanf.c" />
     <ClCompile Include="..\..\src\libm\s_modf.c" />
     <ClCompile Include="..\..\src\libm\s_modf.c" />
-    <ClCompile Include="..\..\src\libm\s_scalbn.c" />
-    <ClCompile Include="..\..\src\libm\s_sin.c" />
-    <ClCompile Include="..\..\src\libm\s_tan.c" />
     <ClCompile Include="..\..\src\loadso\windows\SDL_sysloadso.c" />
     <ClCompile Include="..\..\src\loadso\windows\SDL_sysloadso.c" />
     <ClCompile Include="..\..\src\locale\SDL_locale.c" />
     <ClCompile Include="..\..\src\locale\SDL_locale.c" />
     <ClCompile Include="..\..\src\locale\windows\SDL_syslocale.c" />
     <ClCompile Include="..\..\src\locale\windows\SDL_syslocale.c" />
@@ -837,6 +828,16 @@
     <ClCompile Include="..\..\src\timer\windows\SDL_systimer.c" />
     <ClCompile Include="..\..\src\timer\windows\SDL_systimer.c" />
     <ClCompile Include="..\..\src\time\SDL_time.c" />
     <ClCompile Include="..\..\src\time\SDL_time.c" />
     <ClCompile Include="..\..\src\time\windows\SDL_systime.c" />
     <ClCompile Include="..\..\src\time\windows\SDL_systime.c" />
+    <ClCompile Include="..\..\src\tray\dummy\SDL_tray.c">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Desktop.x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Desktop.x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\..\src\tray\windows\SDL_tray.c">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Xbox.Scarlett.x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.Scarlett.x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Xbox.XboxOne.x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.XboxOne.x64'">true</ExcludedFromBuild>
+    </ClCompile>
     <ClCompile Include="..\..\src\video\dummy\SDL_nullevents.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullevents.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullframebuffer.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullframebuffer.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullvideo.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullvideo.c" />
@@ -865,6 +866,7 @@
     <ClCompile Include="..\..\src\video\SDL_video_unsupported.c" />
     <ClCompile Include="..\..\src\video\SDL_video_unsupported.c" />
     <ClCompile Include="..\..\src\video\SDL_vulkan_utils.c" />
     <ClCompile Include="..\..\src\video\SDL_vulkan_utils.c" />
     <ClCompile Include="..\..\src\video\SDL_yuv.c" />
     <ClCompile Include="..\..\src\video\SDL_yuv.c" />
+    <ClCompile Include="..\..\src\video\windows\SDL_surface_utils.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsclipboard.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsclipboard.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsevents.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsevents.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsframebuffer.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsframebuffer.c" />
@@ -884,7 +886,6 @@
     <ClCompile Include="..\..\src\video\yuv2rgb\yuv_rgb_sse.c" />
     <ClCompile Include="..\..\src\video\yuv2rgb\yuv_rgb_sse.c" />
     <ClCompile Include="..\..\src\video\yuv2rgb\yuv_rgb_std.c" />
     <ClCompile Include="..\..\src\video\yuv2rgb\yuv_rgb_std.c" />
     <ClCompile Include="..\..\src\gpu\SDL_gpu.c" />
     <ClCompile Include="..\..\src\gpu\SDL_gpu.c" />
-    <ClCompile Include="..\..\src\gpu\d3d11\SDL_gpu_d3d11.c" />
     <ClCompile Include="..\..\src\gpu\d3d12\SDL_gpu_d3d12.c">
     <ClCompile Include="..\..\src\gpu\d3d12\SDL_gpu_d3d12.c">
       <CompileAs Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Xbox.Scarlett.x64'">CompileAsCpp</CompileAs>
       <CompileAs Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Xbox.Scarlett.x64'">CompileAsCpp</CompileAs>
       <CompileAs Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Xbox.XboxOne.x64'">CompileAsCpp</CompileAs>
       <CompileAs Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Xbox.XboxOne.x64'">CompileAsCpp</CompileAs>

+ 42 - 45
libs/SDL3/VisualC-GDK/SDL/SDL.vcxproj.filters

@@ -4,15 +4,6 @@
     <ClCompile Include="..\..\src\core\gdk\SDL_gdk.cpp" />
     <ClCompile Include="..\..\src\core\gdk\SDL_gdk.cpp" />
     <ClCompile Include="..\..\src\core\windows\pch.c" />
     <ClCompile Include="..\..\src\core\windows\pch.c" />
     <ClCompile Include="..\..\src\core\windows\pch_cpp.cpp" />
     <ClCompile Include="..\..\src\core\windows\pch_cpp.cpp" />
-    <ClCompile Include="..\..\src\dialog\SDL_dialog_utils.c">
-      <Filter>dialog</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\filesystem\SDL_filesystem.c">
-      <Filter>filesystem</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\filesystem\windows\SDL_sysfsops.c">
-      <Filter>filesystem\windows</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\src\render\direct3d12\SDL_render_d3d12_xbox.cpp" />
     <ClCompile Include="..\..\src\render\direct3d12\SDL_render_d3d12_xbox.cpp" />
     <ClCompile Include="..\..\src\render\direct3d12\SDL_shaders_d3d12_xboxone.cpp" />
     <ClCompile Include="..\..\src\render\direct3d12\SDL_shaders_d3d12_xboxone.cpp" />
     <ClCompile Include="..\..\src\render\direct3d12\SDL_shaders_d3d12_xboxseries.cpp" />
     <ClCompile Include="..\..\src\render\direct3d12\SDL_shaders_d3d12_xboxseries.cpp" />
@@ -35,7 +26,6 @@
     <ClCompile Include="..\..\src\audio\SDL_mixer.c" />
     <ClCompile Include="..\..\src\audio\SDL_mixer.c" />
     <ClCompile Include="..\..\src\audio\SDL_wave.c" />
     <ClCompile Include="..\..\src\audio\SDL_wave.c" />
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
-    <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi_win32.c" />
     <ClCompile Include="..\..\src\core\SDL_core_unsupported.c" />
     <ClCompile Include="..\..\src\core\SDL_core_unsupported.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
@@ -58,7 +48,6 @@
     <ClCompile Include="..\..\src\file\SDL_iostream.c" />
     <ClCompile Include="..\..\src\file\SDL_iostream.c" />
     <ClCompile Include="..\..\src\filesystem\gdk\SDL_sysfilesystem.cpp" />
     <ClCompile Include="..\..\src\filesystem\gdk\SDL_sysfilesystem.cpp" />
     <ClCompile Include="..\..\src\gpu\SDL_gpu.c" />
     <ClCompile Include="..\..\src\gpu\SDL_gpu.c" />
-    <ClCompile Include="..\..\src\gpu\d3d11\SDL_gpu_d3d11.c" />
     <ClCompile Include="..\..\src\gpu\d3d12\SDL_gpu_d3d12.c" />
     <ClCompile Include="..\..\src\gpu\d3d12\SDL_gpu_d3d12.c" />
     <ClCompile Include="..\..\src\gpu\vulkan\SDL_gpu_vulkan.c" />
     <ClCompile Include="..\..\src\gpu\vulkan\SDL_gpu_vulkan.c" />
     <ClCompile Include="..\..\src\haptic\dummy\SDL_syshaptic.c" />
     <ClCompile Include="..\..\src\haptic\dummy\SDL_syshaptic.c" />
@@ -96,31 +85,7 @@
     <ClCompile Include="..\..\src\joystick\windows\SDL_windowsjoystick.c" />
     <ClCompile Include="..\..\src\joystick\windows\SDL_windowsjoystick.c" />
     <ClCompile Include="..\..\src\joystick\windows\SDL_windows_gaming_input.c" />
     <ClCompile Include="..\..\src\joystick\windows\SDL_windows_gaming_input.c" />
     <ClCompile Include="..\..\src\joystick\windows\SDL_xinputjoystick.c" />
     <ClCompile Include="..\..\src\joystick\windows\SDL_xinputjoystick.c" />
-    <ClCompile Include="..\..\src\libm\e_atan2.c" />
-    <ClCompile Include="..\..\src\libm\e_exp.c" />
-    <ClCompile Include="..\..\src\libm\e_fmod.c" />
-    <ClCompile Include="..\..\src\libm\e_log.c" />
-    <ClCompile Include="..\..\src\libm\e_log10.c" />
-    <ClCompile Include="..\..\src\libm\e_pow.c" />
-    <ClCompile Include="..\..\src\libm\e_rem_pio2.c" />
-    <ClCompile Include="..\..\src\libm\e_sqrt.c" />
-    <ClCompile Include="..\..\src\libm\k_cos.c" />
-    <ClCompile Include="..\..\src\libm\k_rem_pio2.c" />
-    <ClCompile Include="..\..\src\libm\k_sin.c" />
-    <ClCompile Include="..\..\src\libm\k_tan.c" />
-    <ClCompile Include="..\..\src\libm\s_atan.c" />
-    <ClCompile Include="..\..\src\libm\s_copysign.c" />
-    <ClCompile Include="..\..\src\libm\s_cos.c" />
-    <ClCompile Include="..\..\src\libm\s_fabs.c" />
-    <ClCompile Include="..\..\src\libm\s_floor.c" />
-    <ClCompile Include="..\..\src\libm\s_isinf.c" />
-    <ClCompile Include="..\..\src\libm\s_isinff.c" />
-    <ClCompile Include="..\..\src\libm\s_isnan.c" />
-    <ClCompile Include="..\..\src\libm\s_isnanf.c" />
     <ClCompile Include="..\..\src\libm\s_modf.c" />
     <ClCompile Include="..\..\src\libm\s_modf.c" />
-    <ClCompile Include="..\..\src\libm\s_scalbn.c" />
-    <ClCompile Include="..\..\src\libm\s_sin.c" />
-    <ClCompile Include="..\..\src\libm\s_tan.c" />
     <ClCompile Include="..\..\src\loadso\windows\SDL_sysloadso.c" />
     <ClCompile Include="..\..\src\loadso\windows\SDL_sysloadso.c" />
     <ClCompile Include="..\..\src\locale\SDL_locale.c" />
     <ClCompile Include="..\..\src\locale\SDL_locale.c" />
     <ClCompile Include="..\..\src\locale\windows\SDL_syslocale.c" />
     <ClCompile Include="..\..\src\locale\windows\SDL_syslocale.c" />
@@ -191,12 +156,6 @@
     <ClCompile Include="..\..\src\thread\windows\SDL_systls.c" />
     <ClCompile Include="..\..\src\thread\windows\SDL_systls.c" />
     <ClCompile Include="..\..\src\timer\SDL_timer.c" />
     <ClCompile Include="..\..\src\timer\SDL_timer.c" />
     <ClCompile Include="..\..\src\timer\windows\SDL_systimer.c" />
     <ClCompile Include="..\..\src\timer\windows\SDL_systimer.c" />
-    <ClCompile Include="..\..\src\time\SDL_time.c">
-      <Filter>time</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\time\windows\SDL_systime.c">
-      <Filter>time\windows</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\src\video\dummy\SDL_nullevents.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullevents.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullframebuffer.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullframebuffer.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullvideo.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullvideo.c" />
@@ -222,6 +181,7 @@
     <ClCompile Include="..\..\src\video\SDL_video_unsupported.c" />
     <ClCompile Include="..\..\src\video\SDL_video_unsupported.c" />
     <ClCompile Include="..\..\src\video\SDL_vulkan_utils.c" />
     <ClCompile Include="..\..\src\video\SDL_vulkan_utils.c" />
     <ClCompile Include="..\..\src\video\SDL_yuv.c" />
     <ClCompile Include="..\..\src\video\SDL_yuv.c" />
+    <ClCompile Include="..\..\src\video\windows\SDL_surface_utils.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsclipboard.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsclipboard.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsevents.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsevents.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsframebuffer.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsframebuffer.c" />
@@ -237,8 +197,32 @@
     <ClCompile Include="..\..\src\video\windows\SDL_windowsvideo.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsvideo.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsvulkan.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsvulkan.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowswindow.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowswindow.c" />
-    <ClCompile Include="..\..\src\video\yuv2rgb\yuv_rgb.c" />
     <ClCompile Include="..\..\src\filesystem\windows\SDL_sysfilesystem.c" />
     <ClCompile Include="..\..\src\filesystem\windows\SDL_sysfilesystem.c" />
+    <ClCompile Include="..\..\src\camera\dummy\SDL_camera_dummy.c" />
+    <ClCompile Include="..\..\src\camera\SDL_camera.c" />
+    <ClCompile Include="..\..\src\dialog\SDL_dialog.c" />
+    <ClCompile Include="..\..\src\dialog\SDL_dialog_utils.c" />
+    <ClCompile Include="..\..\src\filesystem\SDL_filesystem.c" />
+    <ClCompile Include="..\..\src\filesystem\windows\SDL_sysfsops.c" />
+    <ClCompile Include="..\..\src\file\generic\SDL_asyncio_generic.c" />
+    <ClCompile Include="..\..\src\file\SDL_asyncio.c" />
+    <ClCompile Include="..\..\src\file\windows\SDL_asyncio_windows_ioring.c" />
+    <ClCompile Include="..\..\src\dialog\dummy\SDL_dummydialog.c" />
+    <ClCompile Include="..\..\src\dialog\windows\SDL_windowsdialog.c" />
+    <ClCompile Include="..\..\src\render\gpu\SDL_pipeline_gpu.c" />
+    <ClCompile Include="..\..\src\render\gpu\SDL_render_gpu.c" />
+    <ClCompile Include="..\..\src\render\gpu\SDL_shaders_gpu.c" />
+    <ClCompile Include="..\..\src\render\vulkan\SDL_render_vulkan.c" />
+    <ClCompile Include="..\..\src\render\vulkan\SDL_shaders_vulkan.c" />
+    <ClCompile Include="..\..\src\storage\generic\SDL_genericstorage.c" />
+    <ClCompile Include="..\..\src\storage\SDL_storage.c" />
+    <ClCompile Include="..\..\src\time\SDL_time.c" />
+    <ClCompile Include="..\..\src\time\windows\SDL_systime.c" />
+    <ClCompile Include="..\..\src\tray\dummy\SDL_tray.c" />
+    <ClCompile Include="..\..\src\tray\windows\SDL_tray.c" />
+    <ClCompile Include="..\..\src\video\yuv2rgb\yuv_rgb_lsx.c" />
+    <ClCompile Include="..\..\src\video\yuv2rgb\yuv_rgb_sse.c" />
+    <ClCompile Include="..\..\src\video\yuv2rgb\yuv_rgb_std.c" />
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\include\SDL3\SDL_begin_code.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_begin_code.h" />
@@ -350,9 +334,6 @@
     <ClInclude Include="..\..\src\events\SDL_mouse_c.h" />
     <ClInclude Include="..\..\src\events\SDL_mouse_c.h" />
     <ClInclude Include="..\..\src\events\SDL_touch_c.h" />
     <ClInclude Include="..\..\src\events\SDL_touch_c.h" />
     <ClInclude Include="..\..\src\events\SDL_windowevents_c.h" />
     <ClInclude Include="..\..\src\events\SDL_windowevents_c.h" />
-    <ClInclude Include="..\..\src\filesystem\SDL_sysfilesystem.h">
-      <Filter>filesystem</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\src\gpu\SDL_sysgpu.h" />
     <ClInclude Include="..\..\src\gpu\SDL_sysgpu.h" />
     <ClInclude Include="..\..\src\haptic\SDL_haptic_c.h" />
     <ClInclude Include="..\..\src\haptic\SDL_haptic_c.h" />
     <ClInclude Include="..\..\src\haptic\SDL_syshaptic.h" />
     <ClInclude Include="..\..\src\haptic\SDL_syshaptic.h" />
@@ -457,6 +438,7 @@
     <ClInclude Include="..\..\src\video\SDL_vulkan_internal.h" />
     <ClInclude Include="..\..\src\video\SDL_vulkan_internal.h" />
     <ClInclude Include="..\..\src\video\SDL_yuv_c.h" />
     <ClInclude Include="..\..\src\video\SDL_yuv_c.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_msctf.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_msctf.h" />
+    <ClInclude Include="..\..\src\video\windows\SDL_surface_utils.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsclipboard.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsclipboard.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsevents.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsevents.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsframebuffer.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsframebuffer.h" />
@@ -476,6 +458,21 @@
     <ClInclude Include="..\..\src\video\yuv2rgb\yuv_rgb.h" />
     <ClInclude Include="..\..\src\video\yuv2rgb\yuv_rgb.h" />
     <ClInclude Include="..\..\src\video\yuv2rgb\yuv_rgb_sse_func.h" />
     <ClInclude Include="..\..\src\video\yuv2rgb\yuv_rgb_sse_func.h" />
     <ClInclude Include="..\..\src\video\yuv2rgb\yuv_rgb_std_func.h" />
     <ClInclude Include="..\..\src\video\yuv2rgb\yuv_rgb_std_func.h" />
+    <ClInclude Include="..\..\include\SDL3\SDL_camera.h" />
+    <ClInclude Include="..\..\include\SDL3\SDL_asyncio.h" />
+    <ClInclude Include="..\..\include\SDL3\SDL_storage.h" />
+    <ClInclude Include="..\..\include\SDL3\SDL_time.h" />
+    <ClInclude Include="..\..\src\camera\SDL_camera_c.h" />
+    <ClInclude Include="..\..\src\camera\SDL_syscamera.h" />
+    <ClInclude Include="..\..\src\filesystem\SDL_sysfilesystem.h" />
+    <ClInclude Include="..\..\src\file\SDL_asyncio_c.h" />
+    <ClInclude Include="..\..\src\file\SDL_sysasyncio.h" />
+    <ClInclude Include="..\..\src\video\yuv2rgb\yuv_rgb_common.h" />
+    <ClInclude Include="..\..\src\video\yuv2rgb\yuv_rgb_internal.h" />
+    <ClInclude Include="..\..\src\video\yuv2rgb\yuv_rgb_lsx.h" />
+    <ClInclude Include="..\..\src\video\yuv2rgb\yuv_rgb_lsx_func.h" />
+    <ClInclude Include="..\..\src\video\yuv2rgb\yuv_rgb_sse.h" />
+    <ClInclude Include="..\..\src\video\yuv2rgb\yuv_rgb_std.h" />
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\src\core\windows\version.rc" />
     <ResourceCompile Include="..\..\src\core\windows\version.rc" />

+ 3 - 3
libs/SDL3/VisualC/SDL.sln

@@ -71,7 +71,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "01-read-and-draw", "example
 EndProject
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "game", "game", "{D1BF59F6-22DC-493B-BDEB-451A50DA793D}"
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "game", "game", "{D1BF59F6-22DC-493B-BDEB-451A50DA793D}"
 EndProject
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "01-snake", "examples\game\01-snake\01-snake.vcxproj", "{7820969A-5B7B-4046-BB0A-82905D457FC5}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "01-snake", "examples\demo\01-snake\01-snake.vcxproj", "{7820969A-5B7B-4046-BB0A-82905D457FC5}"
 EndProject
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pen", "pen", "{F2247885-8EE8-42F4-A702-4155587620E0}"
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pen", "pen", "{F2247885-8EE8-42F4-A702-4155587620E0}"
 EndProject
 EndProject
@@ -111,9 +111,9 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "18-debug-text", "examples\r
 EndProject
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03-load-wav", "examples\audio\03-load-wav\03-load-wav.vcxproj", "{608C6C67-7766-471F-BBFF-8B00086039AF}"
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03-load-wav", "examples\audio\03-load-wav\03-load-wav.vcxproj", "{608C6C67-7766-471F-BBFF-8B00086039AF}"
 EndProject
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "02-woodeneye-008", "examples\game\02-woodeneye-008\02-woodeneye-008.vcxproj", "{A3F601E0-B54C-4DD8-8A97-FDEF7624EE60}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "02-woodeneye-008", "examples\demo\02-woodeneye-008\02-woodeneye-008.vcxproj", "{A3F601E0-B54C-4DD8-8A97-FDEF7624EE60}"
 EndProject
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03-infinite-monkeys", "examples\game\03-infinite-monkeys\03-infinite-monkeys.vcxproj", "{75AEE75A-C016-4497-960B-D767B822237D}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03-infinite-monkeys", "examples\demo\03-infinite-monkeys\03-infinite-monkeys.vcxproj", "{75AEE75A-C016-4497-960B-D767B822237D}"
 EndProject
 EndProject
 Global
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution

+ 10 - 26
libs/SDL3/VisualC/SDL/SDL.vcxproj

@@ -259,6 +259,7 @@
     <ClInclude Include="..\..\include\SDL3\SDL_haptic.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_haptic.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_hints.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_hints.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_hidapi.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_hidapi.h" />
+    <ClInclude Include="..\..\include\SDL3\SDL_asyncio.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_joystick.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_joystick.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_keyboard.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_keyboard.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_keycode.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_keycode.h" />
@@ -352,6 +353,8 @@
     <ClInclude Include="..\..\src\filesystem\SDL_sysfilesystem.h" />
     <ClInclude Include="..\..\src\filesystem\SDL_sysfilesystem.h" />
     <ClInclude Include="..\..\src\gpu\SDL_sysgpu.h" />
     <ClInclude Include="..\..\src\gpu\SDL_sysgpu.h" />
     <ClInclude Include="..\..\src\gpu\vulkan\SDL_gpu_vulkan_vkfuncs.h" />
     <ClInclude Include="..\..\src\gpu\vulkan\SDL_gpu_vulkan_vkfuncs.h" />
+    <ClInclude Include="..\..\src\file\SDL_asyncio_c.h" />
+    <ClInclude Include="..\..\src\file\SDL_sysasyncio.h" />
     <ClInclude Include="..\..\src\haptic\SDL_haptic_c.h" />
     <ClInclude Include="..\..\src\haptic\SDL_haptic_c.h" />
     <ClInclude Include="..\..\src\haptic\SDL_syshaptic.h" />
     <ClInclude Include="..\..\src\haptic\SDL_syshaptic.h" />
     <ClInclude Include="..\..\src\haptic\windows\SDL_dinputhaptic_c.h" />
     <ClInclude Include="..\..\src\haptic\windows\SDL_dinputhaptic_c.h" />
@@ -409,13 +412,16 @@
     <ClCompile Include="..\..\src\camera\dummy\SDL_camera_dummy.c" />
     <ClCompile Include="..\..\src\camera\dummy\SDL_camera_dummy.c" />
     <ClCompile Include="..\..\src\camera\mediafoundation\SDL_camera_mediafoundation.c" />
     <ClCompile Include="..\..\src\camera\mediafoundation\SDL_camera_mediafoundation.c" />
     <ClCompile Include="..\..\src\camera\SDL_camera.c" />
     <ClCompile Include="..\..\src\camera\SDL_camera.c" />
+    <ClCompile Include="..\..\src\dialog\SDL_dialog.c" />
     <ClCompile Include="..\..\src\dialog\SDL_dialog_utils.c" />
     <ClCompile Include="..\..\src\dialog\SDL_dialog_utils.c" />
     <ClCompile Include="..\..\src\filesystem\SDL_filesystem.c" />
     <ClCompile Include="..\..\src\filesystem\SDL_filesystem.c" />
     <ClCompile Include="..\..\src\filesystem\windows\SDL_sysfsops.c" />
     <ClCompile Include="..\..\src\filesystem\windows\SDL_sysfsops.c" />
+    <ClCompile Include="..\..\src\file\windows\SDL_asyncio_windows_ioring.c" />
     <ClCompile Include="..\..\src\gpu\SDL_gpu.c" />
     <ClCompile Include="..\..\src\gpu\SDL_gpu.c" />
-    <ClCompile Include="..\..\src\gpu\d3d11\SDL_gpu_d3d11.c" />
     <ClCompile Include="..\..\src\gpu\d3d12\SDL_gpu_d3d12.c" />
     <ClCompile Include="..\..\src\gpu\d3d12\SDL_gpu_d3d12.c" />
     <ClCompile Include="..\..\src\gpu\vulkan\SDL_gpu_vulkan.c" />
     <ClCompile Include="..\..\src\gpu\vulkan\SDL_gpu_vulkan.c" />
+    <ClCompile Include="..\..\src\file\generic\SDL_asyncio_generic.c" />
+    <ClCompile Include="..\..\src\file\SDL_asyncio.c" />
     <ClCompile Include="..\..\src\main\generic\SDL_sysmain_callbacks.c" />
     <ClCompile Include="..\..\src\main\generic\SDL_sysmain_callbacks.c" />
     <ClCompile Include="..\..\src\main\SDL_main_callbacks.c" />
     <ClCompile Include="..\..\src\main\SDL_main_callbacks.c" />
     <ClCompile Include="..\..\src\main\SDL_runapp.c" />
     <ClCompile Include="..\..\src\main\SDL_runapp.c" />
@@ -483,6 +489,7 @@
     <ClInclude Include="..\..\src\video\SDL_vulkan_internal.h" />
     <ClInclude Include="..\..\src\video\SDL_vulkan_internal.h" />
     <ClInclude Include="..\..\src\video\SDL_yuv_c.h" />
     <ClInclude Include="..\..\src\video\SDL_yuv_c.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_msctf.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_msctf.h" />
+    <ClInclude Include="..\..\src\video\windows\SDL_surface_utils.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsclipboard.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsclipboard.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsevents.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsevents.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsframebuffer.h" />
     <ClInclude Include="..\..\src\video\windows\SDL_windowsframebuffer.h" />
@@ -522,7 +529,6 @@
     <ClCompile Include="..\..\src\audio\SDL_mixer.c" />
     <ClCompile Include="..\..\src\audio\SDL_mixer.c" />
     <ClCompile Include="..\..\src\audio\SDL_wave.c" />
     <ClCompile Include="..\..\src\audio\SDL_wave.c" />
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
-    <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi_win32.c" />
     <ClCompile Include="..\..\src\core\SDL_core_unsupported.c" />
     <ClCompile Include="..\..\src\core\SDL_core_unsupported.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
@@ -585,31 +591,7 @@
     <ClCompile Include="..\..\src\joystick\windows\SDL_windowsjoystick.c" />
     <ClCompile Include="..\..\src\joystick\windows\SDL_windowsjoystick.c" />
     <ClCompile Include="..\..\src\joystick\windows\SDL_windows_gaming_input.c" />
     <ClCompile Include="..\..\src\joystick\windows\SDL_windows_gaming_input.c" />
     <ClCompile Include="..\..\src\joystick\windows\SDL_xinputjoystick.c" />
     <ClCompile Include="..\..\src\joystick\windows\SDL_xinputjoystick.c" />
-    <ClCompile Include="..\..\src\libm\e_atan2.c" />
-    <ClCompile Include="..\..\src\libm\e_exp.c" />
-    <ClCompile Include="..\..\src\libm\e_fmod.c" />
-    <ClCompile Include="..\..\src\libm\e_log.c" />
-    <ClCompile Include="..\..\src\libm\e_log10.c" />
-    <ClCompile Include="..\..\src\libm\e_pow.c" />
-    <ClCompile Include="..\..\src\libm\e_rem_pio2.c" />
-    <ClCompile Include="..\..\src\libm\e_sqrt.c" />
-    <ClCompile Include="..\..\src\libm\k_cos.c" />
-    <ClCompile Include="..\..\src\libm\k_rem_pio2.c" />
-    <ClCompile Include="..\..\src\libm\k_sin.c" />
-    <ClCompile Include="..\..\src\libm\k_tan.c" />
-    <ClCompile Include="..\..\src\libm\s_atan.c" />
-    <ClCompile Include="..\..\src\libm\s_copysign.c" />
-    <ClCompile Include="..\..\src\libm\s_cos.c" />
-    <ClCompile Include="..\..\src\libm\s_fabs.c" />
-    <ClCompile Include="..\..\src\libm\s_floor.c" />
-    <ClCompile Include="..\..\src\libm\s_isinf.c" />
-    <ClCompile Include="..\..\src\libm\s_isinff.c" />
-    <ClCompile Include="..\..\src\libm\s_isnan.c" />
-    <ClCompile Include="..\..\src\libm\s_isnanf.c" />
     <ClCompile Include="..\..\src\libm\s_modf.c" />
     <ClCompile Include="..\..\src\libm\s_modf.c" />
-    <ClCompile Include="..\..\src\libm\s_scalbn.c" />
-    <ClCompile Include="..\..\src\libm\s_sin.c" />
-    <ClCompile Include="..\..\src\libm\s_tan.c" />
     <ClCompile Include="..\..\src\loadso\windows\SDL_sysloadso.c" />
     <ClCompile Include="..\..\src\loadso\windows\SDL_sysloadso.c" />
     <ClCompile Include="..\..\src\locale\SDL_locale.c" />
     <ClCompile Include="..\..\src\locale\SDL_locale.c" />
     <ClCompile Include="..\..\src\locale\windows\SDL_syslocale.c" />
     <ClCompile Include="..\..\src\locale\windows\SDL_syslocale.c" />
@@ -690,6 +672,7 @@
     <ClCompile Include="..\..\src\timer\windows\SDL_systimer.c" />
     <ClCompile Include="..\..\src\timer\windows\SDL_systimer.c" />
     <ClCompile Include="..\..\src\time\SDL_time.c" />
     <ClCompile Include="..\..\src\time\SDL_time.c" />
     <ClCompile Include="..\..\src\time\windows\SDL_systime.c" />
     <ClCompile Include="..\..\src\time\windows\SDL_systime.c" />
+    <ClCompile Include="..\..\src\tray\windows\SDL_tray.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullevents.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullevents.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullframebuffer.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullframebuffer.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullvideo.c" />
     <ClCompile Include="..\..\src\video\dummy\SDL_nullvideo.c" />
@@ -720,6 +703,7 @@
     <ClCompile Include="..\..\src\video\SDL_video_unsupported.c" />
     <ClCompile Include="..\..\src\video\SDL_video_unsupported.c" />
     <ClCompile Include="..\..\src\video\SDL_vulkan_utils.c" />
     <ClCompile Include="..\..\src\video\SDL_vulkan_utils.c" />
     <ClCompile Include="..\..\src\video\SDL_yuv.c" />
     <ClCompile Include="..\..\src\video\SDL_yuv.c" />
+    <ClCompile Include="..\..\src\video\windows\SDL_surface_utils.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsclipboard.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsclipboard.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsevents.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsevents.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsframebuffer.c" />
     <ClCompile Include="..\..\src\video\windows\SDL_windowsframebuffer.c" />

+ 47 - 96
libs/SDL3/VisualC/SDL/SDL.vcxproj.filters

@@ -211,6 +211,12 @@
     <Filter Include="main\windows">
     <Filter Include="main\windows">
       <UniqueIdentifier>{00009d5ded166cc6c6680ec771a30000}</UniqueIdentifier>
       <UniqueIdentifier>{00009d5ded166cc6c6680ec771a30000}</UniqueIdentifier>
     </Filter>
     </Filter>
+    <Filter Include="file\generic">
+      <UniqueIdentifier>{00004d6806b6238cae0ed62db5440000}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="file\windows">
+      <UniqueIdentifier>{000028b2ea36d7190d13777a4dc70000}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\include\SDL3\SDL_begin_code.h">
     <ClInclude Include="..\..\include\SDL3\SDL_begin_code.h">
@@ -279,6 +285,9 @@
     <ClInclude Include="..\..\include\SDL3\SDL_hidapi.h">
     <ClInclude Include="..\..\include\SDL3\SDL_hidapi.h">
       <Filter>API Headers</Filter>
       <Filter>API Headers</Filter>
     </ClInclude>
     </ClInclude>
+    <ClInclude Include="..\..\include\SDL3\SDL_asyncio.h">
+      <Filter>API Headers</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\include\SDL3\SDL_joystick.h">
     <ClInclude Include="..\..\include\SDL3\SDL_joystick.h">
       <Filter>API Headers</Filter>
       <Filter>API Headers</Filter>
     </ClInclude>
     </ClInclude>
@@ -438,6 +447,12 @@
     <ClInclude Include="..\..\src\filesystem\SDL_sysfilesystem.h">
     <ClInclude Include="..\..\src\filesystem\SDL_sysfilesystem.h">
       <Filter>filesystem</Filter>
       <Filter>filesystem</Filter>
     </ClInclude>
     </ClInclude>
+    <ClInclude Include="..\..\src\file\SDL_asyncio_c.h">
+      <Filter>file</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\file\SDL_sysasyncio.h">
+      <Filter>file</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\src\main\SDL_main_callbacks.h">
     <ClInclude Include="..\..\src\main\SDL_main_callbacks.h">
       <Filter>main</Filter>
       <Filter>main</Filter>
     </ClInclude>
     </ClInclude>
@@ -501,9 +516,6 @@
     <ClInclude Include="..\..\src\dynapi\SDL_dynapi_unsupported.h">
     <ClInclude Include="..\..\src\dynapi\SDL_dynapi_unsupported.h">
       <Filter>dynapi</Filter>
       <Filter>dynapi</Filter>
     </ClInclude>
     </ClInclude>
-    <ClInclude Include="..\..\src\events\SDL_categories.h">
-      <Filter>events</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\src\events\SDL_clipboardevents_c.h">
     <ClInclude Include="..\..\src\events\SDL_clipboardevents_c.h">
       <Filter>events</Filter>
       <Filter>events</Filter>
     </ClInclude>
     </ClInclude>
@@ -678,6 +690,9 @@
     <ClInclude Include="..\..\src\video\yuv2rgb\yuv_rgb_std_func.h">
     <ClInclude Include="..\..\src\video\yuv2rgb\yuv_rgb_std_func.h">
       <Filter>video\yuv2rgb</Filter>
       <Filter>video\yuv2rgb</Filter>
     </ClInclude>
     </ClInclude>
+    <ClInclude Include="..\..\src\video\windows\SDL_surface_utils.h">
+      <Filter>video\windows</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\src\video\windows\SDL_windowsclipboard.h">
     <ClInclude Include="..\..\src\video\windows\SDL_windowsclipboard.h">
       <Filter>video\windows</Filter>
       <Filter>video\windows</Filter>
     </ClInclude>
     </ClInclude>
@@ -923,6 +938,9 @@
     <ClInclude Include="..\..\src\gpu\vulkan\SDL_gpu_vulkan_vkfuncs.h">
     <ClInclude Include="..\..\src\gpu\vulkan\SDL_gpu_vulkan_vkfuncs.h">
       <Filter>gpu</Filter>
       <Filter>gpu</Filter>
     </ClInclude>
     </ClInclude>
+    <ClInclude Include="..\..\include\SDL3\SDL_storage.h" />
+    <ClInclude Include="..\..\include\SDL3\SDL_time.h" />
+    <ClInclude Include="..\..\src\events\SDL_categories_c.h" />
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
@@ -935,6 +953,9 @@
     <ClCompile Include="..\..\src\camera\SDL_camera.c">
     <ClCompile Include="..\..\src\camera\SDL_camera.c">
       <Filter>camera</Filter>
       <Filter>camera</Filter>
     </ClCompile>
     </ClCompile>
+    <ClCompile Include="..\..\src\dialog\SDL_dialog.c">
+      <Filter>dialog</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\src\dialog\SDL_dialog_utils.c">
     <ClCompile Include="..\..\src\dialog\SDL_dialog_utils.c">
       <Filter>dialog</Filter>
       <Filter>dialog</Filter>
     </ClCompile>
     </ClCompile>
@@ -944,6 +965,15 @@
     <ClCompile Include="..\..\src\filesystem\windows\SDL_sysfsops.c">
     <ClCompile Include="..\..\src\filesystem\windows\SDL_sysfsops.c">
       <Filter>filesystem\windows</Filter>
       <Filter>filesystem\windows</Filter>
     </ClCompile>
     </ClCompile>
+    <ClCompile Include="..\..\src\file\generic\SDL_asyncio_generic.c">
+      <Filter>file\generic</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\src\file\SDL_asyncio.c">
+      <Filter>file</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\src\file\windows\SDL_asyncio_windows_ioring.c">
+      <Filter>file\windows</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\src\main\generic\SDL_sysmain_callbacks.c">
     <ClCompile Include="..\..\src\main\generic\SDL_sysmain_callbacks.c">
       <Filter>main\generic</Filter>
       <Filter>main\generic</Filter>
     </ClCompile>
     </ClCompile>
@@ -1079,81 +1109,9 @@
     <ClCompile Include="..\..\src\joystick\SDL_steam_virtual_gamepad.c">
     <ClCompile Include="..\..\src\joystick\SDL_steam_virtual_gamepad.c">
       <Filter>joystick</Filter>
       <Filter>joystick</Filter>
     </ClCompile>
     </ClCompile>
-    <ClCompile Include="..\..\src\libm\e_atan2.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\e_exp.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\e_fmod.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\e_log.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\e_log10.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\e_pow.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\e_sqrt.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\e_rem_pio2.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\k_cos.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\k_rem_pio2.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\k_sin.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\k_tan.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\s_atan.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\s_copysign.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\s_cos.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\s_fabs.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\s_floor.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\s_isinf.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\s_isinff.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\s_isnan.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\s_isnanf.c">
-      <Filter>libm</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\src\libm\s_modf.c">
     <ClCompile Include="..\..\src\libm\s_modf.c">
       <Filter>libm</Filter>
       <Filter>libm</Filter>
     </ClCompile>
     </ClCompile>
-    <ClCompile Include="..\..\src\libm\s_scalbn.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\s_sin.c">
-      <Filter>libm</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\libm\s_tan.c">
-      <Filter>libm</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\src\loadso\windows\SDL_sysloadso.c">
     <ClCompile Include="..\..\src\loadso\windows\SDL_sysloadso.c">
       <Filter>loadso\windows</Filter>
       <Filter>loadso\windows</Filter>
     </ClCompile>
     </ClCompile>
@@ -1178,9 +1136,6 @@
     <ClCompile Include="..\..\src\audio\dummy\SDL_dummyaudio.c">
     <ClCompile Include="..\..\src\audio\dummy\SDL_dummyaudio.c">
       <Filter>audio\dummy</Filter>
       <Filter>audio\dummy</Filter>
     </ClCompile>
     </ClCompile>
-    <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi_win32.c">
-      <Filter>audio\wasapi</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c">
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c">
       <Filter>audio\wasapi</Filter>
       <Filter>audio\wasapi</Filter>
     </ClCompile>
     </ClCompile>
@@ -1277,6 +1232,9 @@
     <ClCompile Include="..\..\src\time\windows\SDL_systime.c">
     <ClCompile Include="..\..\src\time\windows\SDL_systime.c">
       <Filter>time\windows</Filter>
       <Filter>time\windows</Filter>
     </ClCompile>
     </ClCompile>
+    <ClCompile Include="..\..\src\tray\windows\SDL_tray.c">
+      <Filter>video</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\src\video\SDL_RLEaccel.c">
     <ClCompile Include="..\..\src\video\SDL_RLEaccel.c">
       <Filter>video</Filter>
       <Filter>video</Filter>
     </ClCompile>
     </ClCompile>
@@ -1349,6 +1307,9 @@
     <ClCompile Include="..\..\src\video\dummy\SDL_nullvideo.c">
     <ClCompile Include="..\..\src\video\dummy\SDL_nullvideo.c">
       <Filter>video\dummy</Filter>
       <Filter>video\dummy</Filter>
     </ClCompile>
     </ClCompile>
+    <ClCompile Include="..\..\src\video\windows\SDL_surface_utils.c">
+      <Filter>video\windows</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\src\video\windows\SDL_windowsclipboard.c">
     <ClCompile Include="..\..\src\video\windows\SDL_windowsclipboard.c">
       <Filter>video\windows</Filter>
       <Filter>video\windows</Filter>
     </ClCompile>
     </ClCompile>
@@ -1499,15 +1460,6 @@
     <ClCompile Include="..\..\src\render\direct3d11\SDL_shaders_d3d11.c">
     <ClCompile Include="..\..\src\render\direct3d11\SDL_shaders_d3d11.c">
       <Filter>render\direct3d11</Filter>
       <Filter>render\direct3d11</Filter>
     </ClCompile>
     </ClCompile>
-    <ClCompile Include="..\..\src\render\gpu\SDL_pipeline_gpu.c">
-      <Filter>render\gpu</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\render\gpu\SDL_render_gpu.c">
-      <Filter>render\gpu</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\render\gpu\SDL_shaders_gpu.c">
-      <Filter>render\gpu</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\src\render\opengl\SDL_render_gl.c">
     <ClCompile Include="..\..\src\render\opengl\SDL_render_gl.c">
       <Filter>render\opengl</Filter>
       <Filter>render\opengl</Filter>
     </ClCompile>
     </ClCompile>
@@ -1550,12 +1502,6 @@
     <ClCompile Include="..\..\src\power\windows\SDL_syspower.c">
     <ClCompile Include="..\..\src\power\windows\SDL_syspower.c">
       <Filter>power\windows</Filter>
       <Filter>power\windows</Filter>
     </ClCompile>
     </ClCompile>
-    <ClCompile Include="..\..\src\process\SDL_process.c">
-      <Filter>process</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\src\process\windows\SDL_windowsprocess.c">
-      <Filter>process\windows</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\src\SDL_log.c" />
     <ClCompile Include="..\..\src\SDL_log.c" />
     <ClCompile Include="..\..\src\render\direct3d12\SDL_render_d3d12.c">
     <ClCompile Include="..\..\src\render\direct3d12\SDL_render_d3d12.c">
       <Filter>render\direct3d12</Filter>
       <Filter>render\direct3d12</Filter>
@@ -1601,15 +1547,20 @@
     <ClCompile Include="..\..\src\gpu\SDL_gpu.c">
     <ClCompile Include="..\..\src\gpu\SDL_gpu.c">
       <Filter>gpu</Filter>
       <Filter>gpu</Filter>
     </ClCompile>
     </ClCompile>
-    <ClCompile Include="..\..\src\gpu\d3d11\SDL_gpu_d3d11.c">
-      <Filter>gpu</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\src\gpu\d3d12\SDL_gpu_d3d12.c">
     <ClCompile Include="..\..\src\gpu\d3d12\SDL_gpu_d3d12.c">
       <Filter>gpu</Filter>
       <Filter>gpu</Filter>
     </ClCompile>
     </ClCompile>
     <ClCompile Include="..\..\src\gpu\vulkan\SDL_gpu_vulkan.c">
     <ClCompile Include="..\..\src\gpu\vulkan\SDL_gpu_vulkan.c">
       <Filter>gpu</Filter>
       <Filter>gpu</Filter>
     </ClCompile>
     </ClCompile>
+    <ClCompile Include="..\..\src\process\SDL_process.c" />
+    <ClCompile Include="..\..\src\process\windows\SDL_windowsprocess.c" />
+    <ClCompile Include="..\..\src\render\gpu\SDL_pipeline_gpu.c" />
+    <ClCompile Include="..\..\src\render\gpu\SDL_render_gpu.c" />
+    <ClCompile Include="..\..\src\render\gpu\SDL_shaders_gpu.c" />
+    <ClCompile Include="..\..\src\storage\generic\SDL_genericstorage.c" />
+    <ClCompile Include="..\..\src\storage\steam\SDL_steamstorage.c" />
+    <ClCompile Include="..\..\src\storage\SDL_storage.c" />
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\src\core\windows\version.rc" />
     <ResourceCompile Include="..\..\src\core\windows\version.rc" />

+ 2 - 2
libs/SDL3/VisualC/VisualC/examples/game/01-snake/01-snake.vcxproj

@@ -6,8 +6,8 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ItemGroup>
   <ItemGroup>
-    <None Include="$(SolutionDir)\..\examples\game\01-snake\README.txt" />
-    <ClCompile Include="$(SolutionDir)\..\examples\game\01-snake\*.c" />
+    <None Include="$(SolutionDir)\..\examples\demo\01-snake\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\demo\01-snake\*.c" />
   </ItemGroup>
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 </Project>
 </Project>

+ 2 - 2
libs/SDL3/VisualC/examples/game/01-snake/01-snake.vcxproj → libs/SDL3/VisualC/examples/demo/01-snake/01-snake.vcxproj

@@ -6,8 +6,8 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ItemGroup>
   <ItemGroup>
-    <None Include="$(SolutionDir)\..\examples\game\01-snake\README.txt" />
-    <ClCompile Include="$(SolutionDir)\..\examples\game\01-snake\snake.c" />
+    <None Include="$(SolutionDir)\..\examples\demo\01-snake\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\demo\01-snake\snake.c" />
   </ItemGroup>
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 </Project>
 </Project>

+ 2 - 2
libs/SDL3/VisualC/examples/game/02-woodeneye-008/02-woodeneye-008.vcxproj → libs/SDL3/VisualC/examples/demo/02-woodeneye-008/02-woodeneye-008.vcxproj

@@ -6,8 +6,8 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ItemGroup>
   <ItemGroup>
-    <None Include="$(SolutionDir)\..\examples\game\02-woodeneye-008\README.txt" />
-    <ClCompile Include="$(SolutionDir)\..\examples\game\02-woodeneye-008\woodeneye-008.c" />
+    <None Include="$(SolutionDir)\..\examples\demo\02-woodeneye-008\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\demo\02-woodeneye-008\woodeneye-008.c" />
   </ItemGroup>
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 </Project>
 </Project>

+ 2 - 2
libs/SDL3/VisualC/examples/game/03-infinite-monkeys/03-infinite-monkeys.vcxproj → libs/SDL3/VisualC/examples/demo/03-infinite-monkeys/03-infinite-monkeys.vcxproj

@@ -6,8 +6,8 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ItemGroup>
   <ItemGroup>
-    <None Include="$(SolutionDir)\..\examples\game\03-infinite-monkeys\README.txt" />
-    <ClCompile Include="$(SolutionDir)\..\examples\game\03-infinite-monkeys\infinite-monkeys.c" />
+    <None Include="$(SolutionDir)\..\examples\demo\03-infinite-monkeys\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\demo\03-infinite-monkeys\infinite-monkeys.c" />
   </ItemGroup>
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 </Project>
 </Project>

+ 2 - 2
libs/SDL3/Xcode/SDL/Info-Framework.plist

@@ -19,10 +19,10 @@
 	<key>CFBundlePackageType</key>
 	<key>CFBundlePackageType</key>
 	<string>FMWK</string>
 	<string>FMWK</string>
 	<key>CFBundleShortVersionString</key>
 	<key>CFBundleShortVersionString</key>
-	<string>3.1.6</string>
+	<string>3.1.7</string>
 	<key>CFBundleSignature</key>
 	<key>CFBundleSignature</key>
 	<string>SDLX</string>
 	<string>SDLX</string>
 	<key>CFBundleVersion</key>
 	<key>CFBundleVersion</key>
-	<string>3.1.6</string>
+	<string>3.1.7</string>
 </dict>
 </dict>
 </plist>
 </plist>

+ 99 - 151
libs/SDL3/Xcode/SDL/SDL.xcodeproj/project.pbxproj

@@ -40,10 +40,13 @@
 		000040E76FDC6AE48CBF0000 /* SDL_hashtable.c in Sources */ = {isa = PBXBuildFile; fileRef = 000078E1881E857EBB6C0000 /* SDL_hashtable.c */; };
 		000040E76FDC6AE48CBF0000 /* SDL_hashtable.c in Sources */ = {isa = PBXBuildFile; fileRef = 000078E1881E857EBB6C0000 /* SDL_hashtable.c */; };
 		0000481D255AF155B42C0000 /* SDL_sysfsops.c in Sources */ = {isa = PBXBuildFile; fileRef = 0000F4E6AA3EF99DA3C80000 /* SDL_sysfsops.c */; };
 		0000481D255AF155B42C0000 /* SDL_sysfsops.c in Sources */ = {isa = PBXBuildFile; fileRef = 0000F4E6AA3EF99DA3C80000 /* SDL_sysfsops.c */; };
 		0000494CC93F3E624D3C0000 /* SDL_systime.c in Sources */ = {isa = PBXBuildFile; fileRef = 00003F472C51CE7DF6160000 /* SDL_systime.c */; };
 		0000494CC93F3E624D3C0000 /* SDL_systime.c in Sources */ = {isa = PBXBuildFile; fileRef = 00003F472C51CE7DF6160000 /* SDL_systime.c */; };
+		00004D0B73767647AD550000 /* SDL_asyncio_generic.c in Sources */ = {isa = PBXBuildFile; fileRef = 0000FB02CDE4BE34A87E0000 /* SDL_asyncio_generic.c */; };
 		000080903BC03006F24E0000 /* SDL_filesystem.c in Sources */ = {isa = PBXBuildFile; fileRef = 00002B010DB1A70931C20000 /* SDL_filesystem.c */; };
 		000080903BC03006F24E0000 /* SDL_filesystem.c in Sources */ = {isa = PBXBuildFile; fileRef = 00002B010DB1A70931C20000 /* SDL_filesystem.c */; };
 		000095FA1BDE436CF3AF0000 /* SDL_time.c in Sources */ = {isa = PBXBuildFile; fileRef = 0000641A9BAC11AB3FBE0000 /* SDL_time.c */; };
 		000095FA1BDE436CF3AF0000 /* SDL_time.c in Sources */ = {isa = PBXBuildFile; fileRef = 0000641A9BAC11AB3FBE0000 /* SDL_time.c */; };
 		000098E9DAA43EF6FF7F0000 /* SDL_camera.c in Sources */ = {isa = PBXBuildFile; fileRef = 0000035D38C3899C7EFD0000 /* SDL_camera.c */; };
 		000098E9DAA43EF6FF7F0000 /* SDL_camera.c in Sources */ = {isa = PBXBuildFile; fileRef = 0000035D38C3899C7EFD0000 /* SDL_camera.c */; };
+		0000A03C0F32C43816F40000 /* SDL_asyncio_windows_ioring.c in Sources */ = {isa = PBXBuildFile; fileRef = 000030DD21496B5C0F210000 /* SDL_asyncio_windows_ioring.c */; };
 		0000A4DA2F45A31DC4F00000 /* SDL_sysmain_callbacks.m in Sources */ = {isa = PBXBuildFile; fileRef = 0000BB287BA0A0178C1A0000 /* SDL_sysmain_callbacks.m */; };
 		0000A4DA2F45A31DC4F00000 /* SDL_sysmain_callbacks.m in Sources */ = {isa = PBXBuildFile; fileRef = 0000BB287BA0A0178C1A0000 /* SDL_sysmain_callbacks.m */; };
+		0000AEB9AE90228CA2D60000 /* SDL_asyncio.c in Sources */ = {isa = PBXBuildFile; fileRef = 00003928A612EC33D42C0000 /* SDL_asyncio.c */; };
 		0000D5B526B85DE7AB1C0000 /* SDL_cocoapen.m in Sources */ = {isa = PBXBuildFile; fileRef = 0000CCA310B73A7B59910000 /* SDL_cocoapen.m */; };
 		0000D5B526B85DE7AB1C0000 /* SDL_cocoapen.m in Sources */ = {isa = PBXBuildFile; fileRef = 0000CCA310B73A7B59910000 /* SDL_cocoapen.m */; };
 		007317A40858DECD00B2BC32 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0073179D0858DECD00B2BC32 /* Cocoa.framework */; platformFilters = (macos, ); };
 		007317A40858DECD00B2BC32 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0073179D0858DECD00B2BC32 /* Cocoa.framework */; platformFilters = (macos, ); };
 		007317A60858DECD00B2BC32 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0073179F0858DECD00B2BC32 /* IOKit.framework */; platformFilters = (ios, maccatalyst, macos, ); };
 		007317A60858DECD00B2BC32 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0073179F0858DECD00B2BC32 /* IOKit.framework */; platformFilters = (ios, maccatalyst, macos, ); };
@@ -300,28 +303,6 @@
 		A7D8BA7923E2514400DCD162 /* SDL_glfuncs.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A90E23E2514000DCD162 /* SDL_glfuncs.h */; };
 		A7D8BA7923E2514400DCD162 /* SDL_glfuncs.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A90E23E2514000DCD162 /* SDL_glfuncs.h */; };
 		A7D8BA7F23E2514400DCD162 /* SDL_render_gl.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A90F23E2514000DCD162 /* SDL_render_gl.c */; };
 		A7D8BA7F23E2514400DCD162 /* SDL_render_gl.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A90F23E2514000DCD162 /* SDL_render_gl.c */; };
 		A7D8BA8523E2514400DCD162 /* SDL_shaders_gl.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91023E2514000DCD162 /* SDL_shaders_gl.c */; };
 		A7D8BA8523E2514400DCD162 /* SDL_shaders_gl.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91023E2514000DCD162 /* SDL_shaders_gl.c */; };
-		A7D8BA8B23E2514400DCD162 /* s_sin.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91223E2514000DCD162 /* s_sin.c */; };
-		A7D8BA9123E2514400DCD162 /* s_cos.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91323E2514000DCD162 /* s_cos.c */; };
-		A7D8BA9723E2514400DCD162 /* s_copysign.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91423E2514000DCD162 /* s_copysign.c */; };
-		A7D8BA9D23E2514400DCD162 /* s_fabs.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91523E2514000DCD162 /* s_fabs.c */; };
-		A7D8BAA323E2514400DCD162 /* k_rem_pio2.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91623E2514000DCD162 /* k_rem_pio2.c */; };
-		A7D8BAA923E2514400DCD162 /* k_sin.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91723E2514000DCD162 /* k_sin.c */; };
-		A7D8BAAF23E2514400DCD162 /* s_atan.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91823E2514000DCD162 /* s_atan.c */; };
-		A7D8BAB523E2514400DCD162 /* k_cos.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91923E2514000DCD162 /* k_cos.c */; };
-		A7D8BABB23E2514400DCD162 /* s_scalbn.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91A23E2514000DCD162 /* s_scalbn.c */; };
-		A7D8BAC123E2514500DCD162 /* math_private.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A91B23E2514000DCD162 /* math_private.h */; };
-		A7D8BAC723E2514500DCD162 /* e_pow.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91C23E2514000DCD162 /* e_pow.c */; };
-		A7D8BACD23E2514500DCD162 /* e_atan2.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91D23E2514000DCD162 /* e_atan2.c */; };
-		A7D8BAD323E2514500DCD162 /* s_tan.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91E23E2514000DCD162 /* s_tan.c */; };
-		A7D8BAD923E2514500DCD162 /* e_rem_pio2.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A91F23E2514000DCD162 /* e_rem_pio2.c */; };
-		A7D8BADF23E2514500DCD162 /* e_fmod.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92023E2514000DCD162 /* e_fmod.c */; };
-		A7D8BAE523E2514500DCD162 /* e_exp.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92123E2514000DCD162 /* e_exp.c */; };
-		A7D8BAEB23E2514500DCD162 /* e_log10.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92223E2514000DCD162 /* e_log10.c */; };
-		A7D8BAF123E2514500DCD162 /* e_log.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92323E2514000DCD162 /* e_log.c */; };
-		A7D8BAF723E2514500DCD162 /* e_sqrt.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92423E2514000DCD162 /* e_sqrt.c */; };
-		A7D8BAFD23E2514500DCD162 /* s_floor.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92523E2514000DCD162 /* s_floor.c */; };
-		A7D8BB0323E2514500DCD162 /* math_libm.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A92623E2514000DCD162 /* math_libm.h */; };
-		A7D8BB0923E2514500DCD162 /* k_tan.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92723E2514000DCD162 /* k_tan.c */; };
 		A7D8BB1523E2514500DCD162 /* SDL_mouse.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92A23E2514000DCD162 /* SDL_mouse.c */; };
 		A7D8BB1523E2514500DCD162 /* SDL_mouse.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92A23E2514000DCD162 /* SDL_mouse.c */; };
 		A7D8BB1B23E2514500DCD162 /* SDL_mouse_c.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A92B23E2514000DCD162 /* SDL_mouse_c.h */; };
 		A7D8BB1B23E2514500DCD162 /* SDL_mouse_c.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A92B23E2514000DCD162 /* SDL_mouse_c.h */; };
 		A7D8BB2123E2514500DCD162 /* scancodes_windows.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A92C23E2514000DCD162 /* scancodes_windows.h */; };
 		A7D8BB2123E2514500DCD162 /* scancodes_windows.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A92C23E2514000DCD162 /* scancodes_windows.h */; };
@@ -346,8 +327,6 @@
 		A7D8BBA523E2514500DCD162 /* SDL_events_c.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A94223E2514000DCD162 /* SDL_events_c.h */; };
 		A7D8BBA523E2514500DCD162 /* SDL_events_c.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A94223E2514000DCD162 /* SDL_events_c.h */; };
 		A7D8BBAB23E2514500DCD162 /* SDL_windowevents_c.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A94323E2514000DCD162 /* SDL_windowevents_c.h */; };
 		A7D8BBAB23E2514500DCD162 /* SDL_windowevents_c.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A94323E2514000DCD162 /* SDL_windowevents_c.h */; };
 		A7D8BBB123E2514500DCD162 /* SDL_assert.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A94423E2514000DCD162 /* SDL_assert.c */; };
 		A7D8BBB123E2514500DCD162 /* SDL_assert.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A94423E2514000DCD162 /* SDL_assert.c */; };
-		A7D8BBC523E2561500DCD162 /* SDL_steamcontroller.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A7A723E2513E00DCD162 /* SDL_steamcontroller.c */; };
-		A7D8BBC723E2561500DCD162 /* SDL_steamcontroller.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A7A523E2513E00DCD162 /* SDL_steamcontroller.h */; };
 		A7D8BBD223E2574800DCD162 /* SDL_uikitappdelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A62F23E2513D00DCD162 /* SDL_uikitappdelegate.h */; };
 		A7D8BBD223E2574800DCD162 /* SDL_uikitappdelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A62F23E2513D00DCD162 /* SDL_uikitappdelegate.h */; };
 		A7D8BBD323E2574800DCD162 /* SDL_uikitappdelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A61E23E2513D00DCD162 /* SDL_uikitappdelegate.m */; };
 		A7D8BBD323E2574800DCD162 /* SDL_uikitappdelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A61E23E2513D00DCD162 /* SDL_uikitappdelegate.m */; };
 		A7D8BBD423E2574800DCD162 /* SDL_uikitclipboard.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A62123E2513D00DCD162 /* SDL_uikitclipboard.h */; };
 		A7D8BBD423E2574800DCD162 /* SDL_uikitclipboard.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A62123E2513D00DCD162 /* SDL_uikitclipboard.h */; };
@@ -407,7 +386,10 @@
 		F32DDAD12AB795A30041EAA5 /* SDL_audioqueue.c in Sources */ = {isa = PBXBuildFile; fileRef = F32DDACB2AB795A30041EAA5 /* SDL_audioqueue.c */; };
 		F32DDAD12AB795A30041EAA5 /* SDL_audioqueue.c in Sources */ = {isa = PBXBuildFile; fileRef = F32DDACB2AB795A30041EAA5 /* SDL_audioqueue.c */; };
 		F32DDAD32AB795A30041EAA5 /* SDL_audioqueue.h in Headers */ = {isa = PBXBuildFile; fileRef = F32DDACD2AB795A30041EAA5 /* SDL_audioqueue.h */; };
 		F32DDAD32AB795A30041EAA5 /* SDL_audioqueue.h in Headers */ = {isa = PBXBuildFile; fileRef = F32DDACD2AB795A30041EAA5 /* SDL_audioqueue.h */; };
 		F32DDAD42AB795A30041EAA5 /* SDL_audioresample.c in Sources */ = {isa = PBXBuildFile; fileRef = F32DDACE2AB795A30041EAA5 /* SDL_audioresample.c */; };
 		F32DDAD42AB795A30041EAA5 /* SDL_audioresample.c in Sources */ = {isa = PBXBuildFile; fileRef = F32DDACE2AB795A30041EAA5 /* SDL_audioresample.c */; };
+		F338A1182D1B37D8007CDFDF /* SDL_tray.m in Sources */ = {isa = PBXBuildFile; fileRef = F338A1172D1B37D8007CDFDF /* SDL_tray.m */; };
+		F338A11A2D1B37E4007CDFDF /* SDL_tray.c in Sources */ = {isa = PBXBuildFile; fileRef = F338A1192D1B37E4007CDFDF /* SDL_tray.c */; };
 		F34B9895291DEFF500AAC96E /* SDL_hidapi_steam.c in Sources */ = {isa = PBXBuildFile; fileRef = A75FDAAC23E2795C00529352 /* SDL_hidapi_steam.c */; };
 		F34B9895291DEFF500AAC96E /* SDL_hidapi_steam.c in Sources */ = {isa = PBXBuildFile; fileRef = A75FDAAC23E2795C00529352 /* SDL_hidapi_steam.c */; };
+		F35B79632D03A7B900C6D591 /* SDL_asyncio.h in Headers */ = {isa = PBXBuildFile; fileRef = 00004945A946DF5B1AED0000 /* SDL_asyncio.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F362B9192B3349E200D30B94 /* controller_list.h in Headers */ = {isa = PBXBuildFile; fileRef = F362B9152B3349E200D30B94 /* controller_list.h */; };
 		F362B9192B3349E200D30B94 /* controller_list.h in Headers */ = {isa = PBXBuildFile; fileRef = F362B9152B3349E200D30B94 /* controller_list.h */; };
 		F362B91A2B3349E200D30B94 /* SDL_gamepad_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F362B9162B3349E200D30B94 /* SDL_gamepad_c.h */; };
 		F362B91A2B3349E200D30B94 /* SDL_gamepad_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F362B9162B3349E200D30B94 /* SDL_gamepad_c.h */; };
 		F362B91B2B3349E200D30B94 /* SDL_steam_virtual_gamepad.h in Headers */ = {isa = PBXBuildFile; fileRef = F362B9172B3349E200D30B94 /* SDL_steam_virtual_gamepad.h */; };
 		F362B91B2B3349E200D30B94 /* SDL_steam_virtual_gamepad.h in Headers */ = {isa = PBXBuildFile; fileRef = F362B9172B3349E200D30B94 /* SDL_steam_virtual_gamepad.h */; };
@@ -471,11 +453,9 @@
 		F3E5A6EB2AD5E0E600293D83 /* SDL_properties.c in Sources */ = {isa = PBXBuildFile; fileRef = F3E5A6EA2AD5E0E600293D83 /* SDL_properties.c */; };
 		F3E5A6EB2AD5E0E600293D83 /* SDL_properties.c in Sources */ = {isa = PBXBuildFile; fileRef = F3E5A6EA2AD5E0E600293D83 /* SDL_properties.c */; };
 		F3E5A6ED2AD5E10800293D83 /* SDL_properties.h in Headers */ = {isa = PBXBuildFile; fileRef = F3E5A6EC2AD5E10800293D83 /* SDL_properties.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F3E5A6ED2AD5E10800293D83 /* SDL_properties.h in Headers */ = {isa = PBXBuildFile; fileRef = F3E5A6EC2AD5E10800293D83 /* SDL_properties.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F3F07D5A269640160074468B /* SDL_hidapi_luna.c in Sources */ = {isa = PBXBuildFile; fileRef = F3F07D59269640160074468B /* SDL_hidapi_luna.c */; };
 		F3F07D5A269640160074468B /* SDL_hidapi_luna.c in Sources */ = {isa = PBXBuildFile; fileRef = F3F07D59269640160074468B /* SDL_hidapi_luna.c */; };
-		F3F528CB2C29E1C300E6CC26 /* s_isnanf.c in Sources */ = {isa = PBXBuildFile; fileRef = F3F528C62C29E1C300E6CC26 /* s_isnanf.c */; };
-		F3F528CC2C29E1C300E6CC26 /* s_isinf.c in Sources */ = {isa = PBXBuildFile; fileRef = F3F528C72C29E1C300E6CC26 /* s_isinf.c */; };
-		F3F528CD2C29E1C300E6CC26 /* s_isnan.c in Sources */ = {isa = PBXBuildFile; fileRef = F3F528C82C29E1C300E6CC26 /* s_isnan.c */; };
-		F3F528CE2C29E1C300E6CC26 /* s_modf.c in Sources */ = {isa = PBXBuildFile; fileRef = F3F528C92C29E1C300E6CC26 /* s_modf.c */; };
-		F3F528CF2C29E1C300E6CC26 /* s_isinff.c in Sources */ = {isa = PBXBuildFile; fileRef = F3F528CA2C29E1C300E6CC26 /* s_isinff.c */; };
+		F3F15D7F2D011912007AE210 /* SDL_dialog.c in Sources */ = {isa = PBXBuildFile; fileRef = F3F15D7D2D011912007AE210 /* SDL_dialog.c */; };
+		F3F15D802D011912007AE210 /* SDL_dialog_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F15D7E2D011912007AE210 /* SDL_dialog_utils.h */; };
+		F3F15D812D011912007AE210 /* SDL_dialog.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F15D7C2D011912007AE210 /* SDL_dialog.h */; };
 		F3F7D8ED2933074E00816151 /* SDL_audio.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8AA2933074900816151 /* SDL_audio.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F3F7D8ED2933074E00816151 /* SDL_audio.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8AA2933074900816151 /* SDL_audio.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F3F7D8F12933074E00816151 /* SDL_platform.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8AB2933074900816151 /* SDL_platform.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F3F7D8F12933074E00816151 /* SDL_platform.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8AB2933074900816151 /* SDL_platform.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F3F7D8F52933074E00816151 /* SDL_stdinc.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8AC2933074900816151 /* SDL_stdinc.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F3F7D8F52933074E00816151 /* SDL_stdinc.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F7D8AC2933074900816151 /* SDL_stdinc.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -576,8 +556,12 @@
 		0000035D38C3899C7EFD0000 /* SDL_camera.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_camera.c; sourceTree = "<group>"; };
 		0000035D38C3899C7EFD0000 /* SDL_camera.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_camera.c; sourceTree = "<group>"; };
 		00002B010DB1A70931C20000 /* SDL_filesystem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_filesystem.c; sourceTree = "<group>"; };
 		00002B010DB1A70931C20000 /* SDL_filesystem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_filesystem.c; sourceTree = "<group>"; };
 		00002F2F5496FA184A0F0000 /* SDL_cocoapen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_cocoapen.h; sourceTree = "<group>"; };
 		00002F2F5496FA184A0F0000 /* SDL_cocoapen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_cocoapen.h; sourceTree = "<group>"; };
+		000030DD21496B5C0F210000 /* SDL_asyncio_windows_ioring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_asyncio_windows_ioring.c; sourceTree = "<group>"; };
 		00003260407E1002EAC10000 /* SDL_main_callbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_main_callbacks.h; sourceTree = "<group>"; };
 		00003260407E1002EAC10000 /* SDL_main_callbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_main_callbacks.h; sourceTree = "<group>"; };
+		00003928A612EC33D42C0000 /* SDL_asyncio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_asyncio.c; sourceTree = "<group>"; };
 		00003F472C51CE7DF6160000 /* SDL_systime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_systime.c; sourceTree = "<group>"; };
 		00003F472C51CE7DF6160000 /* SDL_systime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_systime.c; sourceTree = "<group>"; };
+		00004945A946DF5B1AED0000 /* SDL_asyncio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_asyncio.h; path = SDL3/SDL_asyncio.h; sourceTree = "<group>"; };
+		0000585B2CAB450B40540000 /* SDL_sysasyncio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_sysasyncio.h; sourceTree = "<group>"; };
 		00005BD74B46358B33A20000 /* SDL_camera_dummy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_camera_dummy.c; sourceTree = "<group>"; };
 		00005BD74B46358B33A20000 /* SDL_camera_dummy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_camera_dummy.c; sourceTree = "<group>"; };
 		00005D3EB902478835E20000 /* SDL_syscamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_syscamera.h; sourceTree = "<group>"; };
 		00005D3EB902478835E20000 /* SDL_syscamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_syscamera.h; sourceTree = "<group>"; };
 		0000641A9BAC11AB3FBE0000 /* SDL_time.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_time.c; sourceTree = "<group>"; };
 		0000641A9BAC11AB3FBE0000 /* SDL_time.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_time.c; sourceTree = "<group>"; };
@@ -585,12 +569,14 @@
 		000084ED0A56E3ED52F90000 /* SDL_camera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_camera.h; path = SDL3/SDL_camera.h; sourceTree = "<group>"; };
 		000084ED0A56E3ED52F90000 /* SDL_camera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_camera.h; path = SDL3/SDL_camera.h; sourceTree = "<group>"; };
 		00008B79BF08CBCEAC460000 /* SDL_camera_coremedia.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_camera_coremedia.m; sourceTree = "<group>"; };
 		00008B79BF08CBCEAC460000 /* SDL_camera_coremedia.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_camera_coremedia.m; sourceTree = "<group>"; };
 		00009003C7148E1126CA0000 /* SDL_camera_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_camera_c.h; sourceTree = "<group>"; };
 		00009003C7148E1126CA0000 /* SDL_camera_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_camera_c.h; sourceTree = "<group>"; };
+		0000919399B1A908267F0000 /* SDL_asyncio_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_asyncio_c.h; sourceTree = "<group>"; };
 		00009366FB9FBBD54C390000 /* SDL_main_callbacks.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_main_callbacks.c; sourceTree = "<group>"; };
 		00009366FB9FBBD54C390000 /* SDL_main_callbacks.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_main_callbacks.c; sourceTree = "<group>"; };
 		0000B6ADCD88CAD6610F0000 /* SDL_hashtable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_hashtable.h; sourceTree = "<group>"; };
 		0000B6ADCD88CAD6610F0000 /* SDL_hashtable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_hashtable.h; sourceTree = "<group>"; };
 		0000BB287BA0A0178C1A0000 /* SDL_sysmain_callbacks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_sysmain_callbacks.m; sourceTree = "<group>"; };
 		0000BB287BA0A0178C1A0000 /* SDL_sysmain_callbacks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_sysmain_callbacks.m; sourceTree = "<group>"; };
 		0000CCA310B73A7B59910000 /* SDL_cocoapen.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoapen.m; sourceTree = "<group>"; };
 		0000CCA310B73A7B59910000 /* SDL_cocoapen.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoapen.m; sourceTree = "<group>"; };
 		0000F4E6AA3EF99DA3C80000 /* SDL_sysfsops.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_sysfsops.c; sourceTree = "<group>"; };
 		0000F4E6AA3EF99DA3C80000 /* SDL_sysfsops.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_sysfsops.c; sourceTree = "<group>"; };
 		0000F6C6A072ED4E3D660000 /* SDL_dialog_utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_dialog_utils.c; sourceTree = "<group>"; };
 		0000F6C6A072ED4E3D660000 /* SDL_dialog_utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_dialog_utils.c; sourceTree = "<group>"; };
+		0000FB02CDE4BE34A87E0000 /* SDL_asyncio_generic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_asyncio_generic.c; sourceTree = "<group>"; };
 		0073179D0858DECD00B2BC32 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
 		0073179D0858DECD00B2BC32 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
 		0073179F0858DECD00B2BC32 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
 		0073179F0858DECD00B2BC32 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
 		007317C10858E15000B2BC32 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
 		007317C10858E15000B2BC32 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
@@ -798,8 +784,6 @@
 		A7D8A78823E2513E00DCD162 /* SDL_sysmutex_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_sysmutex_c.h; sourceTree = "<group>"; };
 		A7D8A78823E2513E00DCD162 /* SDL_sysmutex_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_sysmutex_c.h; sourceTree = "<group>"; };
 		A7D8A79E23E2513E00DCD162 /* SDL_gamepad_db.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_gamepad_db.h; sourceTree = "<group>"; };
 		A7D8A79E23E2513E00DCD162 /* SDL_gamepad_db.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_gamepad_db.h; sourceTree = "<group>"; };
 		A7D8A7A023E2513E00DCD162 /* SDL_sysjoystick.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_sysjoystick.c; sourceTree = "<group>"; };
 		A7D8A7A023E2513E00DCD162 /* SDL_sysjoystick.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_sysjoystick.c; sourceTree = "<group>"; };
-		A7D8A7A523E2513E00DCD162 /* SDL_steamcontroller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_steamcontroller.h; sourceTree = "<group>"; };
-		A7D8A7A723E2513E00DCD162 /* SDL_steamcontroller.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_steamcontroller.c; sourceTree = "<group>"; };
 		A7D8A7A923E2513E00DCD162 /* SDL_joystick.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_joystick.c; sourceTree = "<group>"; };
 		A7D8A7A923E2513E00DCD162 /* SDL_joystick.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_joystick.c; sourceTree = "<group>"; };
 		A7D8A7AD23E2513E00DCD162 /* SDL_gamepad.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_gamepad.c; sourceTree = "<group>"; };
 		A7D8A7AD23E2513E00DCD162 /* SDL_gamepad.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_gamepad.c; sourceTree = "<group>"; };
 		A7D8A7C223E2513E00DCD162 /* SDL_hidapi_xbox360.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_hidapi_xbox360.c; sourceTree = "<group>"; };
 		A7D8A7C223E2513E00DCD162 /* SDL_hidapi_xbox360.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_hidapi_xbox360.c; sourceTree = "<group>"; };
@@ -885,28 +869,6 @@
 		A7D8A90E23E2514000DCD162 /* SDL_glfuncs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_glfuncs.h; sourceTree = "<group>"; };
 		A7D8A90E23E2514000DCD162 /* SDL_glfuncs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_glfuncs.h; sourceTree = "<group>"; };
 		A7D8A90F23E2514000DCD162 /* SDL_render_gl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_render_gl.c; sourceTree = "<group>"; };
 		A7D8A90F23E2514000DCD162 /* SDL_render_gl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_render_gl.c; sourceTree = "<group>"; };
 		A7D8A91023E2514000DCD162 /* SDL_shaders_gl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_shaders_gl.c; sourceTree = "<group>"; };
 		A7D8A91023E2514000DCD162 /* SDL_shaders_gl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_shaders_gl.c; sourceTree = "<group>"; };
-		A7D8A91223E2514000DCD162 /* s_sin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s_sin.c; sourceTree = "<group>"; };
-		A7D8A91323E2514000DCD162 /* s_cos.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s_cos.c; sourceTree = "<group>"; };
-		A7D8A91423E2514000DCD162 /* s_copysign.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s_copysign.c; sourceTree = "<group>"; };
-		A7D8A91523E2514000DCD162 /* s_fabs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s_fabs.c; sourceTree = "<group>"; };
-		A7D8A91623E2514000DCD162 /* k_rem_pio2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = k_rem_pio2.c; sourceTree = "<group>"; };
-		A7D8A91723E2514000DCD162 /* k_sin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = k_sin.c; sourceTree = "<group>"; };
-		A7D8A91823E2514000DCD162 /* s_atan.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s_atan.c; sourceTree = "<group>"; };
-		A7D8A91923E2514000DCD162 /* k_cos.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = k_cos.c; sourceTree = "<group>"; };
-		A7D8A91A23E2514000DCD162 /* s_scalbn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s_scalbn.c; sourceTree = "<group>"; };
-		A7D8A91B23E2514000DCD162 /* math_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = math_private.h; sourceTree = "<group>"; };
-		A7D8A91C23E2514000DCD162 /* e_pow.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = e_pow.c; sourceTree = "<group>"; };
-		A7D8A91D23E2514000DCD162 /* e_atan2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = e_atan2.c; sourceTree = "<group>"; };
-		A7D8A91E23E2514000DCD162 /* s_tan.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s_tan.c; sourceTree = "<group>"; };
-		A7D8A91F23E2514000DCD162 /* e_rem_pio2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = e_rem_pio2.c; sourceTree = "<group>"; };
-		A7D8A92023E2514000DCD162 /* e_fmod.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = e_fmod.c; sourceTree = "<group>"; };
-		A7D8A92123E2514000DCD162 /* e_exp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = e_exp.c; sourceTree = "<group>"; };
-		A7D8A92223E2514000DCD162 /* e_log10.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = e_log10.c; sourceTree = "<group>"; };
-		A7D8A92323E2514000DCD162 /* e_log.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = e_log.c; sourceTree = "<group>"; };
-		A7D8A92423E2514000DCD162 /* e_sqrt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = e_sqrt.c; sourceTree = "<group>"; };
-		A7D8A92523E2514000DCD162 /* s_floor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s_floor.c; sourceTree = "<group>"; };
-		A7D8A92623E2514000DCD162 /* math_libm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = math_libm.h; sourceTree = "<group>"; };
-		A7D8A92723E2514000DCD162 /* k_tan.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = k_tan.c; sourceTree = "<group>"; };
 		A7D8A92A23E2514000DCD162 /* SDL_mouse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_mouse.c; sourceTree = "<group>"; };
 		A7D8A92A23E2514000DCD162 /* SDL_mouse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_mouse.c; sourceTree = "<group>"; };
 		A7D8A92B23E2514000DCD162 /* SDL_mouse_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_mouse_c.h; sourceTree = "<group>"; };
 		A7D8A92B23E2514000DCD162 /* SDL_mouse_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_mouse_c.h; sourceTree = "<group>"; };
 		A7D8A92C23E2514000DCD162 /* scancodes_windows.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scancodes_windows.h; sourceTree = "<group>"; };
 		A7D8A92C23E2514000DCD162 /* scancodes_windows.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scancodes_windows.h; sourceTree = "<group>"; };
@@ -967,6 +929,8 @@
 		F32DDACB2AB795A30041EAA5 /* SDL_audioqueue.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_audioqueue.c; sourceTree = "<group>"; };
 		F32DDACB2AB795A30041EAA5 /* SDL_audioqueue.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_audioqueue.c; sourceTree = "<group>"; };
 		F32DDACD2AB795A30041EAA5 /* SDL_audioqueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_audioqueue.h; sourceTree = "<group>"; };
 		F32DDACD2AB795A30041EAA5 /* SDL_audioqueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_audioqueue.h; sourceTree = "<group>"; };
 		F32DDACE2AB795A30041EAA5 /* SDL_audioresample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_audioresample.c; sourceTree = "<group>"; };
 		F32DDACE2AB795A30041EAA5 /* SDL_audioresample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_audioresample.c; sourceTree = "<group>"; };
+		F338A1172D1B37D8007CDFDF /* SDL_tray.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDL_tray.m; sourceTree = "<group>"; };
+		F338A1192D1B37E4007CDFDF /* SDL_tray.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = SDL_tray.c; sourceTree = "<group>"; };
 		F362B9152B3349E200D30B94 /* controller_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = controller_list.h; sourceTree = "<group>"; };
 		F362B9152B3349E200D30B94 /* controller_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = controller_list.h; sourceTree = "<group>"; };
 		F362B9162B3349E200D30B94 /* SDL_gamepad_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_gamepad_c.h; sourceTree = "<group>"; };
 		F362B9162B3349E200D30B94 /* SDL_gamepad_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_gamepad_c.h; sourceTree = "<group>"; };
 		F362B9172B3349E200D30B94 /* SDL_steam_virtual_gamepad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_steam_virtual_gamepad.h; sourceTree = "<group>"; };
 		F362B9172B3349E200D30B94 /* SDL_steam_virtual_gamepad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_steam_virtual_gamepad.h; sourceTree = "<group>"; };
@@ -1044,11 +1008,9 @@
 		F3E5A6EA2AD5E0E600293D83 /* SDL_properties.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_properties.c; sourceTree = "<group>"; };
 		F3E5A6EA2AD5E0E600293D83 /* SDL_properties.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_properties.c; sourceTree = "<group>"; };
 		F3E5A6EC2AD5E10800293D83 /* SDL_properties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_properties.h; path = SDL3/SDL_properties.h; sourceTree = "<group>"; };
 		F3E5A6EC2AD5E10800293D83 /* SDL_properties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_properties.h; path = SDL3/SDL_properties.h; sourceTree = "<group>"; };
 		F3F07D59269640160074468B /* SDL_hidapi_luna.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_hidapi_luna.c; sourceTree = "<group>"; };
 		F3F07D59269640160074468B /* SDL_hidapi_luna.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_hidapi_luna.c; sourceTree = "<group>"; };
-		F3F528C62C29E1C300E6CC26 /* s_isnanf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s_isnanf.c; sourceTree = "<group>"; };
-		F3F528C72C29E1C300E6CC26 /* s_isinf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s_isinf.c; sourceTree = "<group>"; };
-		F3F528C82C29E1C300E6CC26 /* s_isnan.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s_isnan.c; sourceTree = "<group>"; };
-		F3F528C92C29E1C300E6CC26 /* s_modf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s_modf.c; sourceTree = "<group>"; };
-		F3F528CA2C29E1C300E6CC26 /* s_isinff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s_isinff.c; sourceTree = "<group>"; };
+		F3F15D7C2D011912007AE210 /* SDL_dialog.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_dialog.h; sourceTree = "<group>"; };
+		F3F15D7D2D011912007AE210 /* SDL_dialog.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = SDL_dialog.c; sourceTree = "<group>"; };
+		F3F15D7E2D011912007AE210 /* SDL_dialog_utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_dialog_utils.h; sourceTree = "<group>"; };
 		F3F7BE3B2CBD79D200C984AF /* config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = config.xcconfig; sourceTree = "<group>"; };
 		F3F7BE3B2CBD79D200C984AF /* config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = config.xcconfig; sourceTree = "<group>"; };
 		F3F7D8AA2933074900816151 /* SDL_audio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_audio.h; path = SDL3/SDL_audio.h; sourceTree = "<group>"; };
 		F3F7D8AA2933074900816151 /* SDL_audio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_audio.h; path = SDL3/SDL_audio.h; sourceTree = "<group>"; };
 		F3F7D8AB2933074900816151 /* SDL_platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_platform.h; path = SDL3/SDL_platform.h; sourceTree = "<group>"; };
 		F3F7D8AB2933074900816151 /* SDL_platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDL_platform.h; path = SDL3/SDL_platform.h; sourceTree = "<group>"; };
@@ -1158,6 +1120,14 @@
 			path = unix;
 			path = unix;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		000013C0F2EADC24ADC10000 /* generic */ = {
+			isa = PBXGroup;
+			children = (
+				0000FB02CDE4BE34A87E0000 /* SDL_asyncio_generic.c */,
+			);
+			path = generic;
+			sourceTree = "<group>";
+		};
 		000023E01FD84242AF850000 /* dummy */ = {
 		000023E01FD84242AF850000 /* dummy */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -1186,6 +1156,14 @@
 			path = posix;
 			path = posix;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		000064F9A2AAE947C1CD0000 /* windows */ = {
+			isa = PBXGroup;
+			children = (
+				000030DD21496B5C0F210000 /* SDL_asyncio_windows_ioring.c */,
+			);
+			path = windows;
+			sourceTree = "<group>";
+		};
 		000082EF09C89B62BD840000 /* main */ = {
 		000082EF09C89B62BD840000 /* main */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -1227,7 +1205,9 @@
 		0153844A006D81B07F000001 /* Public Headers */ = {
 		0153844A006D81B07F000001 /* Public Headers */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
+				F3F7D8CF2933074C00816151 /* SDL.h */,
 				F3F7D8E02933074D00816151 /* SDL_assert.h */,
 				F3F7D8E02933074D00816151 /* SDL_assert.h */,
+				00004945A946DF5B1AED0000 /* SDL_asyncio.h */,
 				F3F7D8B92933074A00816151 /* SDL_atomic.h */,
 				F3F7D8B92933074A00816151 /* SDL_atomic.h */,
 				F3F7D8AA2933074900816151 /* SDL_audio.h */,
 				F3F7D8AA2933074900816151 /* SDL_audio.h */,
 				F3F7D8E72933074E00816151 /* SDL_begin_code.h */,
 				F3F7D8E72933074E00816151 /* SDL_begin_code.h */,
@@ -1259,26 +1239,26 @@
 				F3F7D8D92933074C00816151 /* SDL_loadso.h */,
 				F3F7D8D92933074C00816151 /* SDL_loadso.h */,
 				F3F7D8C42933074B00816151 /* SDL_locale.h */,
 				F3F7D8C42933074B00816151 /* SDL_locale.h */,
 				F3F7D8B72933074A00816151 /* SDL_log.h */,
 				F3F7D8B72933074A00816151 /* SDL_log.h */,
-				F3B38CCA296E2E52005DA6D3 /* SDL_main_impl.h */,
 				F3F7D8B02933074900816151 /* SDL_main.h */,
 				F3F7D8B02933074900816151 /* SDL_main.h */,
+				F3B38CCA296E2E52005DA6D3 /* SDL_main_impl.h */,
 				F3F7D8B62933074A00816151 /* SDL_messagebox.h */,
 				F3F7D8B62933074A00816151 /* SDL_messagebox.h */,
 				F3F7D8D22933074C00816151 /* SDL_metal.h */,
 				F3F7D8D22933074C00816151 /* SDL_metal.h */,
 				F3F7D8D52933074C00816151 /* SDL_misc.h */,
 				F3F7D8D52933074C00816151 /* SDL_misc.h */,
 				F3F7D8DA2933074D00816151 /* SDL_mouse.h */,
 				F3F7D8DA2933074D00816151 /* SDL_mouse.h */,
 				F3F7D8E62933074E00816151 /* SDL_mutex.h */,
 				F3F7D8E62933074E00816151 /* SDL_mutex.h */,
 				F3B38CCD296E2E52005DA6D3 /* SDL_oldnames.h */,
 				F3B38CCD296E2E52005DA6D3 /* SDL_oldnames.h */,
-				F3F7D8C02933074A00816151 /* SDL_opengl_glext.h */,
 				F3F7D8E12933074D00816151 /* SDL_opengl.h */,
 				F3F7D8E12933074D00816151 /* SDL_opengl.h */,
+				F3F7D8C02933074A00816151 /* SDL_opengl_glext.h */,
 				F3F7D8C62933074B00816151 /* SDL_opengles.h */,
 				F3F7D8C62933074B00816151 /* SDL_opengles.h */,
+				F3F7D8C72933074B00816151 /* SDL_opengles2.h */,
 				F3F7D8AE2933074900816151 /* SDL_opengles2_gl2.h */,
 				F3F7D8AE2933074900816151 /* SDL_opengles2_gl2.h */,
 				F3F7D8BD2933074A00816151 /* SDL_opengles2_gl2ext.h */,
 				F3F7D8BD2933074A00816151 /* SDL_opengles2_gl2ext.h */,
 				F3F7D8C92933074B00816151 /* SDL_opengles2_gl2platform.h */,
 				F3F7D8C92933074B00816151 /* SDL_opengles2_gl2platform.h */,
 				F3F7D8B12933074900816151 /* SDL_opengles2_khrplatform.h */,
 				F3F7D8B12933074900816151 /* SDL_opengles2_khrplatform.h */,
-				F3F7D8C72933074B00816151 /* SDL_opengles2.h */,
 				63134A212A7902CF0021E9A6 /* SDL_pen.h */,
 				63134A212A7902CF0021E9A6 /* SDL_pen.h */,
 				F3F7D8B52933074A00816151 /* SDL_pixels.h */,
 				F3F7D8B52933074A00816151 /* SDL_pixels.h */,
-				F3B38CCB296E2E52005DA6D3 /* SDL_platform_defines.h */,
 				F3F7D8AB2933074900816151 /* SDL_platform.h */,
 				F3F7D8AB2933074900816151 /* SDL_platform.h */,
+				F3B38CCB296E2E52005DA6D3 /* SDL_platform_defines.h */,
 				F3F7D8DB2933074D00816151 /* SDL_power.h */,
 				F3F7D8DB2933074D00816151 /* SDL_power.h */,
 				F3B439472C93595900792030 /* SDL_process.h */,
 				F3B439472C93595900792030 /* SDL_process.h */,
 				F3E5A6EC2AD5E10800293D83 /* SDL_properties.h */,
 				F3E5A6EC2AD5E10800293D83 /* SDL_properties.h */,
@@ -1298,7 +1278,6 @@
 				F3F7D8E42933074D00816151 /* SDL_version.h */,
 				F3F7D8E42933074D00816151 /* SDL_version.h */,
 				F3F7D8C52933074B00816151 /* SDL_video.h */,
 				F3F7D8C52933074B00816151 /* SDL_video.h */,
 				F3F7D8D42933074C00816151 /* SDL_vulkan.h */,
 				F3F7D8D42933074C00816151 /* SDL_vulkan.h */,
-				F3F7D8CF2933074C00816151 /* SDL.h */,
 			);
 			);
 			name = "Public Headers";
 			name = "Public Headers";
 			path = ../../include;
 			path = ../../include;
@@ -1349,7 +1328,6 @@
 				A7D8A5C223E2513D00DCD162 /* haptic */,
 				A7D8A5C223E2513D00DCD162 /* haptic */,
 				A7D8A80923E2513F00DCD162 /* hidapi */,
 				A7D8A80923E2513F00DCD162 /* hidapi */,
 				A7D8A79D23E2513E00DCD162 /* joystick */,
 				A7D8A79D23E2513E00DCD162 /* joystick */,
-				A7D8A91123E2514000DCD162 /* libm */,
 				A7D8A85D23E2513F00DCD162 /* loadso */,
 				A7D8A85D23E2513F00DCD162 /* loadso */,
 				566E26CB246274AE00718109 /* locale */,
 				566E26CB246274AE00718109 /* locale */,
 				000082EF09C89B62BD840000 /* main */,
 				000082EF09C89B62BD840000 /* main */,
@@ -1363,25 +1341,26 @@
 				A7D8A77623E2513E00DCD162 /* thread */,
 				A7D8A77623E2513E00DCD162 /* thread */,
 				0000F5E7419220E3A8AB0000 /* time */,
 				0000F5E7419220E3A8AB0000 /* time */,
 				A7D8A5DE23E2513D00DCD162 /* timer */,
 				A7D8A5DE23E2513D00DCD162 /* timer */,
+				F338A1142D1B3735007CDFDF /* tray */,
 				A7D8A5EB23E2513D00DCD162 /* video */,
 				A7D8A5EB23E2513D00DCD162 /* video */,
-				A7D8A7F523E2513F00DCD162 /* SDL_assert_c.h */,
+				A7D8A57123E2513D00DCD162 /* SDL.c */,
 				A7D8A94423E2514000DCD162 /* SDL_assert.c */,
 				A7D8A94423E2514000DCD162 /* SDL_assert.c */,
-				A7D8A57523E2513D00DCD162 /* SDL_error_c.h */,
+				A7D8A7F523E2513F00DCD162 /* SDL_assert_c.h */,
 				A7D8A8BF23E2513F00DCD162 /* SDL_error.c */,
 				A7D8A8BF23E2513F00DCD162 /* SDL_error.c */,
+				A7D8A57523E2513D00DCD162 /* SDL_error_c.h */,
 				F382071C284F362F004DD584 /* SDL_guid.c */,
 				F382071C284F362F004DD584 /* SDL_guid.c */,
-				000078E1881E857EBB6C0000 /* SDL_hashtable.c */,
 				0000B6ADCD88CAD6610F0000 /* SDL_hashtable.h */,
 				0000B6ADCD88CAD6610F0000 /* SDL_hashtable.h */,
-				A7D8A8D123E2514000DCD162 /* SDL_hints_c.h */,
+				000078E1881E857EBB6C0000 /* SDL_hashtable.c */,
 				A7D8A5AB23E2513D00DCD162 /* SDL_hints.c */,
 				A7D8A5AB23E2513D00DCD162 /* SDL_hints.c */,
+				A7D8A8D123E2514000DCD162 /* SDL_hints_c.h */,
 				A7D8A58323E2513D00DCD162 /* SDL_internal.h */,
 				A7D8A58323E2513D00DCD162 /* SDL_internal.h */,
-				A1BB8B6127F6CF320057CFA8 /* SDL_list.c */,
 				A1BB8B6227F6CF330057CFA8 /* SDL_list.h */,
 				A1BB8B6227F6CF330057CFA8 /* SDL_list.h */,
-				F386F6E42884663E001840AA /* SDL_log_c.h */,
+				A1BB8B6127F6CF320057CFA8 /* SDL_list.c */,
 				A7D8A5DD23E2513D00DCD162 /* SDL_log.c */,
 				A7D8A5DD23E2513D00DCD162 /* SDL_log.c */,
+				F386F6E42884663E001840AA /* SDL_log_c.h */,
 				F3E5A6EA2AD5E0E600293D83 /* SDL_properties.c */,
 				F3E5A6EA2AD5E0E600293D83 /* SDL_properties.c */,
-				F386F6E52884663E001840AA /* SDL_utils_c.h */,
 				F386F6E62884663E001840AA /* SDL_utils.c */,
 				F386F6E62884663E001840AA /* SDL_utils.c */,
-				A7D8A57123E2513D00DCD162 /* SDL.c */,
+				F386F6E52884663E001840AA /* SDL_utils_c.h */,
 			);
 			);
 			name = "Library Source";
 			name = "Library Source";
 			path = ../../src;
 			path = ../../src;
@@ -1857,7 +1836,6 @@
 				A7D8A7CC23E2513E00DCD162 /* darwin */,
 				A7D8A7CC23E2513E00DCD162 /* darwin */,
 				A7D8A79F23E2513E00DCD162 /* dummy */,
 				A7D8A79F23E2513E00DCD162 /* dummy */,
 				A7D8A7BE23E2513E00DCD162 /* hidapi */,
 				A7D8A7BE23E2513E00DCD162 /* hidapi */,
-				A7D8A7A123E2513E00DCD162 /* steam */,
 				75E09157241EA924004729E1 /* virtual */,
 				75E09157241EA924004729E1 /* virtual */,
 				F362B9152B3349E200D30B94 /* controller_list.h */,
 				F362B9152B3349E200D30B94 /* controller_list.h */,
 				F3820712284F3609004DD584 /* controller_type.c */,
 				F3820712284F3609004DD584 /* controller_type.c */,
@@ -1883,15 +1861,6 @@
 			path = dummy;
 			path = dummy;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
-		A7D8A7A123E2513E00DCD162 /* steam */ = {
-			isa = PBXGroup;
-			children = (
-				A7D8A7A723E2513E00DCD162 /* SDL_steamcontroller.c */,
-				A7D8A7A523E2513E00DCD162 /* SDL_steamcontroller.h */,
-			);
-			path = steam;
-			sourceTree = "<group>";
-		};
 		A7D8A7AA23E2513E00DCD162 /* apple */ = {
 		A7D8A7AA23E2513E00DCD162 /* apple */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -1942,6 +1911,11 @@
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
 				A7D8A7DB23E2513F00DCD162 /* SDL_iostream.c */,
 				A7D8A7DB23E2513F00DCD162 /* SDL_iostream.c */,
+				00003928A612EC33D42C0000 /* SDL_asyncio.c */,
+				0000919399B1A908267F0000 /* SDL_asyncio_c.h */,
+				0000585B2CAB450B40540000 /* SDL_sysasyncio.h */,
+				000013C0F2EADC24ADC10000 /* generic */,
+				000064F9A2AAE947C1CD0000 /* windows */,
 			);
 			);
 			path = file;
 			path = file;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -2199,40 +2173,6 @@
 			path = opengl;
 			path = opengl;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
-		A7D8A91123E2514000DCD162 /* libm */ = {
-			isa = PBXGroup;
-			children = (
-				A7D8A91D23E2514000DCD162 /* e_atan2.c */,
-				A7D8A92123E2514000DCD162 /* e_exp.c */,
-				A7D8A92023E2514000DCD162 /* e_fmod.c */,
-				A7D8A92323E2514000DCD162 /* e_log.c */,
-				A7D8A92223E2514000DCD162 /* e_log10.c */,
-				A7D8A91C23E2514000DCD162 /* e_pow.c */,
-				A7D8A91F23E2514000DCD162 /* e_rem_pio2.c */,
-				A7D8A92423E2514000DCD162 /* e_sqrt.c */,
-				A7D8A91923E2514000DCD162 /* k_cos.c */,
-				A7D8A91623E2514000DCD162 /* k_rem_pio2.c */,
-				A7D8A91723E2514000DCD162 /* k_sin.c */,
-				A7D8A92723E2514000DCD162 /* k_tan.c */,
-				A7D8A92623E2514000DCD162 /* math_libm.h */,
-				A7D8A91B23E2514000DCD162 /* math_private.h */,
-				A7D8A91823E2514000DCD162 /* s_atan.c */,
-				A7D8A91423E2514000DCD162 /* s_copysign.c */,
-				A7D8A91323E2514000DCD162 /* s_cos.c */,
-				A7D8A91523E2514000DCD162 /* s_fabs.c */,
-				A7D8A92523E2514000DCD162 /* s_floor.c */,
-				F3F528C72C29E1C300E6CC26 /* s_isinf.c */,
-				F3F528CA2C29E1C300E6CC26 /* s_isinff.c */,
-				F3F528C82C29E1C300E6CC26 /* s_isnan.c */,
-				F3F528C62C29E1C300E6CC26 /* s_isnanf.c */,
-				F3F528C92C29E1C300E6CC26 /* s_modf.c */,
-				A7D8A91A23E2514000DCD162 /* s_scalbn.c */,
-				A7D8A91223E2514000DCD162 /* s_sin.c */,
-				A7D8A91E23E2514000DCD162 /* s_tan.c */,
-			);
-			path = libm;
-			sourceTree = "<group>";
-		};
 		A7D8A92923E2514000DCD162 /* events */ = {
 		A7D8A92923E2514000DCD162 /* events */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -2333,6 +2273,31 @@
 			path = gpu;
 			path = gpu;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		F338A1142D1B3735007CDFDF /* tray */ = {
+			isa = PBXGroup;
+			children = (
+				F338A1162D1B378D007CDFDF /* cocoa */,
+				F338A1152D1B3786007CDFDF /* dummy */,
+			);
+			path = tray;
+			sourceTree = "<group>";
+		};
+		F338A1152D1B3786007CDFDF /* dummy */ = {
+			isa = PBXGroup;
+			children = (
+				F338A1192D1B37E4007CDFDF /* SDL_tray.c */,
+			);
+			path = dummy;
+			sourceTree = "<group>";
+		};
+		F338A1162D1B378D007CDFDF /* cocoa */ = {
+			isa = PBXGroup;
+			children = (
+				F338A1172D1B37D8007CDFDF /* SDL_tray.m */,
+			);
+			path = cocoa;
+			sourceTree = "<group>";
+		};
 		F36C7ACF294B9F5E004D61C3 /* core */ = {
 		F36C7ACF294B9F5E004D61C3 /* core */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -2346,6 +2311,9 @@
 			children = (
 			children = (
 				F37E18552BA50ED50098C111 /* cocoa */,
 				F37E18552BA50ED50098C111 /* cocoa */,
 				F37E18562BA50F2A0098C111 /* dummy */,
 				F37E18562BA50F2A0098C111 /* dummy */,
+				F3F15D7C2D011912007AE210 /* SDL_dialog.h */,
+				F3F15D7D2D011912007AE210 /* SDL_dialog.c */,
+				F3F15D7E2D011912007AE210 /* SDL_dialog_utils.h */,
 				0000F6C6A072ED4E3D660000 /* SDL_dialog_utils.c */,
 				0000F6C6A072ED4E3D660000 /* SDL_dialog_utils.c */,
 			);
 			);
 			path = dialog;
 			path = dialog;
@@ -2491,6 +2459,8 @@
 				A7D8B8A223E2514400DCD162 /* SDL_diskaudio.h in Headers */,
 				A7D8B8A223E2514400DCD162 /* SDL_diskaudio.h in Headers */,
 				F3B439482C93595900792030 /* SDL_process.h in Headers */,
 				F3B439482C93595900792030 /* SDL_process.h in Headers */,
 				A7D8BB3F23E2514500DCD162 /* SDL_displayevents_c.h in Headers */,
 				A7D8BB3F23E2514500DCD162 /* SDL_displayevents_c.h in Headers */,
+				F3F15D802D011912007AE210 /* SDL_dialog_utils.h in Headers */,
+				F3F15D812D011912007AE210 /* SDL_dialog.h in Headers */,
 				A7D8BA1923E2514400DCD162 /* SDL_draw.h in Headers */,
 				A7D8BA1923E2514400DCD162 /* SDL_draw.h in Headers */,
 				F3C2CB222C5DDDB2004D7998 /* SDL_categories_c.h in Headers */,
 				F3C2CB222C5DDDB2004D7998 /* SDL_categories_c.h in Headers */,
 				E479118E2BA9555500CE3B7F /* SDL_sysstorage.h in Headers */,
 				E479118E2BA9555500CE3B7F /* SDL_sysstorage.h in Headers */,
@@ -2560,6 +2530,7 @@
 				F31A92C828D4CB39003BFD6A /* SDL_offscreenopengles.h in Headers */,
 				F31A92C828D4CB39003BFD6A /* SDL_offscreenopengles.h in Headers */,
 				A7D8AB6D23E2514100DCD162 /* SDL_offscreenvideo.h in Headers */,
 				A7D8AB6D23E2514100DCD162 /* SDL_offscreenvideo.h in Headers */,
 				A7D8AB8523E2514100DCD162 /* SDL_offscreenwindow.h in Headers */,
 				A7D8AB8523E2514100DCD162 /* SDL_offscreenwindow.h in Headers */,
+				F35B79632D03A7B900C6D591 /* SDL_asyncio.h in Headers */,
 				F37E18642BAA40670098C111 /* SDL_time_c.h in Headers */,
 				F37E18642BAA40670098C111 /* SDL_time_c.h in Headers */,
 				F3B38CDB296E2E52005DA6D3 /* SDL_oldnames.h in Headers */,
 				F3B38CDB296E2E52005DA6D3 /* SDL_oldnames.h in Headers */,
 				F3F7D9C92933074E00816151 /* SDL_opengl.h in Headers */,
 				F3F7D9C92933074E00816151 /* SDL_opengl.h in Headers */,
@@ -2601,7 +2572,6 @@
 				F310138F2C1F2CB700FBE946 /* SDL_sysstdlib.h in Headers */,
 				F310138F2C1F2CB700FBE946 /* SDL_sysstdlib.h in Headers */,
 				F3F7D8F52933074E00816151 /* SDL_stdinc.h in Headers */,
 				F3F7D8F52933074E00816151 /* SDL_stdinc.h in Headers */,
 				F362B91B2B3349E200D30B94 /* SDL_steam_virtual_gamepad.h in Headers */,
 				F362B91B2B3349E200D30B94 /* SDL_steam_virtual_gamepad.h in Headers */,
-				A7D8BBC723E2561500DCD162 /* SDL_steamcontroller.h in Headers */,
 				F3F7D9312933074E00816151 /* SDL_surface.h in Headers */,
 				F3F7D9312933074E00816151 /* SDL_surface.h in Headers */,
 				A7D8B85A23E2514400DCD162 /* SDL_sysaudio.h in Headers */,
 				A7D8B85A23E2514400DCD162 /* SDL_sysaudio.h in Headers */,
 				A7D8AAD423E2514100DCD162 /* SDL_syshaptic.h in Headers */,
 				A7D8AAD423E2514100DCD162 /* SDL_syshaptic.h in Headers */,
@@ -2665,8 +2635,6 @@
 				A7D8B23023E2514200DCD162 /* gl2platform.h in Headers */,
 				A7D8B23023E2514200DCD162 /* gl2platform.h in Headers */,
 				A75FDB5823E39E6100529352 /* hidapi.h in Headers */,
 				A75FDB5823E39E6100529352 /* hidapi.h in Headers */,
 				A7D8B23623E2514200DCD162 /* khrplatform.h in Headers */,
 				A7D8B23623E2514200DCD162 /* khrplatform.h in Headers */,
-				A7D8BB0323E2514500DCD162 /* math_libm.h in Headers */,
-				A7D8BAC123E2514500DCD162 /* math_private.h in Headers */,
 				A7D8BB5123E2514500DCD162 /* scancodes_darwin.h in Headers */,
 				A7D8BB5123E2514500DCD162 /* scancodes_darwin.h in Headers */,
 				A7D8BB5D23E2514500DCD162 /* scancodes_linux.h in Headers */,
 				A7D8BB5D23E2514500DCD162 /* scancodes_linux.h in Headers */,
 				A7D8BB2123E2514500DCD162 /* scancodes_windows.h in Headers */,
 				A7D8BB2123E2514500DCD162 /* scancodes_windows.h in Headers */,
@@ -2825,7 +2793,6 @@
 				A7D8B9E323E2514400DCD162 /* SDL_drawline.c in Sources */,
 				A7D8B9E323E2514400DCD162 /* SDL_drawline.c in Sources */,
 				A7D8AE7C23E2514100DCD162 /* SDL_yuv.c in Sources */,
 				A7D8AE7C23E2514100DCD162 /* SDL_yuv.c in Sources */,
 				A7D8B62F23E2514300DCD162 /* SDL_sysfilesystem.m in Sources */,
 				A7D8B62F23E2514300DCD162 /* SDL_sysfilesystem.m in Sources */,
-				A7D8BAC723E2514500DCD162 /* e_pow.c in Sources */,
 				A7D8B41C23E2514300DCD162 /* SDL_systls.c in Sources */,
 				A7D8B41C23E2514300DCD162 /* SDL_systls.c in Sources */,
 				9846B07C287A9020000C35C8 /* SDL_hidapi_shield.c in Sources */,
 				9846B07C287A9020000C35C8 /* SDL_hidapi_shield.c in Sources */,
 				F31013C72C24E98200FBE946 /* SDL_keymap.c in Sources */,
 				F31013C72C24E98200FBE946 /* SDL_keymap.c in Sources */,
@@ -2837,7 +2804,6 @@
 				F36C34322C0F876500991150 /* SDL_offscreenvulkan.c in Sources */,
 				F36C34322C0F876500991150 /* SDL_offscreenvulkan.c in Sources */,
 				A7D8A95123E2514000DCD162 /* SDL_spinlock.c in Sources */,
 				A7D8A95123E2514000DCD162 /* SDL_spinlock.c in Sources */,
 				F34B9895291DEFF500AAC96E /* SDL_hidapi_steam.c in Sources */,
 				F34B9895291DEFF500AAC96E /* SDL_hidapi_steam.c in Sources */,
-				A7D8BAAF23E2514400DCD162 /* s_atan.c in Sources */,
 				A7D8B75223E2514300DCD162 /* SDL_sysloadso.c in Sources */,
 				A7D8B75223E2514300DCD162 /* SDL_sysloadso.c in Sources */,
 				A7D8BBE123E2574800DCD162 /* SDL_uikitopenglview.m in Sources */,
 				A7D8BBE123E2574800DCD162 /* SDL_uikitopenglview.m in Sources */,
 				A79745702B2E9D39009D224A /* SDL_hidapi_steamdeck.c in Sources */,
 				A79745702B2E9D39009D224A /* SDL_hidapi_steamdeck.c in Sources */,
@@ -2848,6 +2814,7 @@
 				A7D8B86623E2514400DCD162 /* SDL_audiocvt.c in Sources */,
 				A7D8B86623E2514400DCD162 /* SDL_audiocvt.c in Sources */,
 				A7D8B9F523E2514400DCD162 /* SDL_rotate.c in Sources */,
 				A7D8B9F523E2514400DCD162 /* SDL_rotate.c in Sources */,
 				A7D8BBE323E2574800DCD162 /* SDL_uikitvideo.m in Sources */,
 				A7D8BBE323E2574800DCD162 /* SDL_uikitvideo.m in Sources */,
+				F338A1182D1B37D8007CDFDF /* SDL_tray.m in Sources */,
 				5616CA4E252BB2A6005D5928 /* SDL_sysurl.m in Sources */,
 				5616CA4E252BB2A6005D5928 /* SDL_sysurl.m in Sources */,
 				F3B439562C937DAB00792030 /* SDL_process.c in Sources */,
 				F3B439562C937DAB00792030 /* SDL_process.c in Sources */,
 				A7D8A97523E2514000DCD162 /* SDL_coremotionsensor.m in Sources */,
 				A7D8A97523E2514000DCD162 /* SDL_coremotionsensor.m in Sources */,
@@ -2856,9 +2823,7 @@
 				F31A92D228D4CB39003BFD6A /* SDL_offscreenopengles.c in Sources */,
 				F31A92D228D4CB39003BFD6A /* SDL_offscreenopengles.c in Sources */,
 				A1626A3E2617006A003F1973 /* SDL_triangle.c in Sources */,
 				A1626A3E2617006A003F1973 /* SDL_triangle.c in Sources */,
 				A7D8B3F223E2514300DCD162 /* SDL_thread.c in Sources */,
 				A7D8B3F223E2514300DCD162 /* SDL_thread.c in Sources */,
-				F3F528CF2C29E1C300E6CC26 /* s_isinff.c in Sources */,
 				A7D8B55D23E2514300DCD162 /* SDL_hidapi_xbox360w.c in Sources */,
 				A7D8B55D23E2514300DCD162 /* SDL_hidapi_xbox360w.c in Sources */,
-				F3F528CB2C29E1C300E6CC26 /* s_isnanf.c in Sources */,
 				A7D8A95723E2514000DCD162 /* SDL_atomic.c in Sources */,
 				A7D8A95723E2514000DCD162 /* SDL_atomic.c in Sources */,
 				A75FDBCE23EA380300529352 /* SDL_hidapi_rumble.c in Sources */,
 				A75FDBCE23EA380300529352 /* SDL_hidapi_rumble.c in Sources */,
 				E4F257952C81903800FCEAFC /* SDL_gpu_vulkan.c in Sources */,
 				E4F257952C81903800FCEAFC /* SDL_gpu_vulkan.c in Sources */,
@@ -2869,7 +2834,6 @@
 				F37E18582BA50F3B0098C111 /* SDL_cocoadialog.m in Sources */,
 				F37E18582BA50F3B0098C111 /* SDL_cocoadialog.m in Sources */,
 				A7D8B43423E2514300DCD162 /* SDL_systhread.c in Sources */,
 				A7D8B43423E2514300DCD162 /* SDL_systhread.c in Sources */,
 				A7D8BB3323E2514500DCD162 /* SDL_windowevents.c in Sources */,
 				A7D8BB3323E2514500DCD162 /* SDL_windowevents.c in Sources */,
-				A7D8BABB23E2514400DCD162 /* s_scalbn.c in Sources */,
 				F3973FAB28A59BDD00B84553 /* SDL_crc16.c in Sources */,
 				F3973FAB28A59BDD00B84553 /* SDL_crc16.c in Sources */,
 				A7D8AB2B23E2514100DCD162 /* SDL_timer.c in Sources */,
 				A7D8AB2B23E2514100DCD162 /* SDL_timer.c in Sources */,
 				E4F257962C81903800FCEAFC /* SDL_gpu.c in Sources */,
 				E4F257962C81903800FCEAFC /* SDL_gpu.c in Sources */,
@@ -2889,6 +2853,7 @@
 				A7D8BA3723E2514400DCD162 /* SDL_d3dmath.c in Sources */,
 				A7D8BA3723E2514400DCD162 /* SDL_d3dmath.c in Sources */,
 				F3A9AE9C2C8A13C100AAC390 /* SDL_pipeline_gpu.c in Sources */,
 				F3A9AE9C2C8A13C100AAC390 /* SDL_pipeline_gpu.c in Sources */,
 				75E0915A241EA924004729E1 /* SDL_virtualjoystick.c in Sources */,
 				75E0915A241EA924004729E1 /* SDL_virtualjoystick.c in Sources */,
+				F338A11A2D1B37E4007CDFDF /* SDL_tray.c in Sources */,
 				A7D8ABEB23E2514100DCD162 /* SDL_nullvideo.c in Sources */,
 				A7D8ABEB23E2514100DCD162 /* SDL_nullvideo.c in Sources */,
 				F3990E072A78833C000D8759 /* hid.m in Sources */,
 				F3990E072A78833C000D8759 /* hid.m in Sources */,
 				A7D8AB6723E2514100DCD162 /* SDL_offscreenevents.c in Sources */,
 				A7D8AB6723E2514100DCD162 /* SDL_offscreenevents.c in Sources */,
@@ -2899,18 +2864,13 @@
 				A7D8BBE523E2574800DCD162 /* SDL_uikitview.m in Sources */,
 				A7D8BBE523E2574800DCD162 /* SDL_uikitview.m in Sources */,
 				A7D8BBE923E2574800DCD162 /* SDL_uikitvulkan.m in Sources */,
 				A7D8BBE923E2574800DCD162 /* SDL_uikitvulkan.m in Sources */,
 				A7D8ABCD23E2514100DCD162 /* SDL_blit_slow.c in Sources */,
 				A7D8ABCD23E2514100DCD162 /* SDL_blit_slow.c in Sources */,
-				A7D8BA9723E2514400DCD162 /* s_copysign.c in Sources */,
 				F3984CD025BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */,
 				F3984CD025BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */,
 				A7D8AAB623E2514100DCD162 /* SDL_haptic.c in Sources */,
 				A7D8AAB623E2514100DCD162 /* SDL_haptic.c in Sources */,
 				E4F257922C81903800FCEAFC /* Metal_Blit.metal in Sources */,
 				E4F257922C81903800FCEAFC /* Metal_Blit.metal in Sources */,
 				A7D8AF2423E2514100DCD162 /* SDL_cocoametalview.m in Sources */,
 				A7D8AF2423E2514100DCD162 /* SDL_cocoametalview.m in Sources */,
 				A7D8B86023E2514400DCD162 /* SDL_audiotypecvt.c in Sources */,
 				A7D8B86023E2514400DCD162 /* SDL_audiotypecvt.c in Sources */,
-				A7D8BBC523E2561500DCD162 /* SDL_steamcontroller.c in Sources */,
 				A7D8AD3223E2514100DCD162 /* SDL_blit_N.c in Sources */,
 				A7D8AD3223E2514100DCD162 /* SDL_blit_N.c in Sources */,
 				A7D8BB7B23E2514500DCD162 /* SDL_dropevents.c in Sources */,
 				A7D8BB7B23E2514500DCD162 /* SDL_dropevents.c in Sources */,
-				A7D8BACD23E2514500DCD162 /* e_atan2.c in Sources */,
-				A7D8BA8B23E2514400DCD162 /* s_sin.c in Sources */,
-				F3F528CE2C29E1C300E6CC26 /* s_modf.c in Sources */,
 				A7D8BBEB23E2574800DCD162 /* SDL_uikitwindow.m in Sources */,
 				A7D8BBEB23E2574800DCD162 /* SDL_uikitwindow.m in Sources */,
 				F3B439532C935C2C00792030 /* SDL_posixprocess.c in Sources */,
 				F3B439532C935C2C00792030 /* SDL_posixprocess.c in Sources */,
 				F395BF6525633B2400942BFF /* SDL_crc32.c in Sources */,
 				F395BF6525633B2400942BFF /* SDL_crc32.c in Sources */,
@@ -2918,7 +2878,6 @@
 				A7D8AED623E2514100DCD162 /* SDL_cocoakeyboard.m in Sources */,
 				A7D8AED623E2514100DCD162 /* SDL_cocoakeyboard.m in Sources */,
 				A7D8AB1623E2514100DCD162 /* SDL_dynapi.c in Sources */,
 				A7D8AB1623E2514100DCD162 /* SDL_dynapi.c in Sources */,
 				A7D8BA8523E2514400DCD162 /* SDL_shaders_gl.c in Sources */,
 				A7D8BA8523E2514400DCD162 /* SDL_shaders_gl.c in Sources */,
-				A7D8BAF123E2514500DCD162 /* e_log.c in Sources */,
 				A7D8AED023E2514100DCD162 /* SDL_cocoamessagebox.m in Sources */,
 				A7D8AED023E2514100DCD162 /* SDL_cocoamessagebox.m in Sources */,
 				F376F6552559B4E300CFC0BC /* SDL_hidapi.c in Sources */,
 				F376F6552559B4E300CFC0BC /* SDL_hidapi.c in Sources */,
 				A7D8BA2B23E2514400DCD162 /* SDL_blendfillrect.c in Sources */,
 				A7D8BA2B23E2514400DCD162 /* SDL_blendfillrect.c in Sources */,
@@ -2928,14 +2887,13 @@
 				A7D8B8E423E2514400DCD162 /* SDL_error.c in Sources */,
 				A7D8B8E423E2514400DCD162 /* SDL_error.c in Sources */,
 				A7D8AD6823E2514100DCD162 /* SDL_blit.c in Sources */,
 				A7D8AD6823E2514100DCD162 /* SDL_blit.c in Sources */,
 				A7D8B5BD23E2514300DCD162 /* SDL_iostream.c in Sources */,
 				A7D8B5BD23E2514300DCD162 /* SDL_iostream.c in Sources */,
-				A7D8BA9123E2514400DCD162 /* s_cos.c in Sources */,
 				A7D8B9D123E2514400DCD162 /* SDL_yuv_sw.c in Sources */,
 				A7D8B9D123E2514400DCD162 /* SDL_yuv_sw.c in Sources */,
 				A7D8B76A23E2514300DCD162 /* SDL_wave.c in Sources */,
 				A7D8B76A23E2514300DCD162 /* SDL_wave.c in Sources */,
 				5616CA4C252BB2A6005D5928 /* SDL_url.c in Sources */,
 				5616CA4C252BB2A6005D5928 /* SDL_url.c in Sources */,
-				A7D8BAD323E2514500DCD162 /* s_tan.c in Sources */,
 				F316ABDB2B5CA721002EF551 /* SDL_memmove.c in Sources */,
 				F316ABDB2B5CA721002EF551 /* SDL_memmove.c in Sources */,
 				A7D8AA6523E2514000DCD162 /* SDL_hints.c in Sources */,
 				A7D8AA6523E2514000DCD162 /* SDL_hints.c in Sources */,
 				A7D8B53F23E2514300DCD162 /* SDL_hidapi_ps4.c in Sources */,
 				A7D8B53F23E2514300DCD162 /* SDL_hidapi_ps4.c in Sources */,
+				F3F15D7F2D011912007AE210 /* SDL_dialog.c in Sources */,
 				F362B91C2B3349E200D30B94 /* SDL_steam_virtual_gamepad.c in Sources */,
 				F362B91C2B3349E200D30B94 /* SDL_steam_virtual_gamepad.c in Sources */,
 				A7D8AD6E23E2514100DCD162 /* SDL_pixels.c in Sources */,
 				A7D8AD6E23E2514100DCD162 /* SDL_pixels.c in Sources */,
 				A7D8B75E23E2514300DCD162 /* SDL_sysloadso.c in Sources */,
 				A7D8B75E23E2514300DCD162 /* SDL_sysloadso.c in Sources */,
@@ -2943,24 +2901,18 @@
 				A7D8B5F323E2514300DCD162 /* SDL_syspower.c in Sources */,
 				A7D8B5F323E2514300DCD162 /* SDL_syspower.c in Sources */,
 				A7D8B95023E2514400DCD162 /* SDL_iconv.c in Sources */,
 				A7D8B95023E2514400DCD162 /* SDL_iconv.c in Sources */,
 				F3E5A6EB2AD5E0E600293D83 /* SDL_properties.c in Sources */,
 				F3E5A6EB2AD5E0E600293D83 /* SDL_properties.c in Sources */,
-				A7D8BA9D23E2514400DCD162 /* s_fabs.c in Sources */,
-				F3F528CC2C29E1C300E6CC26 /* s_isinf.c in Sources */,
 				F395C1B12569C6A000942BFF /* SDL_mfijoystick.m in Sources */,
 				F395C1B12569C6A000942BFF /* SDL_mfijoystick.m in Sources */,
 				A7D8B99223E2514400DCD162 /* SDL_shaders_metal.metal in Sources */,
 				A7D8B99223E2514400DCD162 /* SDL_shaders_metal.metal in Sources */,
 				F3990DF52A787C10000D8759 /* SDL_sysurl.m in Sources */,
 				F3990DF52A787C10000D8759 /* SDL_sysurl.m in Sources */,
 				F316ABD92B5C3185002EF551 /* SDL_memcpy.c in Sources */,
 				F316ABD92B5C3185002EF551 /* SDL_memcpy.c in Sources */,
 				A7D8B97A23E2514400DCD162 /* SDL_render.c in Sources */,
 				A7D8B97A23E2514400DCD162 /* SDL_render.c in Sources */,
 				A7D8ABD323E2514100DCD162 /* SDL_stretch.c in Sources */,
 				A7D8ABD323E2514100DCD162 /* SDL_stretch.c in Sources */,
-				A7D8BAFD23E2514500DCD162 /* s_floor.c in Sources */,
 				A7D8AC3923E2514100DCD162 /* SDL_blit_copy.c in Sources */,
 				A7D8AC3923E2514100DCD162 /* SDL_blit_copy.c in Sources */,
-				A7D8BADF23E2514500DCD162 /* e_fmod.c in Sources */,
 				A7D8B5CF23E2514300DCD162 /* SDL_syspower.m in Sources */,
 				A7D8B5CF23E2514300DCD162 /* SDL_syspower.m in Sources */,
-				A7D8BAEB23E2514500DCD162 /* e_log10.c in Sources */,
 				F3B439512C935C2400792030 /* SDL_dummyprocess.c in Sources */,
 				F3B439512C935C2400792030 /* SDL_dummyprocess.c in Sources */,
 				A7D8B76423E2514300DCD162 /* SDL_mixer.c in Sources */,
 				A7D8B76423E2514300DCD162 /* SDL_mixer.c in Sources */,
 				A7D8BB5723E2514500DCD162 /* SDL_events.c in Sources */,
 				A7D8BB5723E2514500DCD162 /* SDL_events.c in Sources */,
 				A7D8ADE623E2514100DCD162 /* SDL_blit_0.c in Sources */,
 				A7D8ADE623E2514100DCD162 /* SDL_blit_0.c in Sources */,
-				A7D8BB0923E2514500DCD162 /* k_tan.c in Sources */,
 				A7D8B8A823E2514400DCD162 /* SDL_diskaudio.c in Sources */,
 				A7D8B8A823E2514400DCD162 /* SDL_diskaudio.c in Sources */,
 				56A2373329F9C113003CCA5F /* SDL_sysrwlock.c in Sources */,
 				56A2373329F9C113003CCA5F /* SDL_sysrwlock.c in Sources */,
 				F3A9AE9A2C8A13C100AAC390 /* SDL_shaders_gpu.c in Sources */,
 				F3A9AE9A2C8A13C100AAC390 /* SDL_shaders_gpu.c in Sources */,
@@ -2980,7 +2932,6 @@
 				A7D8B95C23E2514400DCD162 /* SDL_string.c in Sources */,
 				A7D8B95C23E2514400DCD162 /* SDL_string.c in Sources */,
 				A7D8BA7F23E2514400DCD162 /* SDL_render_gl.c in Sources */,
 				A7D8BA7F23E2514400DCD162 /* SDL_render_gl.c in Sources */,
 				A7D8AE9423E2514100DCD162 /* SDL_cocoamodes.m in Sources */,
 				A7D8AE9423E2514100DCD162 /* SDL_cocoamodes.m in Sources */,
-				A7D8BAA323E2514400DCD162 /* k_rem_pio2.c in Sources */,
 				A7D8B95623E2514400DCD162 /* SDL_getenv.c in Sources */,
 				A7D8B95623E2514400DCD162 /* SDL_getenv.c in Sources */,
 				A7D8B56323E2514300DCD162 /* SDL_hidapi_gamecube.c in Sources */,
 				A7D8B56323E2514300DCD162 /* SDL_hidapi_gamecube.c in Sources */,
 				A7D8B4DC23E2514300DCD162 /* SDL_joystick.c in Sources */,
 				A7D8B4DC23E2514300DCD162 /* SDL_joystick.c in Sources */,
@@ -3000,7 +2951,6 @@
 				A7D8BB7523E2514500DCD162 /* SDL_clipboardevents.c in Sources */,
 				A7D8BB7523E2514500DCD162 /* SDL_clipboardevents.c in Sources */,
 				E4F798202AD8D87F00669F54 /* SDL_video_unsupported.c in Sources */,
 				E4F798202AD8D87F00669F54 /* SDL_video_unsupported.c in Sources */,
 				A1BB8B6327F6CF330057CFA8 /* SDL_list.c in Sources */,
 				A1BB8B6327F6CF330057CFA8 /* SDL_list.c in Sources */,
-				A7D8BAB523E2514400DCD162 /* k_cos.c in Sources */,
 				A7D8B54523E2514300DCD162 /* SDL_hidapijoystick.c in Sources */,
 				A7D8B54523E2514300DCD162 /* SDL_hidapijoystick.c in Sources */,
 				A7D8B97423E2514400DCD162 /* SDL_malloc.c in Sources */,
 				A7D8B97423E2514400DCD162 /* SDL_malloc.c in Sources */,
 				A7D8B8C623E2514400DCD162 /* SDL_audio.c in Sources */,
 				A7D8B8C623E2514400DCD162 /* SDL_audio.c in Sources */,
@@ -3010,14 +2960,12 @@
 				A7D8AB8B23E2514100DCD162 /* SDL_offscreenvideo.c in Sources */,
 				A7D8AB8B23E2514100DCD162 /* SDL_offscreenvideo.c in Sources */,
 				A7D8B42E23E2514300DCD162 /* SDL_syscond.c in Sources */,
 				A7D8B42E23E2514300DCD162 /* SDL_syscond.c in Sources */,
 				A7D8AADA23E2514100DCD162 /* SDL_syshaptic.c in Sources */,
 				A7D8AADA23E2514100DCD162 /* SDL_syshaptic.c in Sources */,
-				A7D8BAE523E2514500DCD162 /* e_exp.c in Sources */,
 				F3FD042F2C9B755700824C4C /* SDL_hidapi_steam_hori.c in Sources */,
 				F3FD042F2C9B755700824C4C /* SDL_hidapi_steam_hori.c in Sources */,
 				A7D8BB8123E2514500DCD162 /* SDL_quit.c in Sources */,
 				A7D8BB8123E2514500DCD162 /* SDL_quit.c in Sources */,
 				F3FA5A232B59ACE000FEAD97 /* yuv_rgb_lsx.c in Sources */,
 				F3FA5A232B59ACE000FEAD97 /* yuv_rgb_lsx.c in Sources */,
 				A7D8AEA623E2514100DCD162 /* SDL_cocoawindow.m in Sources */,
 				A7D8AEA623E2514100DCD162 /* SDL_cocoawindow.m in Sources */,
 				A7D8B43A23E2514300DCD162 /* SDL_sysmutex.c in Sources */,
 				A7D8B43A23E2514300DCD162 /* SDL_sysmutex.c in Sources */,
 				A7D8AAB023E2514100DCD162 /* SDL_syshaptic.c in Sources */,
 				A7D8AAB023E2514100DCD162 /* SDL_syshaptic.c in Sources */,
-				F3F528CD2C29E1C300E6CC26 /* s_isnan.c in Sources */,
 				F3F07D5A269640160074468B /* SDL_hidapi_luna.c in Sources */,
 				F3F07D5A269640160074468B /* SDL_hidapi_luna.c in Sources */,
 				A7D8BBD523E2574800DCD162 /* SDL_uikitclipboard.m in Sources */,
 				A7D8BBD523E2574800DCD162 /* SDL_uikitclipboard.m in Sources */,
 				F386F6F92884663E001840AA /* SDL_utils.c in Sources */,
 				F386F6F92884663E001840AA /* SDL_utils.c in Sources */,
@@ -3027,18 +2975,15 @@
 				A7D8B14023E2514200DCD162 /* SDL_blit_1.c in Sources */,
 				A7D8B14023E2514200DCD162 /* SDL_blit_1.c in Sources */,
 				A7D8BBDB23E2574800DCD162 /* SDL_uikitmetalview.m in Sources */,
 				A7D8BBDB23E2574800DCD162 /* SDL_uikitmetalview.m in Sources */,
 				A7D8BB1523E2514500DCD162 /* SDL_mouse.c in Sources */,
 				A7D8BB1523E2514500DCD162 /* SDL_mouse.c in Sources */,
-				A7D8BAD923E2514500DCD162 /* e_rem_pio2.c in Sources */,
 				F395C19C2569C68F00942BFF /* SDL_iokitjoystick.c in Sources */,
 				F395C19C2569C68F00942BFF /* SDL_iokitjoystick.c in Sources */,
 				A7D8B4B223E2514300DCD162 /* SDL_sysjoystick.c in Sources */,
 				A7D8B4B223E2514300DCD162 /* SDL_sysjoystick.c in Sources */,
 				A7D8B3E023E2514300DCD162 /* SDL_cpuinfo.c in Sources */,
 				A7D8B3E023E2514300DCD162 /* SDL_cpuinfo.c in Sources */,
 				A7D8A99323E2514000DCD162 /* SDL_sensor.c in Sources */,
 				A7D8A99323E2514000DCD162 /* SDL_sensor.c in Sources */,
-				A7D8BAA923E2514400DCD162 /* k_sin.c in Sources */,
 				A7D8AB4923E2514100DCD162 /* SDL_systimer.c in Sources */,
 				A7D8AB4923E2514100DCD162 /* SDL_systimer.c in Sources */,
 				F37E185A2BA50F450098C111 /* SDL_dummydialog.c in Sources */,
 				F37E185A2BA50F450098C111 /* SDL_dummydialog.c in Sources */,
 				A7D8BA2523E2514400DCD162 /* SDL_drawpoint.c in Sources */,
 				A7D8BA2523E2514400DCD162 /* SDL_drawpoint.c in Sources */,
 				F3681E802B7AA6240002C6FD /* SDL_cocoashape.m in Sources */,
 				F3681E802B7AA6240002C6FD /* SDL_cocoashape.m in Sources */,
 				F388C95528B5F6F700661ECF /* SDL_hidapi_ps3.c in Sources */,
 				F388C95528B5F6F700661ECF /* SDL_hidapi_ps3.c in Sources */,
-				A7D8BAF723E2514500DCD162 /* e_sqrt.c in Sources */,
 				F36C7AD1294BA009004D61C3 /* SDL_runapp.c in Sources */,
 				F36C7AD1294BA009004D61C3 /* SDL_runapp.c in Sources */,
 				A7D8AEAC23E2514100DCD162 /* SDL_cocoavideo.m in Sources */,
 				A7D8AEAC23E2514100DCD162 /* SDL_cocoavideo.m in Sources */,
 				A7D8A94B23E2514000DCD162 /* SDL.c in Sources */,
 				A7D8A94B23E2514000DCD162 /* SDL.c in Sources */,
@@ -3060,6 +3005,9 @@
 				0000140640E77F73F1DF0000 /* SDL_dialog_utils.c in Sources */,
 				0000140640E77F73F1DF0000 /* SDL_dialog_utils.c in Sources */,
 				0000D5B526B85DE7AB1C0000 /* SDL_cocoapen.m in Sources */,
 				0000D5B526B85DE7AB1C0000 /* SDL_cocoapen.m in Sources */,
 				6312C66D2B42341400A7BB00 /* SDL_murmur3.c in Sources */,
 				6312C66D2B42341400A7BB00 /* SDL_murmur3.c in Sources */,
+				0000AEB9AE90228CA2D60000 /* SDL_asyncio.c in Sources */,
+				00004D0B73767647AD550000 /* SDL_asyncio_generic.c in Sources */,
+				0000A03C0F32C43816F40000 /* SDL_asyncio_windows_ioring.c in Sources */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
@@ -3081,8 +3029,8 @@
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
 				DEPLOYMENT_POSTPROCESSING = YES;
 				DEPLOYMENT_POSTPROCESSING = YES;
-				DYLIB_COMPATIBILITY_VERSION = 107.0.0;
-				DYLIB_CURRENT_VERSION = 107.0.0;
+				DYLIB_COMPATIBILITY_VERSION = 108.0.0;
+				DYLIB_CURRENT_VERSION = 108.0.0;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				GCC_ALTIVEC_EXTENSIONS = YES;
 				GCC_ALTIVEC_EXTENSIONS = YES;
@@ -3114,7 +3062,7 @@
 					"@loader_path/Frameworks",
 					"@loader_path/Frameworks",
 				);
 				);
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
-				MARKETING_VERSION = 3.1.6;
+				MARKETING_VERSION = 3.1.7;
 				OTHER_LDFLAGS = "$(CONFIG_FRAMEWORK_LDFLAGS)";
 				OTHER_LDFLAGS = "$(CONFIG_FRAMEWORK_LDFLAGS)";
 				PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL3;
 				PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL3;
 				PRODUCT_NAME = SDL3;
 				PRODUCT_NAME = SDL3;
@@ -3142,8 +3090,8 @@
 				ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;
 				ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
-				DYLIB_COMPATIBILITY_VERSION = 107.0.0;
-				DYLIB_CURRENT_VERSION = 107.0.0;
+				DYLIB_COMPATIBILITY_VERSION = 108.0.0;
+				DYLIB_CURRENT_VERSION = 108.0.0;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
 				ENABLE_TESTABILITY = YES;
@@ -3175,7 +3123,7 @@
 					"@loader_path/Frameworks",
 					"@loader_path/Frameworks",
 				);
 				);
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
-				MARKETING_VERSION = 3.1.6;
+				MARKETING_VERSION = 3.1.7;
 				ONLY_ACTIVE_ARCH = YES;
 				ONLY_ACTIVE_ARCH = YES;
 				OTHER_LDFLAGS = "$(CONFIG_FRAMEWORK_LDFLAGS)";
 				OTHER_LDFLAGS = "$(CONFIG_FRAMEWORK_LDFLAGS)";
 				PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL3;
 				PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL3;

+ 1 - 1
libs/SDL3/Xcode/SDL/pkg-support/SDL.info

@@ -1,4 +1,4 @@
-Title SDL 3.1.6
+Title SDL 3.1.7
 Version 1
 Version 1
 Description SDL Library for macOS (http://www.libsdl.org)
 Description SDL Library for macOS (http://www.libsdl.org)
 DefaultLocation /Library/Frameworks
 DefaultLocation /Library/Frameworks

+ 1 - 1
libs/SDL3/Xcode/SDL/pkg-support/share/cmake/SDL3/SDL3Config.cmake

@@ -112,7 +112,7 @@ if(NOT TARGET SDL3::SDL3-shared)
         set_target_properties(SDL3::SDL3-shared
         set_target_properties(SDL3::SDL3-shared
             PROPERTIES
             PROPERTIES
                 FRAMEWORK "TRUE"
                 FRAMEWORK "TRUE"
-                IMPORTED_LOCATION "${_sdl3_framework_path}/SDL3"
+                IMPORTED_LOCATION "${_sdl3_framework_path}"
                 INTERFACE_LINK_LIBRARIES "SDL3::Headers"
                 INTERFACE_LINK_LIBRARIES "SDL3::Headers"
         )
         )
     endif()
     endif()

+ 1 - 1
libs/SDL3/android-project/app/src/main/java/org/libsdl/app/HIDDeviceBLESteamController.java

@@ -470,7 +470,7 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe
             // Only register controller with the native side once it has been fully configured
             // Only register controller with the native side once it has been fully configured
             if (!isRegistered()) {
             if (!isRegistered()) {
                 Log.v(TAG, "Registering Steam Controller with ID: " + getId());
                 Log.v(TAG, "Registering Steam Controller with ID: " + getId());
-                mManager.HIDDeviceConnected(getId(), getIdentifier(), getVendorId(), getProductId(), getSerialNumber(), getVersion(), getManufacturerName(), getProductName(), 0, 0, 0, 0);
+                mManager.HIDDeviceConnected(getId(), getIdentifier(), getVendorId(), getProductId(), getSerialNumber(), getVersion(), getManufacturerName(), getProductName(), 0, 0, 0, 0, true);
                 setRegistered();
                 setRegistered();
             }
             }
         }
         }

+ 2 - 2
libs/SDL3/android-project/app/src/main/java/org/libsdl/app/HIDDeviceManager.java

@@ -355,7 +355,7 @@ public class HIDDeviceManager {
                     HIDDeviceUSB device = new HIDDeviceUSB(this, usbDevice, interface_index);
                     HIDDeviceUSB device = new HIDDeviceUSB(this, usbDevice, interface_index);
                     int id = device.getId();
                     int id = device.getId();
                     mDevicesById.put(id, device);
                     mDevicesById.put(id, device);
-                    HIDDeviceConnected(id, device.getIdentifier(), device.getVendorId(), device.getProductId(), device.getSerialNumber(), device.getVersion(), device.getManufacturerName(), device.getProductName(), usbInterface.getId(), usbInterface.getInterfaceClass(), usbInterface.getInterfaceSubclass(), usbInterface.getInterfaceProtocol());
+                    HIDDeviceConnected(id, device.getIdentifier(), device.getVendorId(), device.getProductId(), device.getSerialNumber(), device.getVersion(), device.getManufacturerName(), device.getProductName(), usbInterface.getId(), usbInterface.getInterfaceClass(), usbInterface.getInterfaceSubclass(), usbInterface.getInterfaceProtocol(), false);
                 }
                 }
             }
             }
         }
         }
@@ -679,7 +679,7 @@ public class HIDDeviceManager {
     private native void HIDDeviceRegisterCallback();
     private native void HIDDeviceRegisterCallback();
     private native void HIDDeviceReleaseCallback();
     private native void HIDDeviceReleaseCallback();
 
 
-    native void HIDDeviceConnected(int deviceID, String identifier, int vendorId, int productId, String serial_number, int release_number, String manufacturer_string, String product_string, int interface_number, int interface_class, int interface_subclass, int interface_protocol);
+    native void HIDDeviceConnected(int deviceID, String identifier, int vendorId, int productId, String serial_number, int release_number, String manufacturer_string, String product_string, int interface_number, int interface_class, int interface_subclass, int interface_protocol, boolean bBluetooth);
     native void HIDDeviceOpenPending(int deviceID);
     native void HIDDeviceOpenPending(int deviceID);
     native void HIDDeviceOpenResult(int deviceID, boolean opened);
     native void HIDDeviceOpenResult(int deviceID, boolean opened);
     native void HIDDeviceDisconnected(int deviceID);
     native void HIDDeviceDisconnected(int deviceID);

+ 10 - 0
libs/SDL3/android-project/app/src/main/java/org/libsdl/app/HIDDeviceUSB.java

@@ -154,6 +154,11 @@ class HIDDeviceUSB implements HIDDevice {
 
 
     @Override
     @Override
     public int writeReport(byte[] report, boolean feature) {
     public int writeReport(byte[] report, boolean feature) {
+        if (mConnection == null) {
+            Log.w(TAG, "writeReport() called with no device connection");
+            return -1;
+        }
+
         if (feature) {
         if (feature) {
             int res = -1;
             int res = -1;
             int offset = 0;
             int offset = 0;
@@ -201,6 +206,11 @@ class HIDDeviceUSB implements HIDDevice {
         boolean skipped_report_id = false;
         boolean skipped_report_id = false;
         byte report_number = report[0];
         byte report_number = report[0];
 
 
+        if (mConnection == null) {
+            Log.w(TAG, "readReport() called with no device connection");
+            return false;
+        }
+
         if (report_number == 0x0) {
         if (report_number == 0x0) {
             /* Offset the return buffer by 1, so that the report ID
             /* Offset the return buffer by 1, so that the report ID
                will remain in byte 0. */
                will remain in byte 0. */

+ 1 - 1
libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java

@@ -60,7 +60,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
     private static final String TAG = "SDL";
     private static final String TAG = "SDL";
     private static final int SDL_MAJOR_VERSION = 3;
     private static final int SDL_MAJOR_VERSION = 3;
     private static final int SDL_MINOR_VERSION = 1;
     private static final int SDL_MINOR_VERSION = 1;
-    private static final int SDL_MICRO_VERSION = 6;
+    private static final int SDL_MICRO_VERSION = 7;
 /*
 /*
     // Display InputType.SOURCE/CLASS of events and devices
     // Display InputType.SOURCE/CLASS of events and devices
     //
     //

+ 5 - 5
libs/SDL3/build-scripts/SDL_migration.cocci

@@ -1081,7 +1081,7 @@ typedef SDL_GameControllerButton, SDL_GamepadButton;
 @@
 @@
 @@
 @@
 - SDL_GameControllerFromInstanceID
 - SDL_GameControllerFromInstanceID
-+ SDL_GetGamepadFromInstanceID
++ SDL_GetGamepadFromID
   (...)
   (...)
 @@
 @@
 @@
 @@
@@ -1318,7 +1318,7 @@ typedef SDL_GameControllerButton, SDL_GamepadButton;
 @@
 @@
 @@
 @@
 - SDL_JoystickFromInstanceID
 - SDL_JoystickFromInstanceID
-+ SDL_GetJoystickFromInstanceID
++ SDL_GetJoystickFromID
   (...)
   (...)
 @@
 @@
 @@
 @@
@@ -1398,7 +1398,7 @@ typedef SDL_GameControllerButton, SDL_GamepadButton;
 @@
 @@
 @@
 @@
 - SDL_JoystickInstanceID
 - SDL_JoystickInstanceID
-+ SDL_GetJoystickInstanceID
++ SDL_GetJoystickID
   (...)
   (...)
 @@
 @@
 @@
 @@
@@ -1807,7 +1807,7 @@ expression e2;
 @@
 @@
 @@
 @@
 - SDL_SensorFromInstanceID
 - SDL_SensorFromInstanceID
-+ SDL_GetSensorFromInstanceID
++ SDL_GetSensorFromID
   (...)
   (...)
 @@
 @@
 @@
 @@
@@ -1817,7 +1817,7 @@ expression e2;
 @@
 @@
 @@
 @@
 - SDL_SensorGetInstanceID
 - SDL_SensorGetInstanceID
-+ SDL_GetSensorInstanceID
++ SDL_GetSensorID
   (...)
   (...)
 @@
 @@
 @@
 @@

+ 51 - 13
libs/SDL3/build-scripts/build-release.py

@@ -328,6 +328,10 @@ def configure_text(text: str, context: dict[str, str]) -> str:
     return text
     return text
 
 
 
 
+def configure_text_list(text_list: list[str], context: dict[str, str]) -> list[str]:
+    return [configure_text(text=e, context=context) for e in text_list]
+
+
 class ArchiveFileTree:
 class ArchiveFileTree:
     def __init__(self):
     def __init__(self):
         self._tree: dict[str, NodeInArchive] = {}
         self._tree: dict[str, NodeInArchive] = {}
@@ -343,7 +347,7 @@ class ArchiveFileTree:
         added_files = dict()
         added_files = dict()
 
 
         def calculate_symlink_target(s: NodeInArchive) -> str:
         def calculate_symlink_target(s: NodeInArchive) -> str:
-            dest_dir = os.path.dirname(s.path)
+            dest_dir = os.path.dirname(s.arcpath)
             if dest_dir:
             if dest_dir:
                 dest_dir += "/"
                 dest_dir += "/"
             target = dest_dir + s.symtarget
             target = dest_dir + s.symtarget
@@ -357,12 +361,15 @@ class ArchiveFileTree:
 
 
         # Add files in first pass
         # Add files in first pass
         for arcpath, node in self._tree.items():
         for arcpath, node in self._tree.items():
+            assert node is not None, f"{arcpath} -> node"
             if node.data is not None:
             if node.data is not None:
                 archiver.add_file_data(arcpath=arc_join(archive_base, arcpath), data=node.data, time=node.time, mode=node.mode)
                 archiver.add_file_data(arcpath=arc_join(archive_base, arcpath), data=node.data, time=node.time, mode=node.mode)
-                added_files[node.path] = node
+                assert node.arcpath is not None, f"{node=}"
+                added_files[node.arcpath] = node
             elif node.path is not None:
             elif node.path is not None:
                 archiver.add_file_path(arcpath=arc_join(archive_base, arcpath), path=node.path)
                 archiver.add_file_path(arcpath=arc_join(archive_base, arcpath), path=node.path)
-                added_files[node.path] = node
+                assert node.arcpath is not None, f"{node=}"
+                added_files[node.arcpath] = node
             elif node.symtarget is not None:
             elif node.symtarget is not None:
                 remaining_symlinks.add(node)
                 remaining_symlinks.add(node)
             elif node.directory:
             elif node.directory:
@@ -370,6 +377,8 @@ class ArchiveFileTree:
             else:
             else:
                 raise ValueError(f"Invalid Archive Node: {repr(node)}")
                 raise ValueError(f"Invalid Archive Node: {repr(node)}")
 
 
+        assert None not in added_files
+
         # Resolve symlinks in second pass: zipfile does not support symlinks, so add files to zip archive
         # Resolve symlinks in second pass: zipfile does not support symlinks, so add files to zip archive
         while True:
         while True:
             if not remaining_symlinks:
             if not remaining_symlinks:
@@ -380,18 +389,18 @@ class ArchiveFileTree:
                 symlink_files_for_zip = {}
                 symlink_files_for_zip = {}
                 symlink_target_path = calculate_symlink_target(symlink)
                 symlink_target_path = calculate_symlink_target(symlink)
                 if symlink_target_path in added_files:
                 if symlink_target_path in added_files:
-                    symlink_files_for_zip[symlink.path] = added_files[symlink_target_path]
+                    symlink_files_for_zip[symlink.arcpath] = added_files[symlink_target_path]
                 else:
                 else:
                     symlink_target_path_slash = symlink_target_path + "/"
                     symlink_target_path_slash = symlink_target_path + "/"
                     for added_file in added_files:
                     for added_file in added_files:
                         if added_file.startswith(symlink_target_path_slash):
                         if added_file.startswith(symlink_target_path_slash):
-                            path_in_symlink = symlink.path + "/" + added_file.removeprefix(symlink_target_path_slash)
+                            path_in_symlink = symlink.arcpath + "/" + added_file.removeprefix(symlink_target_path_slash)
                             symlink_files_for_zip[path_in_symlink] = added_files[added_file]
                             symlink_files_for_zip[path_in_symlink] = added_files[added_file]
                 if symlink_files_for_zip:
                 if symlink_files_for_zip:
                     symlinks_this_time.add(symlink)
                     symlinks_this_time.add(symlink)
                     extra_added_files.update(symlink_files_for_zip)
                     extra_added_files.update(symlink_files_for_zip)
                     files_for_zip = [{"arcpath": f"{archive_base}/{sym_path}", "data": sym_info.data, "mode": sym_info.mode} for sym_path, sym_info in symlink_files_for_zip.items()]
                     files_for_zip = [{"arcpath": f"{archive_base}/{sym_path}", "data": sym_info.data, "mode": sym_info.mode} for sym_path, sym_info in symlink_files_for_zip.items()]
-                    archiver.add_symlink(arcpath=f"{archive_base}/{symlink.path}", target=symlink.symtarget, time=symlink.time, files_for_zip=files_for_zip)
+                    archiver.add_symlink(arcpath=f"{archive_base}/{symlink.arcpath}", target=symlink.symtarget, time=symlink.time, files_for_zip=files_for_zip)
             # if not symlinks_this_time:
             # if not symlinks_this_time:
             #     logger.info("files added: %r", set(path for path in added_files.keys()))
             #     logger.info("files added: %r", set(path for path in added_files.keys()))
             assert symlinks_this_time, f"No targets found for symlinks: {remaining_symlinks}"
             assert symlinks_this_time, f"No targets found for symlinks: {remaining_symlinks}"
@@ -545,6 +554,7 @@ class Releaser:
             "PROJECT_VERSION": self.version,
             "PROJECT_VERSION": self.version,
             "PROJECT_COMMIT": self.commit,
             "PROJECT_COMMIT": self.commit,
             "PROJECT_REVISION": self.revision,
             "PROJECT_REVISION": self.revision,
+            "PROJECT_ROOT": str(self.root),
         }
         }
         if extra_context:
         if extra_context:
             ctx.update(extra_context)
             ctx.update(extra_context)
@@ -741,15 +751,20 @@ class Releaser:
                 install_path = build_parent_dir / f"install-{triplet}"
                 install_path = build_parent_dir / f"install-{triplet}"
                 shutil.rmtree(install_path, ignore_errors=True)
                 shutil.rmtree(install_path, ignore_errors=True)
                 build_path.mkdir(parents=True, exist_ok=True)
                 build_path.mkdir(parents=True, exist_ok=True)
+                context = self.get_context({
+                    "ARCH": arch,
+                    "DEP_PREFIX": str(mingw_deps_path / triplet),
+                })
+                extra_args = configure_text_list(text_list=self.release_info["mingw"]["autotools"]["args"], context=context)
+
                 with self.section_printer.group(f"Configuring MinGW {triplet} (autotools)"):
                 with self.section_printer.group(f"Configuring MinGW {triplet} (autotools)"):
-                    extra_args = [arg.replace("@DEP_PREFIX@", str(mingw_deps_path / triplet)) for arg in self.release_info["mingw"]["autotools"]["args"]]
                     assert "@" not in " ".join(extra_args), f"@ should not be present in extra arguments ({extra_args})"
                     assert "@" not in " ".join(extra_args), f"@ should not be present in extra arguments ({extra_args})"
                     self.executer.run([
                     self.executer.run([
                         self.root / "configure",
                         self.root / "configure",
                         f"--prefix={install_path}",
                         f"--prefix={install_path}",
-                        f"--includedir={install_path}/include",
-                        f"--libdir={install_path}/lib",
-                        f"--bindir={install_path}/bin",
+                        f"--includedir=${{prefix}}/include",
+                        f"--libdir=${{prefix}}/lib",
+                        f"--bindir=${{prefix}}/bin",
                         f"--host={triplet}",
                         f"--host={triplet}",
                         f"--build=x86_64-none-linux-gnu",
                         f"--build=x86_64-none-linux-gnu",
                     ] + extra_args, cwd=build_path, env=new_env)
                     ] + extra_args, cwd=build_path, env=new_env)
@@ -757,7 +772,13 @@ class Releaser:
                     self.executer.run(["make", f"-j{self.cpu_count}"], cwd=build_path, env=new_env)
                     self.executer.run(["make", f"-j{self.cpu_count}"], cwd=build_path, env=new_env)
                 with self.section_printer.group(f"Install MinGW {triplet} (autotools)"):
                 with self.section_printer.group(f"Install MinGW {triplet} (autotools)"):
                     self.executer.run(["make", "install"], cwd=build_path, env=new_env)
                     self.executer.run(["make", "install"], cwd=build_path, env=new_env)
-                archive_file_tree.add_directory_tree(arc_dir=arc_join(arc_root, triplet), path=install_path)
+                archive_file_tree.add_directory_tree(arc_dir=arc_join(arc_root, triplet), path=install_path, time=self.arc_time)
+
+                print("Recording arch-dependent extra files for MinGW development archive ...")
+                extra_context = {
+                    "TRIPLET": ARCH_TO_TRIPLET[arch],
+                }
+                archive_file_tree.add_file_mapping(arc_dir=arc_root, file_mapping=self.release_info["mingw"]["autotools"].get("files", {}), file_mapping_root=self.root, context=self.get_context(extra_context=extra_context), time=self.arc_time)
 
 
         if "cmake" in self.release_info["mingw"]:
         if "cmake" in self.release_info["mingw"]:
             assert self.release_info["mingw"]["cmake"]["shared-static"] in ("args", "both")
             assert self.release_info["mingw"]["cmake"]["shared-static"] in ("args", "both")
@@ -770,6 +791,12 @@ class Releaser:
                 assert arch not in mingw_archs
                 assert arch not in mingw_archs
                 mingw_archs.add(arch)
                 mingw_archs.add(arch)
 
 
+                context = self.get_context({
+                    "ARCH": arch,
+                    "DEP_PREFIX": str(mingw_deps_path / triplet),
+                })
+                extra_args = configure_text_list(text_list=self.release_info["mingw"]["cmake"]["args"], context=context)
+
                 build_path = build_parent_dir / f"build-{triplet}"
                 build_path = build_parent_dir / f"build-{triplet}"
                 install_path = build_parent_dir / f"install-{triplet}"
                 install_path = build_parent_dir / f"install-{triplet}"
                 shutil.rmtree(install_path, ignore_errors=True)
                 shutil.rmtree(install_path, ignore_errors=True)
@@ -780,7 +807,6 @@ class Releaser:
                     args_for_shared_static = (["-DBUILD_SHARED_LIBS=ON"], ["-DBUILD_SHARED_LIBS=OFF"])
                     args_for_shared_static = (["-DBUILD_SHARED_LIBS=ON"], ["-DBUILD_SHARED_LIBS=OFF"])
                 for arg_for_shared_static in args_for_shared_static:
                 for arg_for_shared_static in args_for_shared_static:
                     with self.section_printer.group(f"Configuring MinGW {triplet} (CMake)"):
                     with self.section_printer.group(f"Configuring MinGW {triplet} (CMake)"):
-                        extra_args = [arg.replace("@DEP_PREFIX@", str(mingw_deps_path / triplet)) for arg in self.release_info["mingw"]["cmake"]["args"]]
                         assert "@" not in " ".join(extra_args), f"@ should not be present in extra arguments ({extra_args})"
                         assert "@" not in " ".join(extra_args), f"@ should not be present in extra arguments ({extra_args})"
                         self.executer.run([
                         self.executer.run([
                             f"cmake",
                             f"cmake",
@@ -803,6 +829,13 @@ class Releaser:
                         self.executer.run(["cmake", "--install", str(build_path)], cwd=build_path, env=new_env)
                         self.executer.run(["cmake", "--install", str(build_path)], cwd=build_path, env=new_env)
                 archive_file_tree.add_directory_tree(arc_dir=arc_join(arc_root, triplet), path=install_path, time=self.arc_time)
                 archive_file_tree.add_directory_tree(arc_dir=arc_join(arc_root, triplet), path=install_path, time=self.arc_time)
 
 
+                print("Recording arch-dependent extra files for MinGW development archive ...")
+                extra_context = {
+                    "TRIPLET": ARCH_TO_TRIPLET[arch],
+                }
+                archive_file_tree.add_file_mapping(arc_dir=arc_root, file_mapping=self.release_info["mingw"]["cmake"].get("files", {}), file_mapping_root=self.root, context=self.get_context(extra_context=extra_context), time=self.arc_time)
+                print("... done")
+
         print("Recording extra files for MinGW development archive ...")
         print("Recording extra files for MinGW development archive ...")
         archive_file_tree.add_file_mapping(arc_dir=arc_root, file_mapping=self.release_info["mingw"].get("files", {}), file_mapping_root=self.root, context=self.get_context(), time=self.arc_time)
         archive_file_tree.add_file_mapping(arc_dir=arc_root, file_mapping=self.release_info["mingw"].get("files", {}), file_mapping_root=self.root, context=self.get_context(), time=self.arc_time)
         print("... done")
         print("... done")
@@ -1231,6 +1264,10 @@ class Releaser:
         zip_path = self.dist_path / f"{self.project}-devel-{self.version}-VC.zip"
         zip_path = self.dist_path / f"{self.project}-devel-{self.version}-VC.zip"
         arc_root = f"{self.project}-{self.version}"
         arc_root = f"{self.project}-{self.version}"
 
 
+        def copy_files_devel(ctx):
+            archive_file_tree.add_file_mapping(arc_dir=arc_root, file_mapping=self.release_info["msvc"]["files-devel"], file_mapping_root=self.root, context=ctx, time=self.arc_time)
+
+
         logger.info("Collecting files...")
         logger.info("Collecting files...")
         archive_file_tree = ArchiveFileTree()
         archive_file_tree = ArchiveFileTree()
         if "msbuild" in self.release_info["msvc"]:
         if "msbuild" in self.release_info["msvc"]:
@@ -1238,12 +1275,13 @@ class Releaser:
                 arch_platform = self._arch_to_vs_platform(arch=arch)
                 arch_platform = self._arch_to_vs_platform(arch=arch)
                 platform_context = self.get_context(arch_platform.extra_context())
                 platform_context = self.get_context(arch_platform.extra_context())
                 archive_file_tree.add_file_mapping(arc_dir=arc_root, file_mapping=self.release_info["msvc"]["msbuild"]["files-devel"], file_mapping_root=self.root, context=platform_context, time=self.arc_time)
                 archive_file_tree.add_file_mapping(arc_dir=arc_root, file_mapping=self.release_info["msvc"]["msbuild"]["files-devel"], file_mapping_root=self.root, context=platform_context, time=self.arc_time)
+                copy_files_devel(ctx=platform_context)
         if "cmake" in self.release_info["msvc"]:
         if "cmake" in self.release_info["msvc"]:
             for arch in self.release_info["msvc"]["cmake"]["archs"]:
             for arch in self.release_info["msvc"]["cmake"]["archs"]:
                 arch_platform = self._arch_to_vs_platform(arch=arch)
                 arch_platform = self._arch_to_vs_platform(arch=arch)
                 platform_context = self.get_context(arch_platform.extra_context())
                 platform_context = self.get_context(arch_platform.extra_context())
                 archive_file_tree.add_file_mapping(arc_dir=arc_root, file_mapping=self.release_info["msvc"]["cmake"]["files-devel"], file_mapping_root=self._arch_platform_to_install_path(arch_platform), context=platform_context, time=self.arc_time)
                 archive_file_tree.add_file_mapping(arc_dir=arc_root, file_mapping=self.release_info["msvc"]["cmake"]["files-devel"], file_mapping_root=self._arch_platform_to_install_path(arch_platform), context=platform_context, time=self.arc_time)
-        archive_file_tree.add_file_mapping(arc_dir=arc_root, file_mapping=self.release_info["msvc"]["files-devel"], file_mapping_root=self.root, context=self.get_context(), time=self.arc_time)
+                copy_files_devel(ctx=platform_context)
 
 
         with Archiver(zip_path=zip_path) as archiver:
         with Archiver(zip_path=zip_path) as archiver:
             archive_file_tree.add_to_archiver(archive_base="", archiver=archiver)
             archive_file_tree.add_to_archiver(archive_base="", archiver=archiver)

+ 198 - 4
libs/SDL3/build-scripts/build-web-examples.pl

@@ -71,6 +71,62 @@ sub build_latest {
     }
     }
 }
 }
 
 
+sub get_category_description {
+    my $category = shift;
+    my $retval = ucfirst($category);
+
+    if (open(my $fh, '<', "$examples_dir/$category/description.txt")) {
+        $retval = <$fh>;
+        chomp($retval);
+        close($fh);
+    }
+
+    return $retval;
+}
+
+sub get_categories {
+    my @categories = ();
+
+    if (open(my $fh, '<', "$examples_dir/categories.txt")) {
+        while (<$fh>) {
+            chomp;
+            s/\A\s+//;
+            s/\s+\Z//;
+            next if $_ eq '';
+            next if /\A\#/;
+            push @categories, $_;
+        }
+        close($fh);
+    } else {
+        opendir(my $dh, $examples_dir) or die("Couldn't opendir '$examples_dir': $!\n");
+        foreach my $dir (sort readdir $dh) {
+            next if ($dir eq '.') || ($dir eq '..');  # obviously skip current and parent entries.
+            next if not -d "$examples_dir/$dir";   # only care about subdirectories.
+            push @categories, $dir;
+        }
+        closedir($dh);
+    }
+
+    return @categories;
+}
+
+sub get_examples_for_category {
+    my $category = shift;
+
+    my @examples = ();
+
+    opendir(my $dh, "$examples_dir/$category") or die("Couldn't opendir '$examples_dir/$category': $!\n");
+    foreach my $dir (sort readdir $dh) {
+        next if ($dir eq '.') || ($dir eq '..');  # obviously skip current and parent entries.
+        next if not -d "$examples_dir/$category/$dir";   # only care about subdirectories.
+
+        push @examples, $dir;
+    }
+    closedir($dh);
+
+    return @examples;
+}
+
 sub handle_example_dir {
 sub handle_example_dir {
     my $category = shift;
     my $category = shift;
     my $example = shift;
     my $example = shift;
@@ -99,25 +155,43 @@ sub handle_example_dir {
     $basefname = "$category-$basefname";
     $basefname = "$category-$basefname";
     my $jsfname = "$basefname.js";
     my $jsfname = "$basefname.js";
     my $wasmfname = "$basefname.wasm";
     my $wasmfname = "$basefname.wasm";
+    my $thumbnailfname = 'thumbnail.png';
+    my $onmouseoverfname = 'onmouseover.webp';
     my $jssrc = "$compile_dir/examples/$jsfname";
     my $jssrc = "$compile_dir/examples/$jsfname";
     my $wasmsrc = "$compile_dir/examples/$wasmfname";
     my $wasmsrc = "$compile_dir/examples/$wasmfname";
+    my $thumbnailsrc = "$examples_dir/$category/$example/$thumbnailfname";
+    my $onmouseoversrc = "$examples_dir/$category/$example/$onmouseoverfname";
     my $jsdst = "$dst/$jsfname";
     my $jsdst = "$dst/$jsfname";
     my $wasmdst = "$dst/$wasmfname";
     my $wasmdst = "$dst/$wasmfname";
+    my $thumbnaildst = "$dst/$thumbnailfname";
+    my $onmouseoverdst = "$dst/$onmouseoverfname";
 
 
     my $description = '';
     my $description = '';
+    my $has_paragraph = 0;
     if (open(my $readmetxth, '<', "$examples_dir/$category/$example/README.txt")) {
     if (open(my $readmetxth, '<', "$examples_dir/$category/$example/README.txt")) {
         while (<$readmetxth>) {
         while (<$readmetxth>) {
             chomp;
             chomp;
             s/\A\s+//;
             s/\A\s+//;
             s/\s+\Z//;
             s/\s+\Z//;
-            $description .= "$_<br/>";
+            if (($_ eq '') && ($description ne '')) {
+                $has_paragraph = 1;
+            } else {
+                if ($has_paragraph) {
+                    $description .= "\n<br/>\n<br/>\n";
+                    $has_paragraph = 0;
+                }
+                $description .= "$_ ";
+            }
         }
         }
         close($readmetxth);
         close($readmetxth);
+        $description =~ s/\s+\Z//;
     }
     }
 
 
     do_mkdir($dst);
     do_mkdir($dst);
     do_copy($jssrc, $jsdst);
     do_copy($jssrc, $jsdst);
     do_copy($wasmsrc, $wasmdst);
     do_copy($wasmsrc, $wasmdst);
+    do_copy($thumbnailsrc, $thumbnaildst) if ( -f $thumbnailsrc );
+    do_copy($onmouseoversrc, $onmouseoverdst) if ( -f $onmouseoversrc );
 
 
     my $highlight_cmd = "highlight '--outdir=$dst' --style-outfile=highlight.css --fragment --enclose-pre --stdout --syntax=c '--plug-in=$examples_dir/highlight-plugin.lua'";
     my $highlight_cmd = "highlight '--outdir=$dst' --style-outfile=highlight.css --fragment --enclose-pre --stdout --syntax=c '--plug-in=$examples_dir/highlight-plugin.lua'";
     print("$highlight_cmd\n");
     print("$highlight_cmd\n");
@@ -146,16 +220,27 @@ sub handle_example_dir {
 
 
     waitpid($pid, 0);
     waitpid($pid, 0);
 
 
+    my $other_examples_html = "<ul>";
+    foreach my $example (get_examples_for_category($category)) {
+        $other_examples_html .= "<li><a href='/$project/$category/$example'>$category/$example</a></li>";
+    }
+    $other_examples_html .= "</ul>";
+
+    my $category_description = get_category_description($category);
+    my $preview_image = get_example_thumbnail($project, $category, $example);
 
 
     my $html = '';
     my $html = '';
     open my $htmltemplate, '<', "$examples_dir/template.html" or die("Couldn't open '$examples_dir/template.html': $!\n");
     open my $htmltemplate, '<', "$examples_dir/template.html" or die("Couldn't open '$examples_dir/template.html': $!\n");
     while (<$htmltemplate>) {
     while (<$htmltemplate>) {
         s/\@project_name\@/$project/g;
         s/\@project_name\@/$project/g;
         s/\@category_name\@/$category/g;
         s/\@category_name\@/$category/g;
+        s/\@category_description\@/$category_description/g;
         s/\@example_name\@/$example/g;
         s/\@example_name\@/$example/g;
         s/\@javascript_file\@/$jsfname/g;
         s/\@javascript_file\@/$jsfname/g;
         s/\@htmlified_source_code\@/$htmlified_source_code/g;
         s/\@htmlified_source_code\@/$htmlified_source_code/g;
         s/\@description\@/$description/g;
         s/\@description\@/$description/g;
+        s/\@preview_image\@/$preview_image/g;
+        s/\@other_examples_html\@/$other_examples_html/g;
         $html .= $_;
         $html .= $_;
     }
     }
     close($htmltemplate);
     close($htmltemplate);
@@ -165,10 +250,60 @@ sub handle_example_dir {
     close($htmloutput);
     close($htmloutput);
 }
 }
 
 
-sub handle_category_dir {
+sub get_example_thumbnail {
+    my $project = shift;
+    my $category = shift;
+    my $example = shift;
+
+    if ( -f "$examples_dir/$category/$example/thumbnail.png" ) {
+        return "/$project/$category/$example/thumbnail.png";
+    } elsif ( -f "$examples_dir/$category/thumbnail.png" ) {
+        return "/$project/$category/thumbnail.png";
+    }
+
+    return "/$project/thumbnail.png";
+}
+
+sub generate_example_thumbnail {
+    my $project = shift;
+    my $category = shift;
+    my $example = shift;
+
+    my $example_no_num = "$example";
+    $example_no_num =~ s/\A\d+\-//;
+
+    my $example_image_url = get_example_thumbnail($project, $category, $example);
+
+    my $example_mouseover_html = '';
+    if ( -f "$examples_dir/$category/$example/onmouseover.webp" ) {
+        $example_mouseover_html = "onmouseover=\"this.src='/$project/$category/$example/onmouseover.webp'\" onmouseout=\"this.src='$example_image_url';\"";
+    } elsif ( -f "$examples_dir/$category/onmouseover.webp" ) {
+        $example_mouseover_html = "onmouseover=\"this.src='/$project/$category/onmouseover.webp'\" onmouseout=\"this.src='$example_image_url';\"";
+    }
+
+    return "
+        <a href='/$project/$category/$example'>
+          <div>
+            <img src='$example_image_url' $example_mouseover_html />
+            <div>$example_no_num</div>
+          </div>
+        </a>"
+    ;
+}
+
+sub generate_example_thumbnails_for_category {
+    my $project = shift;
     my $category = shift;
     my $category = shift;
+    my @examples = get_examples_for_category($category);
+    my $retval = '';
+    foreach my $example (@examples) {
+        $retval .= generate_example_thumbnail($project, $category, $example);
+    }
+    return $retval;
+}
 
 
-    # !!! FIXME: this needs to generate a preview page for all the examples things in the category.
+sub handle_category_dir {
+    my $category = shift;
 
 
     print("Category $category ...\n");
     print("Category $category ...\n");
 
 
@@ -183,6 +318,36 @@ sub handle_category_dir {
     }
     }
 
 
     closedir($dh);
     closedir($dh);
+
+    my $examples_list_html = generate_example_thumbnails_for_category($project, $category);
+
+    my $dst = "$output_dir/$category";
+
+    do_copy("$examples_dir/$category/thumbnail.png", "$dst/thumbnail.png") if ( -f "$examples_dir/$category/thumbnail.png" );
+    do_copy("$examples_dir/$category/onmouseover.webp", "$dst/onmouseover.webp") if ( -f "$examples_dir/$category/onmouseover.webp" );
+
+    my $category_description = get_category_description($category);
+    my $preview_image = "/$project/thumbnail.png";
+    if ( -f "$examples_dir/$category/thumbnail.png" ) {
+        $preview_image = "/$project/$category/thumbnail.png";
+    }
+
+    # write category page
+    my $html = '';
+    open my $htmltemplate, '<', "$examples_dir/template-category.html" or die("Couldn't open '$examples_dir/template-category.html': $!\n");
+    while (<$htmltemplate>) {
+        s/\@project_name\@/$project/g;
+        s/\@category_name\@/$category/g;
+        s/\@category_description\@/$category_description/g;
+        s/\@examples_list_html\@/$examples_list_html/g;
+        s/\@preview_image\@/$preview_image/g;
+        $html .= $_;
+    }
+    close($htmltemplate);
+
+    open my $htmloutput, '>', "$dst/index.html" or die("Couldn't open '$dst/index.html': $!\n");
+    print $htmloutput $html;
+    close($htmloutput);
 }
 }
 
 
 
 
@@ -210,6 +375,9 @@ do_mkdir($output_dir);
 
 
 build_latest();
 build_latest();
 
 
+do_copy("$examples_dir/template.css", "$output_dir/examples.css");
+do_copy("$examples_dir/template-placeholder.png", "$output_dir/thumbnail.png");
+
 opendir(my $dh, $examples_dir) or die("Couldn't opendir '$examples_dir': $!\n");
 opendir(my $dh, $examples_dir) or die("Couldn't opendir '$examples_dir': $!\n");
 
 
 while (readdir($dh)) {
 while (readdir($dh)) {
@@ -221,6 +389,32 @@ while (readdir($dh)) {
 
 
 closedir($dh);
 closedir($dh);
 
 
+# write homepage
+my $homepage_list_html = "";
+foreach my $category (get_categories()) {
+    my $category_description = get_category_description($category);
+    $homepage_list_html .= "<h2>$category_description</h2>";
+    $homepage_list_html .= "<div class='list'>";
+    $homepage_list_html .= generate_example_thumbnails_for_category($project, $category);
+    $homepage_list_html .= "</div>";
+}
+
+my $preview_image = "/$project/thumbnail.png";
+
+my $dst = "$output_dir/";
+my $html = '';
+open my $htmltemplate, '<', "$examples_dir/template-homepage.html" or die("Couldn't open '$examples_dir/template-category.html': $!\n");
+while (<$htmltemplate>) {
+    s/\@project_name\@/$project/g;
+    s/\@homepage_list_html\@/$homepage_list_html/g;
+    s/\@preview_image\@/$preview_image/g;
+    $html .= $_;
+}
+close($htmltemplate);
+
+open my $htmloutput, '>', "$dst/index.html" or die("Couldn't open '$dst/index.html': $!\n");
+print $htmloutput $html;
+close($htmloutput);
+
 print("All examples built successfully!\n");
 print("All examples built successfully!\n");
 exit(0);  # success!
 exit(0);  # success!
-

+ 6 - 4
libs/SDL3/build-scripts/create-release.py

@@ -23,18 +23,20 @@ def determine_remote() -> str:
 def main():
 def main():
     default_remote = determine_remote()
     default_remote = determine_remote()
 
 
-    current_commit = subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=ROOT, text=True).strip()
-
     parser = argparse.ArgumentParser(allow_abbrev=False)
     parser = argparse.ArgumentParser(allow_abbrev=False)
     parser.add_argument("--ref", required=True, help=f"Name of branch or tag containing release.yml")
     parser.add_argument("--ref", required=True, help=f"Name of branch or tag containing release.yml")
     parser.add_argument("--remote", "-R", default=default_remote, help=f"Remote repo (default={default_remote})")
     parser.add_argument("--remote", "-R", default=default_remote, help=f"Remote repo (default={default_remote})")
-    parser.add_argument("--commit", default=current_commit, help=f"Commit (default={current_commit})")
+    parser.add_argument("--commit", help=f"Input 'commit' of release.yml (default is the hash of the ref)")
     args = parser.parse_args()
     args = parser.parse_args()
 
 
+    if args.commit is None:
+        args.commit = subprocess.check_output(["git", "rev-parse", args.ref], cwd=ROOT, text=True).strip()
+
 
 
     print(f"Running release.yml workflow:")
     print(f"Running release.yml workflow:")
-    print(f"  commit = {args.commit}")
     print(f"  remote = {args.remote}")
     print(f"  remote = {args.remote}")
+    print(f"     ref = {args.ref}")
+    print(f"  commit = {args.commit}")
 
 
     subprocess.check_call(["gh", "-R", args.remote, "workflow", "run", "release.yml", "--ref", args.ref, "-f", f"commit={args.commit}"], cwd=ROOT)
     subprocess.check_call(["gh", "-R", args.remote, "workflow", "run", "release.yml", "--ref", args.ref, "-f", f"commit={args.commit}"], cwd=ROOT)
 
 

+ 6 - 2
libs/SDL3/build-scripts/fnsince.pl

@@ -90,11 +90,15 @@ foreach my $release (@releases) {
     my $tag = $fulltags{$release};
     my $tag = $fulltags{$release};
     my $blobname = "$tag:src/dynapi/SDL_dynapi_overrides.h";
     my $blobname = "$tag:src/dynapi/SDL_dynapi_overrides.h";
 
 
-    if ($release =~ /\A3\.[01]\.\d+/) {  # make everything up to the first SDL3 prerelease look like 3.1.3 (ABI lock version).
+    if ($release =~ /\A3\.(0\.\d+|1\.[0123])/) {  # make everything up to the first SDL3 prerelease look like 3.1.3 (ABI lock version).
         $release = '3.1.3';
         $release = '3.1.3';
     }
     }
 
 
-    else { $release = '3.2.0'; }  # !!! FIXME: REMOVE ME WHEN 3.2.0 SHIPS!
+    # !!! FIXME: REMOVE ME WHEN 3.2.0 SHIPS!
+    elsif (not $release =~ /\A3\.1\.\d+/) {  # a couple of releases after the initial 3.1.3, let them through.
+        $release = '3.2.0';
+    }
+    # !!! FIXME: REMOVE ME WHEN 3.2.0 SHIPS!
 
 
     open(PIPEFH, '-|', "git show '$blobname'") or die "Failed to read git blob '$blobname': $!\n";
     open(PIPEFH, '-|', "git show '$blobname'") or die "Failed to read git blob '$blobname': $!\n";
     while (<PIPEFH>) {
     while (<PIPEFH>) {

+ 1 - 1
libs/SDL3/build-scripts/pkg-support/android/cmake/SDL3Config.cmake

@@ -1,7 +1,7 @@
 # SDL CMake configuration file:
 # SDL CMake configuration file:
 # This file is meant to be placed in lib/cmake/SDL3 subfolder of a reconstructed Android SDL3 SDK
 # This file is meant to be placed in lib/cmake/SDL3 subfolder of a reconstructed Android SDL3 SDK
 
 
-cmake_minimum_required(VERSION 3.0...3.5)
+cmake_minimum_required(VERSION 3.0...3.28)
 
 
 include(FeatureSummary)
 include(FeatureSummary)
 set_package_properties(SDL3 PROPERTIES
 set_package_properties(SDL3 PROPERTIES

+ 1 - 1
libs/SDL3/build-scripts/pkg-support/msvc/cmake/SDL3Config.cmake.in

@@ -1,7 +1,7 @@
 # @<@PROJECT_NAME@>@ CMake configuration file:
 # @<@PROJECT_NAME@>@ CMake configuration file:
 # This file is meant to be placed in a cmake subfolder of @<@PROJECT_NAME@>@-devel-@<@PROJECT_VERSION@>@-VC.zip
 # This file is meant to be placed in a cmake subfolder of @<@PROJECT_NAME@>@-devel-@<@PROJECT_VERSION@>@-VC.zip
 
 
-cmake_minimum_required(VERSION 3.0...3.5)
+cmake_minimum_required(VERSION 3.0...3.28)
 
 
 include(FeatureSummary)
 include(FeatureSummary)
 set_package_properties(SDL3 PROPERTIES
 set_package_properties(SDL3 PROPERTIES

+ 0 - 1
libs/SDL3/build-scripts/rename_macros.py

@@ -113,7 +113,6 @@ RENAMED_MACROS = {
     "__LINUX__": "SDL_PLATFORM_LINUX",
     "__LINUX__": "SDL_PLATFORM_LINUX",
     "__OS2__": "SDL_PLATFORM_OS2",
     "__OS2__": "SDL_PLATFORM_OS2",
     # "__ANDROID__": "SDL_PLATFORM_ANDROID,
     # "__ANDROID__": "SDL_PLATFORM_ANDROID,
-    "__NGAGE__": "SDL_PLATFORM_NGAGE",
     "__APPLE__": "SDL_PLATFORM_APPLE",
     "__APPLE__": "SDL_PLATFORM_APPLE",
     "__TVOS__": "SDL_PLATFORM_TVOS",
     "__TVOS__": "SDL_PLATFORM_TVOS",
     "__IPHONEOS__": "SDL_PLATFORM_IOS",
     "__IPHONEOS__": "SDL_PLATFORM_IOS",

+ 299 - 1
libs/SDL3/build-scripts/wikiheaders.pl

@@ -51,6 +51,12 @@ my $wikipreamble = undef;
 my $wikiheaderfiletext = 'Defined in %fname%';
 my $wikiheaderfiletext = 'Defined in %fname%';
 my $manpageheaderfiletext = 'Defined in %fname%';
 my $manpageheaderfiletext = 'Defined in %fname%';
 my $headercategoryeval = undef;
 my $headercategoryeval = undef;
+my $quickrefenabled = 0;
+my @quickrefcategoryorder;
+my $quickreftitle = undef;
+my $quickrefurl = undef;
+my $quickrefdesc = undef;
+my $quickrefmacroregex = undef;
 my $changeformat = undef;
 my $changeformat = undef;
 my $manpath = undef;
 my $manpath = undef;
 my $gitrev = undef;
 my $gitrev = undef;
@@ -122,6 +128,12 @@ if (defined $optionsfname) {
             $wikiheaderfiletext = $val, next if $key eq 'wikiheaderfiletext';
             $wikiheaderfiletext = $val, next if $key eq 'wikiheaderfiletext';
             $manpageheaderfiletext = $val, next if $key eq 'manpageheaderfiletext';
             $manpageheaderfiletext = $val, next if $key eq 'manpageheaderfiletext';
             $headercategoryeval = $val, next if $key eq 'headercategoryeval';
             $headercategoryeval = $val, next if $key eq 'headercategoryeval';
+            $quickrefenabled = int($val), next if $key eq 'quickrefenabled';
+            @quickrefcategoryorder = split(/,/, $val), next if $key eq 'quickrefcategoryorder';
+            $quickreftitle = $val, next if $key eq 'quickreftitle';
+            $quickrefurl = $val, next if $key eq 'quickrefurl';
+            $quickrefdesc = $val, next if $key eq 'quickrefdesc';
+            $quickrefmacroregex = $val, next if $key eq 'quickrefmacroregex';
         }
         }
     }
     }
     close(OPTIONS);
     close(OPTIONS);
@@ -647,6 +659,7 @@ my %headersymsrettype = (); # $headersymsrettype{"SDL_OpenAudio"} -> string of C
 my %wikitypes = ();  # contains string of wiki page extension, like $wikitypes{"SDL_OpenAudio"} == 'mediawiki'
 my %wikitypes = ();  # contains string of wiki page extension, like $wikitypes{"SDL_OpenAudio"} == 'mediawiki'
 my %wikisyms = ();  # contains references to hash of strings, each string being the full contents of a section of a wiki page, like $wikisyms{"SDL_OpenAudio"}{"Remarks"}.
 my %wikisyms = ();  # contains references to hash of strings, each string being the full contents of a section of a wiki page, like $wikisyms{"SDL_OpenAudio"}{"Remarks"}.
 my %wikisectionorder = ();   # contains references to array, each array item being a key to a wikipage section in the correct order, like $wikisectionorder{"SDL_OpenAudio"}[2] == 'Remarks'
 my %wikisectionorder = ();   # contains references to array, each array item being a key to a wikipage section in the correct order, like $wikisectionorder{"SDL_OpenAudio"}[2] == 'Remarks'
+my %quickreffuncorder = ();   # contains references to array, each array item being a key to a category with functions in the order they appear in the headers, like $quickreffuncorder{"Audio"}[0] == 'SDL_GetNumAudioDrivers'
 
 
 my %referenceonly = ();  # $referenceonly{"Y"} -> symbol name that this symbol is bound to. This makes wiki pages that say "See X" where "X" is a typedef and "Y" is a define attached to it. These pages are generated in the wiki only and do not bridge to the headers or manpages.
 my %referenceonly = ();  # $referenceonly{"Y"} -> symbol name that this symbol is bound to. This makes wiki pages that say "See X" where "X" is a typedef and "Y" is a define attached to it. These pages are generated in the wiki only and do not bridge to the headers or manpages.
 
 
@@ -720,6 +733,279 @@ sub sanitize_c_typename {
     return $str;
     return $str;
 }
 }
 
 
+my %big_ascii = (
+    'A' => [ "\x{20}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2550}\x{255D}\x{20}\x{20}\x{255A}\x{2550}\x{255D}" ],
+    'B' => [ "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}" ],
+    'C' => [ "\x{20}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{20}\x{20}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{20}\x{20}", "\x{255A}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{20}\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}" ],
+    'D' => [ "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}" ],
+    'E' => [ "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{255D}\x{20}\x{20}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}" ],
+    'F' => [ "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{255D}\x{20}\x{20}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{20}\x{20}", "\x{255A}\x{2550}\x{255D}\x{20}\x{20}\x{20}\x{20}\x{20}" ],
+    'G' => [ "\x{20}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}" ],
+    'H' => [ "\x{2588}\x{2588}\x{2557}\x{20}\x{20}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2550}\x{255D}\x{20}\x{20}\x{255A}\x{2550}\x{255D}" ],
+    'I' => [ "\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2550}\x{255D}" ],
+    'J' => [ "\x{20}\x{20}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2557}", "\x{20}\x{20}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{20}\x{20}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}" ],
+    'K' => [ "\x{2588}\x{2588}\x{2557}\x{20}\x{20}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2551}\x{20}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2588}\x{2588}\x{2557}\x{20}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{255D}\x{20}\x{20}\x{255A}\x{2550}\x{255D}" ],
+    'L' => [ "\x{2588}\x{2588}\x{2557}\x{20}\x{20}\x{20}\x{20}\x{20}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{20}\x{20}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{20}\x{20}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{20}\x{20}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}" ],
+    'M' => [ "\x{2588}\x{2588}\x{2588}\x{2557}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}\x{2588}\x{2588}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2554}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}\x{255A}\x{2588}\x{2588}\x{2554}\x{255D}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}\x{20}\x{255A}\x{2550}\x{255D}\x{20}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2550}\x{255D}\x{20}\x{20}\x{20}\x{20}\x{20}\x{255A}\x{2550}\x{255D}" ],
+    'N' => [ "\x{2588}\x{2588}\x{2588}\x{2557}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2554}\x{2588}\x{2588}\x{2557}\x{20}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}\x{255A}\x{2588}\x{2588}\x{2557}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}\x{20}\x{255A}\x{2588}\x{2588}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2550}\x{255D}\x{20}\x{20}\x{255A}\x{2550}\x{2550}\x{2550}\x{255D}" ],
+    'O' => [ "\x{20}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}" ],
+    'P' => [ "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{20}\x{20}", "\x{255A}\x{2550}\x{255D}\x{20}\x{20}\x{20}\x{20}\x{20}" ],
+    'Q' => [ "\x{20}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}\x{2584}\x{2584}\x{20}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{255A}\x{2550}\x{2550}\x{2580}\x{2580}\x{2550}\x{255D}\x{20}" ],
+    'R' => [ "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2550}\x{255D}\x{20}\x{20}\x{255A}\x{2550}\x{255D}" ],
+    'S' => [ "\x{20}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}" ],
+    'T' => [ "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{2550}\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{255D}", "\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}\x{255A}\x{2550}\x{255D}\x{20}\x{20}\x{20}" ],
+    'U' => [ "\x{2588}\x{2588}\x{2557}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}" ],
+    'V' => [ "\x{2588}\x{2588}\x{2557}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2588}\x{2588}\x{2557}\x{20}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{255A}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}\x{20}", "\x{20}\x{20}\x{255A}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}\x{20}" ],
+    'W' => [ "\x{2588}\x{2588}\x{2557}\x{20}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}\x{20}\x{2588}\x{2557}\x{20}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}\x{2588}\x{2588}\x{2588}\x{2557}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2588}\x{2588}\x{2588}\x{2554}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{255A}\x{2550}\x{2550}\x{255D}\x{255A}\x{2550}\x{2550}\x{255D}\x{20}" ],
+    'X' => [ "\x{2588}\x{2588}\x{2557}\x{20}\x{20}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2588}\x{2588}\x{2557}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{255A}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}\x{20}", "\x{20}\x{2588}\x{2588}\x{2554}\x{2588}\x{2588}\x{2557}\x{20}", "\x{2588}\x{2588}\x{2554}\x{255D}\x{20}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{255D}\x{20}\x{20}\x{255A}\x{2550}\x{255D}" ],
+    'Y' => [ "\x{2588}\x{2588}\x{2557}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2588}\x{2588}\x{2557}\x{20}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{255A}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}\x{20}", "\x{20}\x{20}\x{255A}\x{2588}\x{2588}\x{2554}\x{255D}\x{20}\x{20}", "\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}\x{255A}\x{2550}\x{255D}\x{20}\x{20}\x{20}" ],
+    'Z' => [ "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{2550}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{20}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}\x{20}", "\x{20}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}\x{20}\x{20}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}" ],
+    ' ' => [ "\x{20}\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}\x{20}" ],
+    '.' => [ "\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}", "\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{255D}" ],
+    ',' => [ "\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}", "\x{2584}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{255D}" ],
+    '/' => [ "\x{20}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2557}", "\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{20}\x{2588}\x{2588}\x{2554}\x{255D}\x{20}", "\x{20}\x{2588}\x{2588}\x{2554}\x{255D}\x{20}\x{20}", "\x{2588}\x{2588}\x{2554}\x{255D}\x{20}\x{20}\x{20}", "\x{255A}\x{2550}\x{255D}\x{20}\x{20}\x{20}\x{20}" ],
+    '!' => [ "\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2550}\x{255D}", "\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{255D}" ],
+    '_' => [ "\x{20}\x{20}\x{20}\x{20}\x{20}\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}\x{20}\x{20}\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}\x{20}\x{20}\x{20}\x{20}\x{20}", "\x{20}\x{20}\x{20}\x{20}\x{20}\x{20}\x{20}\x{20}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}" ],
+    '0' => [ "\x{20}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2551}\x{2588}\x{2588}\x{2554}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}" ],
+    '1' => [ "\x{20}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2588}\x{2588}\x{2551}", "\x{20}\x{2588}\x{2588}\x{2551}", "\x{20}\x{2588}\x{2588}\x{2551}", "\x{20}\x{255A}\x{2550}\x{255D}" ],
+    '2' => [ "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{20}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}" ],
+    '3' => [ "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{20}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{255A}\x{2550}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}" ],
+    '4' => [ "\x{2588}\x{2588}\x{2557}\x{20}\x{20}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2551}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2588}\x{2588}\x{2551}", "\x{20}\x{20}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}", "\x{20}\x{20}\x{20}\x{20}\x{20}\x{255A}\x{2550}\x{255D}" ],
+    '5' => [ "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2588}\x{2588}\x{2551}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2551}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}" ],
+    '6' => [ "\x{20}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}", "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}" ],
+    '7' => [ "\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{2588}\x{2588}\x{2551}", "\x{20}\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2554}\x{255D}\x{20}", "\x{20}\x{20}\x{20}\x{2588}\x{2588}\x{2551}\x{20}\x{20}", "\x{20}\x{20}\x{20}\x{255A}\x{2550}\x{255D}\x{20}\x{20}" ],
+    '8' => [ "\x{20}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}" ],
+    '9' => [ "\x{20}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2557}\x{20}", "\x{2588}\x{2588}\x{2554}\x{2550}\x{2550}\x{2588}\x{2588}\x{2557}", "\x{255A}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2551}", "\x{20}\x{255A}\x{2550}\x{2550}\x{2550}\x{2588}\x{2588}\x{2551}", "\x{20}\x{2588}\x{2588}\x{2588}\x{2588}\x{2588}\x{2554}\x{255D}", "\x{20}\x{255A}\x{2550}\x{2550}\x{2550}\x{2550}\x{255D}\x{20}" ],
+);
+
+sub print_big_ascii_string {
+    my $fh = shift;
+    my $str = shift;
+    my $comment = shift;
+    my $lowascii = shift;
+    $comment = '' if not defined $comment;
+    $lowascii = 0 if not defined $lowascii;
+
+    my @chars = split //, $str;
+    my $charcount = scalar(@chars);
+
+    binmode($fh, ":utf8");
+
+    my $maxrows = $lowascii ? 5 : 6;
+
+    for(my $rownum = 0; $rownum < $maxrows; $rownum++){
+        print $fh $comment;
+        my $charidx = 0;
+        foreach my $ch (@chars) {
+            my $rowsref = $big_ascii{uc($ch)};
+            die("Don't have a big ascii entry for '$ch'!\n") if not defined $rowsref;
+            my $row = @$rowsref[$rownum];
+
+            if ($lowascii) {
+                my @x = split //, $row;
+                foreach (@x) {
+                    my $v = ($_ eq "\x{2588}") ? 'X' : ' ';
+                    print $fh $v;
+                }
+            } else {
+                print $fh $row;
+            }
+
+            $charidx++;
+
+            if ($charidx < $charcount) {
+                print $fh " ";
+            }
+        }
+        print $fh "\n";
+    }
+}
+
+sub generate_quickref {
+    my $briefsref = shift;
+    my $path = shift;
+    my $lowascii = shift;
+
+    # !!! FIXME: this gitrev and majorver/etc stuff is copy/pasted a few times now.
+    if (!$gitrev) {
+        $gitrev = `cd "$srcpath" ; git rev-list HEAD~..`;
+        chomp($gitrev);
+    }
+
+    # !!! FIXME
+    open(FH, '<', "$srcpath/$versionfname") or die("Can't open '$srcpath/$versionfname': $!\n");
+    my $majorver = 0;
+    my $minorver = 0;
+    my $microver = 0;
+    while (<FH>) {
+        chomp;
+        if (/$versionmajorregex/) {
+            $majorver = int($1);
+        } elsif (/$versionminorregex/) {
+            $minorver = int($1);
+        } elsif (/$versionmicroregex/) {
+            $microver = int($1);
+        }
+    }
+    close(FH);
+    my $fullversion = "$majorver.$minorver.$microver";
+
+    my $tmppath = "$path.tmp";
+    open(my $fh, '>', $tmppath) or die("Can't open '$tmppath': $!\n");
+
+    if (not @quickrefcategoryorder) {
+        @quickrefcategoryorder = sort keys %headercategorydocs;
+    }
+
+    #my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
+    #my $datestr = sprintf("%04d-%02d-%02d %02d:%02d:%02d GMT", $year+1900, $mon+1, $mday, $hour, $min, $sec);
+
+    print $fh "<!-- DO NOT EDIT THIS PAGE ON THE WIKI. IT WILL BE OVERWRITTEN BY WIKIHEADERS AND CHANGES WILL BE LOST! -->\n\n";
+
+    # Just something to test big_ascii output.
+    #print_big_ascii_string($fh, "ABCDEFGHIJ", '', $lowascii);
+    #print_big_ascii_string($fh, "KLMNOPQRST", '', $lowascii);
+    #print_big_ascii_string($fh, "UVWXYZ0123", '', $lowascii);
+    #print_big_ascii_string($fh, "456789JT3A", '', $lowascii);
+    #print_big_ascii_string($fh, "hello, _a.b/c_!!", '', $lowascii);
+
+    # Dan Bechard's work was on an SDL2 cheatsheet:
+    # https://blog.theprogrammingjunkie.com/post/sdl2-cheatsheet/
+
+    if ($lowascii) {
+        print $fh "# QuickReferenceNoUnicode\n\n";
+        print $fh "If you want to paste this into a text editor that can handle\n";
+        print $fh "fancy Unicode section headers, try using\n";
+        print $fh "[QuickReference](QuickReference) instead.\n\n";
+    } else {
+        print $fh "# QuickReference\n\n";
+        print $fh "If you want to paste this into a text editor that can't handle\n";
+        print $fh "the fancy Unicode section headers, try using\n";
+        print $fh "[QuickReferenceNoUnicode](QuickReferenceNoUnicode) instead.\n\n";
+    }
+
+    print $fh "```c\n";
+    print $fh "// $quickreftitle\n" if defined $quickreftitle;
+    print $fh "//\n";
+    print $fh "// $quickrefurl\n//\n" if defined $quickrefurl;
+    print $fh "// $quickrefdesc\n" if defined $quickrefdesc;
+    #print $fh "// When this document was written: $datestr\n";
+    print $fh "// Based on $projectshortname version $fullversion\n";
+    #print $fh "// git revision $gitrev\n";
+    print $fh "//\n";
+    print $fh "// This can be useful in an IDE with search and syntax highlighting.\n";
+    print $fh "//\n";
+    print $fh "// Original idea for this document came from Dan Bechard (thanks!)\n";
+    print $fh "// ASCII art generated by: https://patorjk.com/software/taag/#p=display&f=ANSI%20Shadow (with modified 'S' for readability)\n\n";
+
+    foreach (@quickrefcategoryorder) {
+        my $cat = $_;
+        my $maxlen = 0;
+        my @csigs = ();
+        my $funcorderref = $quickreffuncorder{$cat};
+        next if not defined $funcorderref;
+
+        foreach (@$funcorderref) {
+            my $sym = $_;
+            my $csig = '';
+
+            if ($headersymstype{$sym} == 1) {  # function
+                $csig = "${headersymsrettype{$sym}} $sym";
+                my $fnsigparams = $headersymsparaminfo{$sym};
+                if (not defined($fnsigparams)) {
+                    $csig .= '(void);';
+                } else {
+                    my $sep = '(';
+                    for (my $i = 0; $i < scalar(@$fnsigparams); $i += 2) {
+                        my $paramname = @$fnsigparams[$i];
+                        my $paramtype = @$fnsigparams[$i+1];
+                        my $spc = ($paramtype =~ /\*\Z/) ? '' : ' ';
+                        $csig .= "$sep$paramtype$spc$paramname";
+                        $sep = ', ';
+                    }
+                    $csig .= ");";
+                }
+            } elsif ($headersymstype{$sym} == 2) {  # macro
+                next if defined $quickrefmacroregex && not $sym =~ /$quickrefmacroregex/;
+
+                $csig = (split /\n/, $headerdecls{$sym})[0];  # get the first line from a multiline string.
+                if (not $csig =~ s/\A(\#define [a-zA-Z0-9_]*\(.*?\))(\s+.*)?\Z/$1/) {
+                    $csig =~ s/\A(\#define [a-zA-Z0-9_]*)(\s+.*)?\Z/$1/;
+                }
+                chomp($csig);
+            }
+
+            my $len = length($csig);
+            $maxlen = $len if $len > $maxlen;
+
+            push @csigs, $sym;
+            push @csigs, $csig;
+        }
+
+        $maxlen += 2;
+
+        next if (not @csigs);
+
+        print $fh "\n";
+        print_big_ascii_string($fh, $cat, '// ', $lowascii);
+        print $fh "\n";
+
+        while (@csigs) {
+            my $sym = shift @csigs;
+            my $csig = shift @csigs;
+            my $brief = $$briefsref{$sym};
+            if (defined $brief) {
+                $brief = "$brief";
+                chomp($brief);
+                my $thiswikitype = defined $wikitypes{$sym} ? $wikitypes{$sym} : 'md';  # default to MarkDown for new stuff.
+                $brief = dewikify($thiswikitype, $brief);
+                my $spaces = ' ' x ($maxlen - length($csig));
+                $brief = "$spaces// $brief";
+            } else {
+                $brief = '';
+            }
+            print $fh "$csig$brief\n";
+        }
+    }
+
+    print $fh "```\n\n";
+
+    close($fh);
+
+#    # Don't overwrite the file if nothing has changed besides the timestamp
+#    #  and git revision.
+#    my $matches = 1;
+#    if ( not -f $path ) {
+#        $matches = 0;  # always write if the file hasn't been created yet.
+#    } else {
+#        open(my $fh_a, '<', $tmppath) or die("Can't open '$tmppath': $!\n");
+#        open(my $fh_b, '<', $path) or die("Can't open '$path': $!\n");
+#        while (1) {
+#            my $a = <$fh_a>;
+#            my $b = <$fh_b>;
+#            $matches = 0, last if ((not defined $a) != (not defined $b));
+#            last if ((not defined $a) || (not defined $b));
+#            if ($a ne $b) {
+#                next if ($a =~ /\A\/\/ When this document was written:/);
+#                next if ($a =~ /\A\/\/ git revision /);
+#                $matches = 0;
+#                last;
+#            }
+#        }
+#
+#        close($fh_a);
+#        close($fh_b);
+#    }
+#
+#    if ($matches) {
+#        unlink($tmppath);  # it's the same file except maybe the date/gitrev. Don't overwrite it.
+#    } else {
+#        rename($tmppath, $path) or die("Can't rename '$tmppath' to '$path': $!\n");
+#    }
+    rename($tmppath, $path) or die("Can't rename '$tmppath' to '$path': $!\n");
+}
+
+
 my $incpath = "$srcpath";
 my $incpath = "$srcpath";
 $incpath .= "/$incsubdir" if $incsubdir ne '';
 $incpath .= "/$incsubdir" if $incsubdir ne '';
 
 
@@ -749,10 +1035,12 @@ while (my $d = readdir(DH)) {
     }
     }
 
 
     my @contents = ();
     my @contents = ();
+    my @function_order = ();
     my $ignoring_lines = 0;
     my $ignoring_lines = 0;
     my $header_comment = -1;
     my $header_comment = -1;
     my $saw_category_doxygen = -1;
     my $saw_category_doxygen = -1;
     my $lineno = 0;
     my $lineno = 0;
+
     while (<FH>) {
     while (<FH>) {
         chomp;
         chomp;
         $lineno++;
         $lineno++;
@@ -1073,7 +1361,6 @@ while (my $d = readdir(DH)) {
                 }
                 }
             }
             }
             $decl .= $additional_decl;
             $decl .= $additional_decl;
-
         } elsif ($symtype == 2) {  # a macro
         } elsif ($symtype == 2) {  # a macro
             if ($decl =~ /\A\s*\#\s*define\s+(.*?)(\(.*?\)|)\s+/) {
             if ($decl =~ /\A\s*\#\s*define\s+(.*?)(\(.*?\)|)\s+/) {
                 $sym = $1;
                 $sym = $1;
@@ -1301,6 +1588,7 @@ while (my $d = readdir(DH)) {
             $headersymstype{$sym} = $symtype;
             $headersymstype{$sym} = $symtype;
             $headersymsparaminfo{$sym} = \@paraminfo if (scalar(@paraminfo) > 0);
             $headersymsparaminfo{$sym} = \@paraminfo if (scalar(@paraminfo) > 0);
             $headersymsrettype{$sym} = $rettype if (defined($rettype));
             $headersymsrettype{$sym} = $rettype if (defined($rettype));
+            push @function_order, $sym if ($symtype == 1) || ($symtype == 2);
             push @contents, join("\n", @templines);
             push @contents, join("\n", @templines);
             push @contents, join("\n", @decllines) if (scalar(@decllines) > 0);
             push @contents, join("\n", @decllines) if (scalar(@decllines) > 0);
         }
         }
@@ -1309,6 +1597,7 @@ while (my $d = readdir(DH)) {
     close(FH);
     close(FH);
 
 
     $headers{$dent} = \@contents;
     $headers{$dent} = \@contents;
+    $quickreffuncorder{$current_wiki_category} = \@function_order if defined $current_wiki_category;
 }
 }
 closedir(DH);
 closedir(DH);
 
 
@@ -1785,6 +2074,8 @@ if ($copy_direction == 1) {  # --copy-to-headers
 
 
 } elsif ($copy_direction == -1) { # --copy-to-wiki
 } elsif ($copy_direction == -1) { # --copy-to-wiki
 
 
+    my %briefs = ();  # $briefs{'SDL_OpenAudio'} -> the \brief string for the function.
+
     if (defined $changeformat) {
     if (defined $changeformat) {
         $dewikify_mode = $changeformat;
         $dewikify_mode = $changeformat;
         $wordwrap_mode = $changeformat;
         $wordwrap_mode = $changeformat;
@@ -1856,6 +2147,8 @@ if ($copy_direction == 1) {  # --copy-to-headers
         $sections{'Remarks'} = "$remarks\n" if $remarks ne '';
         $sections{'Remarks'} = "$remarks\n" if $remarks ne '';
         $sections{'Syntax'} = $syntax;
         $sections{'Syntax'} = $syntax;
 
 
+        $briefs{$sym} = $brief;
+
         my %params = ();  # have to parse these and build up the wiki tables after, since Markdown needs to know the length of the largest string.  :/
         my %params = ();  # have to parse these and build up the wiki tables after, since Markdown needs to know the length of the largest string.  :/
         my @paramsorder = ();
         my @paramsorder = ();
         my $fnsigparams = $headersymsparaminfo{$sym};
         my $fnsigparams = $headersymsparaminfo{$sym};
@@ -2415,6 +2708,11 @@ __EOF__
         }
         }
     }
     }
 
 
+    # Write out quick reference pages...
+    if ($quickrefenabled) {
+        generate_quickref(\%briefs, "$wikipath/QuickReference.md", 0);
+        generate_quickref(\%briefs, "$wikipath/QuickReferenceNoUnicode.md", 1);
+    }
 } elsif ($copy_direction == -2) { # --copy-to-manpages
 } elsif ($copy_direction == -2) { # --copy-to-manpages
     # This only takes from the wiki data, since it has sections we omit from the headers, like code examples.
     # This only takes from the wiki data, since it has sections we omit from the headers, like code examples.
 
 

+ 1 - 1
libs/SDL3/cmake/android/FindSdlAndroid.cmake

@@ -61,7 +61,7 @@ This module will set the following variables in your project:
 
 
 #]=======================================================================]
 #]=======================================================================]
 
 
-cmake_minimum_required(VERSION 3.7)
+cmake_minimum_required(VERSION 3.7...3.28)
 
 
 if(NOT PROJECT_NAME MATCHES "^SDL.*")
 if(NOT PROJECT_NAME MATCHES "^SDL.*")
   message(WARNING "This module is internal to SDL and is currently not supported.")
   message(WARNING "This module is internal to SDL and is currently not supported.")

+ 1 - 1
libs/SDL3/cmake/android/FindSdlAndroidBuildTools.cmake

@@ -52,7 +52,7 @@ This module responds to the flags:
 
 
 #]=======================================================================]
 #]=======================================================================]
 
 
-cmake_minimum_required(VERSION 3.7)
+cmake_minimum_required(VERSION 3.7...3.28)
 
 
 if(NOT PROJECT_NAME MATCHES "^SDL.*")
 if(NOT PROJECT_NAME MATCHES "^SDL.*")
   message(WARNING "This module is internal to SDL and is currently not supported.")
   message(WARNING "This module is internal to SDL and is currently not supported.")

+ 1 - 1
libs/SDL3/cmake/android/FindSdlAndroidPlatform.cmake

@@ -55,7 +55,7 @@ This module responds to the flags:
 
 
 #]=======================================================================]
 #]=======================================================================]
 
 
-cmake_minimum_required(VERSION 3.7)
+cmake_minimum_required(VERSION 3.7...3.28)
 
 
 if(NOT PROJECT_NAME MATCHES "^SDL.*")
 if(NOT PROJECT_NAME MATCHES "^SDL.*")
     message(WARNING "This module is internal to SDL and is currently not supported.")
     message(WARNING "This module is internal to SDL and is currently not supported.")

+ 1 - 1
libs/SDL3/cmake/android/SdlAndroidFunctions.cmake

@@ -5,7 +5,7 @@ It is (currently) limited to packaging binaries for a single architecture.
 
 
 #]=======================================================================]
 #]=======================================================================]
 
 
-cmake_minimum_required(VERSION 3.7)
+cmake_minimum_required(VERSION 3.7...3.28)
 
 
 if(NOT PROJECT_NAME MATCHES "^SDL.*")
 if(NOT PROJECT_NAME MATCHES "^SDL.*")
   message(WARNING "This module is internal to SDL and is currently not supported.")
   message(WARNING "This module is internal to SDL and is currently not supported.")

+ 1 - 1
libs/SDL3/cmake/android/SdlAndroidScript.cmake

@@ -6,7 +6,7 @@ Because
 
 
 #]=======================================================================]
 #]=======================================================================]
 
 
-cmake_minimum_required(VERSION 3.16)
+cmake_minimum_required(VERSION 3.16...3.28)
 
 
 if(NOT CMAKE_SCRIPT_MODE_FILE)
 if(NOT CMAKE_SCRIPT_MODE_FILE)
   message(FATAL_ERROR "This file can only be used in CMake script mode")
   message(FATAL_ERROR "This file can only be used in CMake script mode")

+ 6 - 0
libs/SDL3/cmake/sdlchecks.cmake

@@ -307,6 +307,7 @@ macro(CheckX11)
     find_file(HAVE_XRANDR_H NAMES "X11/extensions/Xrandr.h" HINTS "${X11_INCLUDEDIR}")
     find_file(HAVE_XRANDR_H NAMES "X11/extensions/Xrandr.h" HINTS "${X11_INCLUDEDIR}")
     find_file(HAVE_XFIXES_H_ NAMES "X11/extensions/Xfixes.h" HINTS "${X11_INCLUDEDIR}")
     find_file(HAVE_XFIXES_H_ NAMES "X11/extensions/Xfixes.h" HINTS "${X11_INCLUDEDIR}")
     find_file(HAVE_XRENDER_H NAMES "X11/extensions/Xrender.h" HINTS "${X11_INCLUDEDIR}")
     find_file(HAVE_XRENDER_H NAMES "X11/extensions/Xrender.h" HINTS "${X11_INCLUDEDIR}")
+    find_file(HAVE_XSYNC_H NAMES "X11/extensions/sync.h" HINTS "${X11_INCLUDEDIR}")
     find_file(HAVE_XSS_H NAMES "X11/extensions/scrnsaver.h" HINTS "${X11_INCLUDEDIR}")
     find_file(HAVE_XSS_H NAMES "X11/extensions/scrnsaver.h" HINTS "${X11_INCLUDEDIR}")
     find_file(HAVE_XSHAPE_H NAMES "X11/extensions/shape.h" HINTS "${X11_INCLUDEDIR}")
     find_file(HAVE_XSHAPE_H NAMES "X11/extensions/shape.h" HINTS "${X11_INCLUDEDIR}")
     find_file(HAVE_XDBE_H NAMES "X11/extensions/Xdbe.h" HINTS "${X11_INCLUDEDIR}")
     find_file(HAVE_XDBE_H NAMES "X11/extensions/Xdbe.h" HINTS "${X11_INCLUDEDIR}")
@@ -445,6 +446,11 @@ macro(CheckX11)
         set(HAVE_X11_XFIXES TRUE)
         set(HAVE_X11_XFIXES TRUE)
       endif()
       endif()
 
 
+      if(SDL_X11_XSYNC AND HAVE_XSYNC_H AND XEXT_LIB)
+        set(SDL_VIDEO_DRIVER_X11_XSYNC 1)
+        set(HAVE_X11_XSYNC TRUE)
+      endif()
+
       if(SDL_X11_XRANDR AND HAVE_XRANDR_H AND XRANDR_LIB)
       if(SDL_X11_XRANDR AND HAVE_XRANDR_H AND XRANDR_LIB)
         if(HAVE_X11_SHARED)
         if(HAVE_X11_SHARED)
           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR "\"${XRANDR_LIB_SONAME}\"")
           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR "\"${XRANDR_LIB_SONAME}\"")

+ 1 - 1
libs/SDL3/cmake/sdlcpu.cmake

@@ -61,8 +61,8 @@ const char *arch_${known_arch} = \"INFO<${known_arch}=\" ARCH_${known_arch} \">\
 
 
   set(src_arch_detect "${src_vars}
   set(src_arch_detect "${src_vars}
 int main(int argc, char *argv[]) {
 int main(int argc, char *argv[]) {
-  (void)argv;
   int result = 0;
   int result = 0;
+  (void)argv;
 ${src_main}
 ${src_main}
   return result;
   return result;
 }")
 }")

+ 9 - 0
libs/SDL3/docs/README-documentation-rules.md

@@ -242,6 +242,15 @@ wikiheaders will complain loudly if you don't do this, and exit with an
 error message.
 error message.
 
 
 
 
+## Don't repeat type names in `\param` and `\returns` sections.
+
+Wikiheaders will explicitly mention the datatype for each parameter and the
+return value, linking to the datatype's wikipage. Users reading the headers
+can see the types in the function signature right below the documentation
+comment. So don't mention the type a second time in the documentation if
+possible. It looks cluttered and repetitive to do so.
+
+
 ## Code examples go in the wiki.
 ## Code examples go in the wiki.
 
 
 We don't want the headers cluttered up with code examples. These live on the
 We don't want the headers cluttered up with code examples. These live on the

+ 3 - 1
libs/SDL3/docs/README-linux.md

@@ -21,7 +21,7 @@ Ubuntu 18.04, all available features enabled:
     libxkbcommon-dev libdrm-dev libgbm-dev libgl1-mesa-dev libgles2-mesa-dev \
     libxkbcommon-dev libdrm-dev libgbm-dev libgl1-mesa-dev libgles2-mesa-dev \
     libegl1-mesa-dev libdbus-1-dev libibus-1.0-dev libudev-dev fcitx-libs-dev
     libegl1-mesa-dev libdbus-1-dev libibus-1.0-dev libudev-dev fcitx-libs-dev
 
 
-Ubuntu 22.04+ can also add `libpipewire-0.3-dev libwayland-dev libdecor-0-dev` to that command line.
+Ubuntu 22.04+ can also add `libpipewire-0.3-dev libwayland-dev libdecor-0-dev liburing-dev` to that command line.
 
 
 Fedora 35, all available features enabled:
 Fedora 35, all available features enabled:
 
 
@@ -34,6 +34,8 @@ Fedora 35, all available features enabled:
     libdrm-devel mesa-libgbm-devel libusb-devel libdecor-devel \
     libdrm-devel mesa-libgbm-devel libusb-devel libdecor-devel \
     pipewire-jack-audio-connection-kit-devel \
     pipewire-jack-audio-connection-kit-devel \
 
 
+Fedora 39+ can also add `liburing-devel` to that command line.
+
 NOTES:
 NOTES:
 - The sndio audio target is unavailable on Fedora (but probably not what you
 - The sndio audio target is unavailable on Fedora (but probably not what you
   should want to use anyhow).
   should want to use anyhow).

+ 30 - 0
libs/SDL3/docs/README-main-functions.md

@@ -204,3 +204,33 @@ data, as this pointer will not be provided to your app again.
 
 
 The SDL_AppResult value that terminated the app is provided here, in case
 The SDL_AppResult value that terminated the app is provided here, in case
 it's useful to know if this was a successful or failing run of the app.
 it's useful to know if this was a successful or failing run of the app.
+
+
+## Summary and Best Practices
+
+- **Always Include SDL_main.h in One Source File:** When working with SDL,
+  remember that SDL_main.h must only be included in one source file in your
+  project. Including it in multiple files will lead to conflicts and undefined
+  behavior.
+
+- **Avoid Redefining main:** If you're using SDL's entry point system (which
+  renames `main` to `SDL_main`), do not define `main` yourself. SDL takes care
+  of this for you, and redefining it can cause issues, especially when linking
+  with SDL libraries.
+
+- **Using SDL's Callback System:** If you're working with more complex
+  scenarios, such as requiring more control over your application's flow
+  (e.g., with games or apps that need extensive event handling), consider
+  using SDL's callback system. Define the necessary callbacks and SDL will
+  handle initialization, event processing, and cleanup automatically.
+
+- **Platform-Specific Considerations:** On platforms like Windows, SDL handles
+  the platform-specific entry point (like `WinMain`) automatically. This means
+  you don't need to worry about writing platform-specific entry code when
+  using SDL.
+
+- **When to Skip SDL_main.h:** If you do not require SDL's custom entry point
+  (for example, if you're integrating SDL into an existing application or a
+  scripting environment), you can omit SDL_main.h. However, this will limit
+  SDL's ability to abstract away platform-specific entry point details.
+

+ 4 - 5
libs/SDL3/docs/README-migration.md

@@ -179,7 +179,7 @@ SDL_AudioDeviceID now represents both an open audio device's handle (a "logical"
 
 
 Devices are opened by physical device instance ID, and a new logical instance ID is generated by the open operation; This allows any device to be opened multiple times, possibly by unrelated pieces of code. SDL will manage the logical devices to provide a single stream of audio to the physical device behind the scenes.
 Devices are opened by physical device instance ID, and a new logical instance ID is generated by the open operation; This allows any device to be opened multiple times, possibly by unrelated pieces of code. SDL will manage the logical devices to provide a single stream of audio to the physical device behind the scenes.
 
 
-Devices are not opened by an arbitrary string name anymore, but by device instance ID (or magic numbers to request a reasonable default, like a NULL string in SDL2). In SDL2, the string was used to open both a standard list of system devices, but also allowed for arbitrary devices, such as hostnames of network sound servers. In SDL3, many of the backends that supported arbitrary device names are obsolete and have been removed; of those that remain, arbitrary devices will be opened with a default device ID and an SDL_hint, so specific end-users can set an environment variable to fit their needs and apps don't have to concern themselves with it.
+Devices are not opened by an arbitrary string name anymore, but by device instance ID (or magic numbers to request a reasonable default, like a NULL string would do in SDL2). In SDL2, the string was used to open both a standard list of system devices, but also allowed for arbitrary devices, such as hostnames of network sound servers. In SDL3, many of the backends that supported arbitrary device names are obsolete and have been removed; of those that remain, arbitrary devices will be opened with a default device ID and an SDL_hint, so specific end-users can set an environment variable to fit their needs and apps don't have to concern themselves with it.
 
 
 Many functions that would accept a device index and an `iscapture` parameter now just take an SDL_AudioDeviceID, as they are unique across all devices, instead of separate indices into playback and recording device lists.
 Many functions that would accept a device index and an `iscapture` parameter now just take an SDL_AudioDeviceID, as they are unique across all devices, instead of separate indices into playback and recording device lists.
 
 
@@ -214,7 +214,7 @@ SDL_QueueAudio(), SDL_DequeueAudio, and SDL_ClearQueuedAudio and SDL_GetQueuedAu
 
 
 APIs that use channel counts used to use a Uint8 for the channel; now they use int.
 APIs that use channel counts used to use a Uint8 for the channel; now they use int.
 
 
-SDL_AudioSpec has been reduced; now it only holds format, channel, and sample rate. SDL_GetSilenceValueForFormat() can provide the information from the SDL_AudioSpec's `silence` field. The other SDL2 SDL_AudioSpec fields aren't relevant anymore.
+SDL_AudioSpec has been reduced; now it only holds format, channel, and sample rate. SDL_GetSilenceValueForFormat() can provide the information from the SDL_AudioSpec's removed `silence` field. SDL3 now manages the removed `samples` field; apps that want more control over device latency and throughput can force a newly-opened device's sample count with the SDL_HINT_AUDIO_DEVICE_SAMPLE_FRAMES hint, but most apps should not risk messing with the defaults. The other SDL2 SDL_AudioSpec fields aren't relevant anymore.
 
 
 SDL_GetAudioDeviceSpec() is removed; use SDL_GetAudioDeviceFormat() instead.
 SDL_GetAudioDeviceSpec() is removed; use SDL_GetAudioDeviceFormat() instead.
 
 
@@ -820,12 +820,14 @@ The following hints have been renamed:
 The following hints have been removed:
 The following hints have been removed:
 * SDL_HINT_ACCELEROMETER_AS_JOYSTICK
 * SDL_HINT_ACCELEROMETER_AS_JOYSTICK
 * SDL_HINT_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO - the audio will be paused when the application is paused, and SDL_HINT_ANDROID_BLOCK_ON_PAUSE can be used to control that
 * SDL_HINT_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO - the audio will be paused when the application is paused, and SDL_HINT_ANDROID_BLOCK_ON_PAUSE can be used to control that
+* SDL_HINT_AUDIO_DEVICE_APP_NAME - replaced by either using the appname param to SDL_SetAppMetadata() or setting SDL_PROP_APP_METADATA_NAME_STRING with SDL_SetAppMetadataProperty()
 * SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS - gamepad buttons are always positional
 * SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS - gamepad buttons are always positional
 * SDL_HINT_GRAB_KEYBOARD - use SDL_SetWindowKeyboardGrab() instead
 * SDL_HINT_GRAB_KEYBOARD - use SDL_SetWindowKeyboardGrab() instead
 * SDL_HINT_IDLE_TIMER_DISABLED - use SDL_DisableScreenSaver() instead
 * SDL_HINT_IDLE_TIMER_DISABLED - use SDL_DisableScreenSaver() instead
 * SDL_HINT_IME_INTERNAL_EDITING - replaced with SDL_HINT_IME_IMPLEMENTED_UI
 * SDL_HINT_IME_INTERNAL_EDITING - replaced with SDL_HINT_IME_IMPLEMENTED_UI
 * SDL_HINT_IME_SHOW_UI - replaced with SDL_HINT_IME_IMPLEMENTED_UI
 * SDL_HINT_IME_SHOW_UI - replaced with SDL_HINT_IME_IMPLEMENTED_UI
 * SDL_HINT_IME_SUPPORT_EXTENDED_TEXT - the normal text editing event has extended text
 * SDL_HINT_IME_SUPPORT_EXTENDED_TEXT - the normal text editing event has extended text
+* SDL_HINT_MOUSE_RELATIVE_MODE_WARP - relative mode is always implemented at the hardware level or reported as unavailable
 * SDL_HINT_MOUSE_RELATIVE_SCALING - mouse coordinates are no longer automatically scaled by the SDL renderer
 * SDL_HINT_MOUSE_RELATIVE_SCALING - mouse coordinates are no longer automatically scaled by the SDL renderer
 * SDL_HINT_PS2_DYNAMIC_VSYNC - use SDL_SetRenderVSync(renderer, -1) instead
 * SDL_HINT_PS2_DYNAMIC_VSYNC - use SDL_SetRenderVSync(renderer, -1) instead
 * SDL_HINT_RENDER_BATCHING - Render batching is always enabled, apps should call SDL_FlushRenderer() before calling into a lower-level graphics API.
 * SDL_HINT_RENDER_BATCHING - Render batching is always enabled, apps should call SDL_FlushRenderer() before calling into a lower-level graphics API.
@@ -848,7 +850,6 @@ The following hints have been removed:
 * SDL_HINT_WINRT_PRIVACY_POLICY_LABEL - WinRT support was removed in SDL3.
 * SDL_HINT_WINRT_PRIVACY_POLICY_LABEL - WinRT support was removed in SDL3.
 * SDL_HINT_WINRT_PRIVACY_POLICY_URL - WinRT support was removed in SDL3.
 * SDL_HINT_WINRT_PRIVACY_POLICY_URL - WinRT support was removed in SDL3.
 * SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING
 * SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING
-* SDL_HINT_AUDIO_DEVICE_APP_NAME - replaced by either using the appname param to SDL_SetAppMetadata() or setting SDL_PROP_APP_METADATA_NAME_STRING with SDL_SetAppMetadataProperty()
 
 
 The following environment variables have been renamed:
 The following environment variables have been renamed:
 * SDL_AUDIODRIVER => SDL_AUDIO_DRIVER
 * SDL_AUDIODRIVER => SDL_AUDIO_DRIVER
@@ -1290,7 +1291,6 @@ The following platform preprocessor macros have been renamed:
 | `__LINUX__`       | `SDL_PLATFORM_LINUX`      |
 | `__LINUX__`       | `SDL_PLATFORM_LINUX`      |
 | `__MACOSX__`      | `SDL_PLATFORM_MACOS`      |
 | `__MACOSX__`      | `SDL_PLATFORM_MACOS`      |
 | `__NETBSD__`      | `SDL_PLATFORM_NETBSD`     |
 | `__NETBSD__`      | `SDL_PLATFORM_NETBSD`     |
-| `__NGAGE__`       | `SDL_PLATFORM_NGAGE`      |
 | `__OPENBSD__`     | `SDL_PLATFORM_OPENBSD`    |
 | `__OPENBSD__`     | `SDL_PLATFORM_OPENBSD`    |
 | `__OS2__`         | `SDL_PLATFORM_OS2`        |
 | `__OS2__`         | `SDL_PLATFORM_OS2`        |
 | `__OSF__`         | `SDL_PLATFORM_OSF`        |
 | `__OSF__`         | `SDL_PLATFORM_OSF`        |
@@ -2210,7 +2210,6 @@ The following functions have been renamed:
 * SDL_SetWindowDisplayMode() => SDL_SetWindowFullscreenMode(), returns bool
 * SDL_SetWindowDisplayMode() => SDL_SetWindowFullscreenMode(), returns bool
 
 
 The following functions have been removed:
 The following functions have been removed:
-* SDL_GetClosestFullscreenDisplayMode()
 * SDL_GetDisplayDPI() - not reliable across platforms, approximately replaced by multiplying SDL_GetWindowDisplayScale() times 160 on iPhone and Android, and 96 on other platforms.
 * SDL_GetDisplayDPI() - not reliable across platforms, approximately replaced by multiplying SDL_GetWindowDisplayScale() times 160 on iPhone and Android, and 96 on other platforms.
 * SDL_GetDisplayMode()
 * SDL_GetDisplayMode()
 * SDL_GetNumDisplayModes() - replaced with SDL_GetFullscreenDisplayModes()
 * SDL_GetNumDisplayModes() - replaced with SDL_GetFullscreenDisplayModes()

+ 3 - 42
libs/SDL3/docs/README-ngage.md

@@ -1,44 +1,5 @@
-Nokia N-Gage
-============
+Support for the Nokia N-Gage has been removed from SDL3 (but will make a
+comeback when newer compilers are available for the platform).
 
 
-SDL port for Symbian S60v1 and v2 with a main focus on the Nokia N-Gage
-(Classic and QD) by [Michael Fitzmayer](https://github.com/mupfdev).
+SDL2 still supports this platform.
 
 
-Compiling
----------
-
-SDL is part of the [N-Gage SDK.](https://github.com/ngagesdk) project.
-The library is included in the
-[toolchain](https://github.com/ngagesdk/ngage-toolchain) as a
-sub-module.
-
-A complete example project based on SDL can be found in the GitHub
-account of the SDK: [Wordle](https://github.com/ngagesdk/wordle).
-
-Current level of implementation
--------------------------------
-
-The video driver currently provides full screen video support with
-keyboard input.
-
-At the moment only the software renderer works.
-
-Audio is not yet implemented.
-
-Acknowledgements
-----------------
-
-Thanks to Hannu Viitala, Kimmo Kinnunen and Markus Mertama for the
-valuable insight into Symbian programming.  Without the SDL 1.2 port
-which was specially developed for CDoom (Doom for the Nokia 9210), this
-adaptation would not have been possible.
-
-I would like to thank my friends
-[Razvan](https://twitter.com/bewarerazvan) and [Dan
-Whelan](https://danwhelan.ie/), for their continuous support.  Without
-you and the [N-Gage community](https://discord.gg/dbUzqJ26vs), I would
-have lost my patience long ago.
-
-Last but not least, I would like to thank the development team of
-[EKA2L1](https://12z1.com/) (an experimental Symbian OS emulator). Your
-patience and support in troubleshooting helped me a lot.

+ 24 - 16
libs/SDL3/docs/README-raspberrypi.md

@@ -3,27 +3,35 @@ Raspberry Pi
 
 
 Requirements:
 Requirements:
 
 
-Raspbian (other Linux distros may work as well).
+Raspberry Pi OS (other Linux distros may work as well).
 
 
-Features
---------
+In modern times, the Raspberry Pi works mostly like any other Linux device:
+for video, you can use X11, Wayland, or KMSDRM. For audio, you can use ALSA,
+PulseAudio, or PipeWire, etc. OpenGL, OpenGL ES, and Vulkan are known to work.
+
+There is a video backend in SDL called "rpi" that uses a deprecated Broadcom
+interface (named "dispmanx") to draw directly to the console without X11.
+Newer Raspberry Pi OS releases don't support this (and work fine with our
+"kmsdrm" backend for the same purposes, a standard Linux interface). Don't
+panic if you can't use this backend, or CMake says it can't find libraries it
+needs for this.
 
 
-* Works without X11
-* Hardware accelerated OpenGL ES 2.x
-* Sound via ALSA
-* Input (mouse/keyboard/joystick) via EVDEV
-* Hotplugging of input devices via UDEV
+SDL has, in past times, worked on the original Raspberry Pi and the RPi 2, but
+these devices are no longer targets we actively test; if they broke, please
+report bugs or send patches!
 
 
+The Raspberry Pi 3 and later (in 32-bit and 64-bit mode) are still known to
+work well at the time of this writing. The Raspberry Pi Zero and Zero 2 are
+also known to work well.
 
 
-Raspbian Build Dependencies
----------------------------
 
 
-sudo apt-get install libudev-dev libasound2-dev libdbus-1-dev
+## Documentation Out Of Date
 
 
-You also need the VideoCore binary stuff that ships in /opt/vc for EGL and
-OpenGL ES 2.x, it usually comes pre-installed, but in any case:
+The rest of this document is likely out of date; a lot has changed in recent
+years in both SDL and the Raspberry Pi universe, and this document has not
+been updated to reflect those details. Take the rest of this information with
+a grain of salt!
 
 
-sudo apt-get install libraspberrypi0 libraspberrypi-bin libraspberrypi-dev
 
 
 
 
 NEON
 NEON
@@ -31,8 +39,8 @@ NEON
 
 
 If your Pi has NEON support, make sure you add -mfpu=neon to your CFLAGS so
 If your Pi has NEON support, make sure you add -mfpu=neon to your CFLAGS so
 that SDL will select some otherwise-disabled highly-optimized code. The
 that SDL will select some otherwise-disabled highly-optimized code. The
-original Pi units don't have NEON, the Pi2 probably does, and the Pi3
-definitely does.
+original Pi and Pi Zero units don't have NEON; everything from the Pi2/PiZero2
+and later do.
 
 
 
 
 Cross compiling from x86 Linux
 Cross compiling from x86 Linux

+ 1 - 2
libs/SDL3/docs/README-touch.md

@@ -14,7 +14,7 @@ Works out of box.
 Windows:
 Windows:
 Unfortunately there is no windows support as of yet. Support for Windows 7 is planned, but we currently have no way to test. If you have a Windows 7 WM_TOUCH supported device, and are willing to help test please contact me at [email protected]
 Unfortunately there is no windows support as of yet. Support for Windows 7 is planned, but we currently have no way to test. If you have a Windows 7 WM_TOUCH supported device, and are willing to help test please contact me at [email protected]
 
 
-===========================================================================
+
 Events
 Events
 ===========================================================================
 ===========================================================================
 SDL_EVENT_FINGER_DOWN:
 SDL_EVENT_FINGER_DOWN:
@@ -39,7 +39,6 @@ Fields:
 Same as SDL_EVENT_FINGER_DOWN.
 Same as SDL_EVENT_FINGER_DOWN.
 
 
 
 
-===========================================================================
 Functions
 Functions
 ===========================================================================
 ===========================================================================
 SDL provides the ability to access the underlying SDL_Finger structures.
 SDL provides the ability to access the underlying SDL_Finger structures.

+ 18 - 21
libs/SDL3/docs/release_checklist.md

@@ -1,16 +1,19 @@
 # Release checklist
 # Release checklist
 
 
-* Run `build-scripts/create-release.py -R libsdl-org/SDL --ref <git-ref>` to command
-  GitHub Actions to start creating release assets.
-  It's advisable to run this script regularly, and also prior to any release step.
-  When creating the release assets, `<git-ref>` must be the release tag
-  This makes sure the revision string baked into the archives is correct.
+* Run `build-scripts/create-release.py -R libsdl-org/SDL --ref <branch>` to do
+  a dry run creating the release assets. Verify that the archives are correct.
 
 
-* When changing the version, run `build-scripts/update-version.sh X Y Z`,
-  where `X Y Z` are the major version, minor version, and patch level. So
-  `3 8 1` means "change the version to 3.8.1". This script does much of the
-  mechanical work.
+* Tag the release, e.g. `git tag release-3.8.0; git push --tags`
 
 
+* Run `build-scripts/create-release.py -R libsdl-org/SDL --ref <release-tag>`
+  to have GitHub Actions create release assets. This makes sure the revision
+  string baked into the archives is correct.
+
+* Verify that the source archive REVISION.txt has the correct release tag.
+
+* Sign the source archives and upload everything to libsdl.org
+
+* Create a GitHub release and attach the archives you just generated.
 
 
 ## New feature release
 ## New feature release
 
 
@@ -22,13 +25,15 @@
 
 
 * Do the release
 * Do the release
 
 
-* Update the website file include/header.inc.php to reflect the new version
+* Immediately create a branch for patch releases, e.g. `git branch release-3.EVEN.x`
 
 
-## New bugfix release
+* Bump version number from 3.EVEN.0 to 3.(EVEN+1).0
+
+    * `./build-scripts/update-version.sh 3 EVEN+1 0`
 
 
-* Check that no new API/ABI was added
+* Update the website file include/header.inc.php to reflect the new version
 
 
-    * If it was, do a new feature release (see above) instead
+## New bugfix release
 
 
 * Bump version number from 3.Y.Z to 3.Y.(Z+1) (Y is even)
 * Bump version number from 3.Y.Z to 3.Y.(Z+1) (Y is even)
 
 
@@ -38,14 +43,6 @@
 
 
 * Update the website file include/header.inc.php to reflect the new version
 * Update the website file include/header.inc.php to reflect the new version
 
 
-## After a feature release
-
-* Create a branch like `release-3.4.x`
-
-* Bump version number to 3.ODD.0 for next development branch
-
-    * `./build-scripts/update-version.sh 3 ODD 0`
-
 ## New development prerelease
 ## New development prerelease
 
 
 * Bump version number from 3.Y.Z to 3.Y.(Z+1) (Y is odd)
 * Bump version number from 3.Y.Z to 3.Y.(Z+1) (Y is odd)

+ 9 - 3
libs/SDL3/examples/CMakeLists.txt

@@ -110,6 +110,7 @@ macro(add_sdl_example_executable TARGET)
         target_link_libraries(${TARGET} PRIVATE GL)
         target_link_libraries(${TARGET} PRIVATE GL)
     elseif(EMSCRIPTEN)
     elseif(EMSCRIPTEN)
         set_property(TARGET ${TARGET} PROPERTY SUFFIX ".html")
         set_property(TARGET ${TARGET} PROPERTY SUFFIX ".html")
+        target_link_options(${TARGET} PRIVATE -sALLOW_MEMORY_GROWTH=1)
     endif()
     endif()
 
 
     if(OPENGL_FOUND)
     if(OPENGL_FOUND)
@@ -138,11 +139,16 @@ add_sdl_example_executable(renderer-debug-text SOURCES renderer/18-debug-text/de
 add_sdl_example_executable(audio-simple-playback SOURCES audio/01-simple-playback/simple-playback.c)
 add_sdl_example_executable(audio-simple-playback SOURCES audio/01-simple-playback/simple-playback.c)
 add_sdl_example_executable(audio-simple-playback-callback SOURCES audio/02-simple-playback-callback/simple-playback-callback.c)
 add_sdl_example_executable(audio-simple-playback-callback SOURCES audio/02-simple-playback-callback/simple-playback-callback.c)
 add_sdl_example_executable(audio-load-wav SOURCES audio/03-load-wav/load-wav.c DATAFILES ${CMAKE_CURRENT_SOURCE_DIR}/../test/sample.wav)
 add_sdl_example_executable(audio-load-wav SOURCES audio/03-load-wav/load-wav.c DATAFILES ${CMAKE_CURRENT_SOURCE_DIR}/../test/sample.wav)
+add_sdl_example_executable(audio-multiple-streams SOURCES audio/04-multiple-streams/multiple-streams.c DATAFILES ${CMAKE_CURRENT_SOURCE_DIR}/../test/sample.wav ${CMAKE_CURRENT_SOURCE_DIR}/../test/sword.wav)
+add_sdl_example_executable(input-joystick-polling SOURCES input/01-joystick-polling/joystick-polling.c)
+add_sdl_example_executable(input-joystick-events SOURCES input/02-joystick-events/joystick-events.c)
 add_sdl_example_executable(camera-read-and-draw SOURCES camera/01-read-and-draw/read-and-draw.c)
 add_sdl_example_executable(camera-read-and-draw SOURCES camera/01-read-and-draw/read-and-draw.c)
 add_sdl_example_executable(pen-drawing-lines SOURCES pen/01-drawing-lines/drawing-lines.c)
 add_sdl_example_executable(pen-drawing-lines SOURCES pen/01-drawing-lines/drawing-lines.c)
-add_sdl_example_executable(game-snake SOURCES game/01-snake/snake.c)
-add_sdl_example_executable(game-woodeneye-008 SOURCES game/02-woodeneye-008/woodeneye-008.c)
-add_sdl_example_executable(game-infinite-monkeys SOURCES game/03-infinite-monkeys/infinite-monkeys.c)
+add_sdl_example_executable(asyncio-load-bitmaps SOURCES asyncio/01-load-bitmaps/load-bitmaps.c DATAFILES ${CMAKE_CURRENT_SOURCE_DIR}/../test/sample.bmp ${CMAKE_CURRENT_SOURCE_DIR}/../test/gamepad_front.bmp ${CMAKE_CURRENT_SOURCE_DIR}/../test/speaker.bmp ${CMAKE_CURRENT_SOURCE_DIR}/../test/icon2x.bmp)
+add_sdl_example_executable(demo-snake SOURCES demo/01-snake/snake.c)
+add_sdl_example_executable(demo-woodeneye-008 SOURCES demo/02-woodeneye-008/woodeneye-008.c)
+add_sdl_example_executable(demo-infinite-monkeys SOURCES demo/03-infinite-monkeys/infinite-monkeys.c)
+add_sdl_example_executable(demo-bytepusher SOURCES demo/04-bytepusher/bytepusher.c)
 
 
 # When you add an example, remember to add the Visual Studio project as well:
 # When you add an example, remember to add the Visual Studio project as well:
 # - Add a new example in examples/
 # - Add a new example in examples/

+ 6 - 0
libs/SDL3/examples/asyncio/01-load-bitmaps/README.txt

@@ -0,0 +1,6 @@
+This example code loads a few bitmap files from disk using the asynchronous
+i/o, and then draws it to the window. It uses a task group to watch multiple
+reads and deal with them in whatever order they finish.
+
+Note that for a single tiny file like this, you'd probably not want to bother
+with async i/o in real life, but this is just an example of how to do it.

+ 125 - 0
libs/SDL3/examples/asyncio/01-load-bitmaps/load-bitmaps.c

@@ -0,0 +1,125 @@
+/*
+ * This example code loads a bitmap with asynchronous i/o and renders it.
+ *
+ * This code is public domain. Feel free to use it for any purpose!
+ */
+
+#define SDL_MAIN_USE_CALLBACKS 1  /* use the callbacks instead of main() */
+#include <SDL3/SDL.h>
+#include <SDL3/SDL_main.h>
+
+/* We will use this renderer to draw into this window every frame. */
+static SDL_Window *window = NULL;
+static SDL_Renderer *renderer = NULL;
+static SDL_AsyncIOQueue *queue = NULL;
+
+#define TOTAL_TEXTURES 4
+static const char * const bmps[TOTAL_TEXTURES] = { "sample.bmp", "gamepad_front.bmp", "speaker.bmp", "icon2x.bmp" };
+static SDL_Texture *textures[TOTAL_TEXTURES];
+static const SDL_FRect texture_rects[TOTAL_TEXTURES] = {
+    { 116, 156, 408, 167 },
+    { 20, 200, 96, 60 },
+    { 525, 180, 96, 96 },
+    { 288, 375, 64, 64 }
+};
+
+/* This function runs once at startup. */
+SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
+{
+    int i;
+
+    if (!SDL_Init(SDL_INIT_VIDEO)) {
+        SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Couldn't initialize SDL!", SDL_GetError(), NULL);
+        return SDL_APP_FAILURE;
+    }
+
+    if (!SDL_CreateWindowAndRenderer("examples/asyncio/load-bitmaps", 640, 480, 0, &window, &renderer)) {
+        SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Couldn't create window/renderer!", SDL_GetError(), NULL);
+        return SDL_APP_FAILURE;
+    }
+
+    queue = SDL_CreateAsyncIOQueue();
+    if (!queue) {
+        SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Couldn't create async i/o queue!", SDL_GetError(), NULL);
+        return SDL_APP_FAILURE;
+    }
+
+    /* Load some .bmp files asynchronously from wherever the app is being run from, put them in the same queue. */
+    for (i = 0; i < SDL_arraysize(bmps); i++) {
+        char *path = NULL;
+        SDL_asprintf(&path, "%s%s", SDL_GetBasePath(), bmps[i]);  /* allocate a string of the full file path */
+        /* you _should) check for failure, but we'll just go on without files here. */
+        SDL_LoadFileAsync(path, queue, (void *) bmps[i]);  /* attach the filename as app-specific data, so we can see it later. */
+        SDL_free(path);
+    }
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs when a new event (mouse input, keypresses, etc) occurs. */
+SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event)
+{
+    if (event->type == SDL_EVENT_QUIT) {
+        return SDL_APP_SUCCESS;  /* end the program, reporting success to the OS. */
+    }
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs once per frame, and is the heart of the program. */
+SDL_AppResult SDL_AppIterate(void *appstate)
+{
+    SDL_AsyncIOOutcome outcome;
+    int i;
+
+    if (SDL_GetAsyncIOResult(queue, &outcome)) {  /* a .bmp file load has finished? */
+        if (outcome.result == SDL_ASYNCIO_COMPLETE) {
+            /* this might be _any_ of the bmps; they might finish loading in any order. */
+            for (i = 0; i < SDL_arraysize(bmps); i++) {
+                /* this doesn't need a strcmp because we gave the pointer from this array to SDL_LoadFileAsync */
+                if (outcome.userdata == bmps[i]) {
+                    break;
+                }
+            }
+
+            if (i < SDL_arraysize(bmps)) {  /* (just in case.) */
+                SDL_Surface *surface = SDL_LoadBMP_IO(SDL_IOFromConstMem(outcome.buffer, (size_t) outcome.bytes_transferred), true);
+                if (surface) {  /* the renderer is not multithreaded, so create the texture here once the data loads. */
+                    textures[i] = SDL_CreateTextureFromSurface(renderer, surface);
+                    if (!textures[i]) {
+                        SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Couldn't create texture!", SDL_GetError(), NULL);
+                        return SDL_APP_FAILURE;
+                    }
+                    SDL_DestroySurface(surface);
+                }
+            }
+        }
+        SDL_free(outcome.buffer);
+    }
+
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
+    SDL_RenderClear(renderer);
+
+    for (i = 0; i < SDL_arraysize(textures); i++) {
+        SDL_RenderTexture(renderer, textures[i], NULL, &texture_rects[i]);
+    }
+
+    SDL_RenderPresent(renderer);
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs once at shutdown. */
+void SDL_AppQuit(void *appstate, SDL_AppResult result)
+{
+    int i;
+
+    SDL_DestroyAsyncIOQueue(queue);
+
+    for (i = 0; i < SDL_arraysize(textures); i++) {
+        SDL_DestroyTexture(textures[i]);
+    }
+
+    /* SDL will clean up the window/renderer for us. */
+}
+

BIN
libs/SDL3/examples/asyncio/01-load-bitmaps/thumbnail.png


+ 1 - 0
libs/SDL3/examples/asyncio/description.txt

@@ -0,0 +1 @@
+Asynchronous I/O

+ 5 - 0
libs/SDL3/examples/audio/04-multiple-streams/README.txt

@@ -0,0 +1,5 @@
+If you're running this in a web browser, you need to click the window before you'll hear anything!
+
+This example code loads two .wav files, puts them an audio streams and binds
+them for playback, repeating both sounds on loop. This shows several streams
+mixing into a single playback device.

+ 135 - 0
libs/SDL3/examples/audio/04-multiple-streams/multiple-streams.c

@@ -0,0 +1,135 @@
+/*
+ * This example code loads two .wav files, puts them an audio streams and
+ * binds them for playback, repeating both sounds on loop. This shows several
+ * streams mixing into a single playback device.
+ *
+ * This code is public domain. Feel free to use it for any purpose!
+ */
+
+#define SDL_MAIN_USE_CALLBACKS 1  /* use the callbacks instead of main() */
+#include <SDL3/SDL.h>
+#include <SDL3/SDL_main.h>
+
+/* We will use this renderer to draw into this window every frame. */
+static SDL_Window *window = NULL;
+static SDL_Renderer *renderer = NULL;
+static SDL_AudioDeviceID audio_device = 0;
+
+/* things that are playing sound (the audiostream itself, plus the original data, so we can refill to loop. */
+typedef struct Sound {
+    Uint8 *wav_data;
+    Uint32 wav_data_len;
+    SDL_AudioStream *stream;
+} Sound;
+
+static Sound sounds[2];
+
+static bool init_sound(const char *fname, Sound *sound)
+{
+    bool retval = false;
+    SDL_AudioSpec spec;
+    char *wav_path = NULL;
+
+    /* Load the .wav files from wherever the app is being run from. */
+    SDL_asprintf(&wav_path, "%s%s", SDL_GetBasePath(), fname);  /* allocate a string of the full file path */
+    if (!SDL_LoadWAV(wav_path, &spec, &sound->wav_data, &sound->wav_data_len)) {
+        SDL_Log("Couldn't load .wav file: %s", SDL_GetError());
+        return false;
+    }
+
+    /* Create an audio stream. Set the source format to the wav's format (what
+       we'll input), leave the dest format NULL here (it'll change to what the
+       device wants once we bind it). */
+    sound->stream = SDL_CreateAudioStream(&spec, NULL);
+    if (!sound->stream) {
+        SDL_Log("Couldn't create audio stream: %s", SDL_GetError());
+    } else if (!SDL_BindAudioStream(audio_device, sound->stream)) {  /* once bound, it'll start playing when there is data available! */
+        SDL_Log("Failed to bind '%s' stream to device: %s", fname, SDL_GetError());
+    } else {
+        retval = true;  /* success! */
+    }
+
+    SDL_free(wav_path);  /* done with this string. */
+    return retval;
+}
+
+
+/* This function runs once at startup. */
+SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
+{
+
+    SDL_SetAppMetadata("Example Audio Multiple Streams", "1.0", "com.example.audio-multiple-streams");
+
+    if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO)) {
+        SDL_Log("Couldn't initialize SDL: %s", SDL_GetError());
+        return SDL_APP_FAILURE;
+    }
+
+    if (!SDL_CreateWindowAndRenderer("examples/audio/multiple-streams", 640, 480, 0, &window, &renderer)) {
+        SDL_Log("Couldn't create window/renderer: %s", SDL_GetError());
+        return SDL_APP_FAILURE;
+    }
+
+    /* open the default audio device in whatever format it prefers; our audio streams will adjust to it. */
+    audio_device = SDL_OpenAudioDevice(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, NULL);
+    if (audio_device == 0) {
+        SDL_Log("Couldn't open audio device: %s", SDL_GetError());
+        return SDL_APP_FAILURE;
+    }
+
+    if (!init_sound("sample.wav", &sounds[0])) {
+        return SDL_APP_FAILURE;
+    } else if (!init_sound("sword.wav", &sounds[1])) {
+        return SDL_APP_FAILURE;
+    }
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs when a new event (mouse input, keypresses, etc) occurs. */
+SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event)
+{
+    if (event->type == SDL_EVENT_QUIT) {
+        return SDL_APP_SUCCESS;  /* end the program, reporting success to the OS. */
+    }
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs once per frame, and is the heart of the program. */
+SDL_AppResult SDL_AppIterate(void *appstate)
+{
+    int i;
+
+    for (i = 0; i < SDL_arraysize(sounds); i++) {
+        /* If less than a full copy of the audio is queued for playback, put another copy in there.
+           This is overkill, but easy when lots of RAM is cheap. One could be more careful and
+           queue less at a time, as long as the stream doesn't run dry.  */
+        if (SDL_GetAudioStreamAvailable(sounds[i].stream) < ((int) sounds[i].wav_data_len)) {
+            SDL_PutAudioStreamData(sounds[i].stream, sounds[i].wav_data, (int) sounds[i].wav_data_len);
+        }
+    }
+
+    /* just blank the screen. */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
+    SDL_RenderClear(renderer);
+    SDL_RenderPresent(renderer);
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs once at shutdown. */
+void SDL_AppQuit(void *appstate, SDL_AppResult result)
+{
+    int i;
+
+    SDL_CloseAudioDevice(audio_device);
+
+    for (i = 0; i < SDL_arraysize(sounds); i++) {
+        if (sounds[i].stream) {
+            SDL_DestroyAudioStream(sounds[i].stream);
+        }
+        SDL_free(sounds[i].wav_data);
+    }
+
+    /* SDL will clean up the window/renderer for us. */
+}

BIN
libs/SDL3/examples/audio/onmouseover.webp


BIN
libs/SDL3/examples/audio/thumbnail.png


BIN
libs/SDL3/examples/camera/01-read-and-draw/onmouseover.webp


BIN
libs/SDL3/examples/camera/01-read-and-draw/thumbnail.png


+ 13 - 0
libs/SDL3/examples/categories.txt

@@ -0,0 +1,13 @@
+# Blank lines and lines that start with '#' in this file are ignored.
+
+# Categories, by directory name, go in here, in the order they should be
+# listed on the main page. If this file is missing, it'll assume any
+# subdirectory is a category and sort them alphabetically.
+
+renderer
+input
+audio
+camera
+asyncio
+pen
+demo

+ 0 - 0
libs/SDL3/examples/game/01-snake/README.txt → libs/SDL3/examples/demo/01-snake/README.txt


BIN
libs/SDL3/examples/demo/01-snake/onmouseover.webp


+ 2 - 2
libs/SDL3/examples/game/01-snake/snake.c → libs/SDL3/examples/demo/01-snake/snake.c

@@ -1,6 +1,6 @@
 /*
 /*
  * Logic implementation of the Snake game. It is designed to efficiently
  * Logic implementation of the Snake game. It is designed to efficiently
- * represent in memory the state of the game.
+ * represent the state of the game in memory.
  *
  *
  * This code is public domain. Feel free to use it for any purpose!
  * This code is public domain. Feel free to use it for any purpose!
  */
  */
@@ -316,7 +316,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
 
 
     *appstate = as;
     *appstate = as;
 
 
-    if (!SDL_CreateWindowAndRenderer("examples/game/snake", SDL_WINDOW_WIDTH, SDL_WINDOW_HEIGHT, 0, &as->window, &as->renderer)) {
+    if (!SDL_CreateWindowAndRenderer("examples/demo/snake", SDL_WINDOW_WIDTH, SDL_WINDOW_HEIGHT, 0, &as->window, &as->renderer)) {
         return SDL_APP_FAILURE;
         return SDL_APP_FAILURE;
     }
     }
 
 

BIN
libs/SDL3/examples/demo/01-snake/thumbnail.png


+ 0 - 0
libs/SDL3/examples/game/02-woodeneye-008/README.txt → libs/SDL3/examples/demo/02-woodeneye-008/README.txt


BIN
libs/SDL3/examples/demo/02-woodeneye-008/onmouseover.webp


BIN
libs/SDL3/examples/demo/02-woodeneye-008/thumbnail.png


+ 1 - 1
libs/SDL3/examples/game/02-woodeneye-008/woodeneye-008.c → libs/SDL3/examples/demo/02-woodeneye-008/woodeneye-008.c

@@ -347,7 +347,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
     if (!SDL_Init(SDL_INIT_VIDEO)) {
     if (!SDL_Init(SDL_INIT_VIDEO)) {
         return SDL_APP_FAILURE;
         return SDL_APP_FAILURE;
     }
     }
-    if (!SDL_CreateWindowAndRenderer("examples/game/woodeneye-008", 640, 480, 0, &as->window, &as->renderer)) {
+    if (!SDL_CreateWindowAndRenderer("examples/demo/woodeneye-008", 640, 480, 0, &as->window, &as->renderer)) {
         return SDL_APP_FAILURE;
         return SDL_APP_FAILURE;
     }
     }
 
 

+ 0 - 0
libs/SDL3/examples/game/03-infinite-monkeys/README.txt → libs/SDL3/examples/demo/03-infinite-monkeys/README.txt


+ 1 - 1
libs/SDL3/examples/game/03-infinite-monkeys/infinite-monkeys.c → libs/SDL3/examples/demo/03-infinite-monkeys/infinite-monkeys.c

@@ -139,7 +139,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
         return SDL_APP_FAILURE;
         return SDL_APP_FAILURE;
     }
     }
 
 
-    if (!SDL_CreateWindowAndRenderer("examples/game/03-infinite-monkeys", 640, 480, 0, &window, &renderer)) {
+    if (!SDL_CreateWindowAndRenderer("examples/demo/infinite-monkeys", 640, 480, 0, &window, &renderer)) {
         SDL_Log("Couldn't create window/renderer: %s", SDL_GetError());
         SDL_Log("Couldn't create window/renderer: %s", SDL_GetError());
         return SDL_APP_FAILURE;
         return SDL_APP_FAILURE;
     }
     }

BIN
libs/SDL3/examples/demo/03-infinite-monkeys/onmouseover.webp


BIN
libs/SDL3/examples/demo/03-infinite-monkeys/thumbnail.png


+ 4 - 0
libs/SDL3/examples/demo/04-bytepusher/README.txt

@@ -0,0 +1,4 @@
+An implementation of the BytePusher VM
+
+For example programs and more information about BytePusher, see
+https://esolangs.org/wiki/BytePusher

+ 416 - 0
libs/SDL3/examples/demo/04-bytepusher/bytepusher.c

@@ -0,0 +1,416 @@
+/*
+ * An implementation of the BytePusher VM.
+ *
+ * For example programs and more information about BytePusher, see
+ * https://esolangs.org/wiki/BytePusher
+ *
+ * This code is public domain. Feel free to use it for any purpose!
+ */
+
+#define SDL_MAIN_USE_CALLBACKS
+#include <SDL3/SDL.h>
+#include <SDL3/SDL_main.h>
+#include <stdarg.h>
+
+#define SCREEN_W 256
+#define SCREEN_H 256
+#define RAM_SIZE 0x1000000
+#define FRAMES_PER_SECOND 60
+#define SAMPLES_PER_FRAME 256
+#define NS_PER_SECOND (Uint64)SDL_NS_PER_SECOND
+#define MAX_AUDIO_LATENCY_FRAMES 5
+
+#define IO_KEYBOARD 0
+#define IO_PC 2
+#define IO_SCREEN_PAGE 5
+#define IO_AUDIO_BANK 6
+
+typedef struct {
+    Uint8 ram[RAM_SIZE + 8];
+    Uint8 screenbuf[SCREEN_W * SCREEN_H];
+    Uint64 last_tick;
+    Uint64 tick_acc;
+    SDL_Window* window;
+    SDL_Renderer* renderer;
+    SDL_Surface* screen; 
+    SDL_Texture* screentex;
+    SDL_Texture* rendertarget; /* we need this render target for text to look good */
+    SDL_AudioStream* audiostream;
+    char status[SCREEN_W / 8];
+    int status_ticks;
+    Uint16 keystate;
+    bool display_help;
+    bool positional_input;
+} BytePusher;
+
+static const struct {
+    const char *key;
+    const char *value;
+} extended_metadata[] = {
+    { SDL_PROP_APP_METADATA_URL_STRING, "https://examples.libsdl.org/SDL3/game/04-bytepusher/" },
+    { SDL_PROP_APP_METADATA_CREATOR_STRING, "SDL team" },
+    { SDL_PROP_APP_METADATA_COPYRIGHT_STRING, "Placed in the public domain" },
+    { SDL_PROP_APP_METADATA_TYPE_STRING, "game" }
+};
+
+static inline Uint16 read_u16(const BytePusher* vm, Uint32 addr) {
+    const Uint8* ptr = &vm->ram[addr];
+    return ((Uint16)ptr[0] << 8) | ((Uint16)ptr[1]);
+}
+
+static inline Uint32 read_u24(const BytePusher* vm, Uint32 addr) {
+    const Uint8* ptr = &vm->ram[addr];
+    return ((Uint32)ptr[0] << 16) | ((Uint32)ptr[1] << 8) | ((Uint32)ptr[2]);
+}
+
+static void set_status(BytePusher* vm, const char* fmt, ...) {
+    va_list args;
+    va_start(args, fmt);
+    SDL_vsnprintf(vm->status, sizeof(vm->status), fmt, args);
+    va_end(args);
+    vm->status[sizeof(vm->status) - 1] = 0;
+    vm->status_ticks = FRAMES_PER_SECOND * 3;
+}
+
+static bool load(BytePusher* vm, SDL_IOStream* stream, bool closeio) {
+    size_t bytes_read = 0;
+    bool ok = true;
+
+    SDL_memset(vm->ram, 0, RAM_SIZE);
+
+    if (!stream) {
+        return false;
+    }
+
+    while (bytes_read < RAM_SIZE) {
+        size_t read = SDL_ReadIO(stream, &vm->ram[bytes_read], RAM_SIZE - bytes_read);
+        bytes_read += read;
+        if (read == 0) {
+            ok = SDL_GetIOStatus(stream) == SDL_IO_STATUS_EOF;
+            break;
+        }
+    }
+    if (closeio) {
+        SDL_CloseIO(stream);
+    }
+
+    SDL_ClearAudioStream(vm->audiostream);
+
+    vm->display_help = !ok;
+    return ok;
+}
+
+static const char* filename(const char* path) {
+    size_t i = SDL_strlen(path) + 1;
+    while (i > 0) {
+        i -= 1;
+        if (path[i] == '/' || path[i] == '\\') {
+            return path + i + 1;
+        }
+    }
+    return path;
+}
+
+static bool load_file(BytePusher* vm, const char* path) {
+    if (load(vm, SDL_IOFromFile(path, "rb"), true)) {
+        set_status(vm, "loaded %s", filename(path));
+        return true;
+    } else {
+        set_status(vm, "load failed: %s", filename(path));
+        return false;
+    }
+}
+
+static void print(BytePusher* vm, int x, int y, const char* str) {
+    SDL_SetRenderDrawColor(vm->renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
+    SDL_RenderDebugText(vm->renderer, (float)(x + 1), (float)(y + 1), str);
+    SDL_SetRenderDrawColor(vm->renderer, 0xff, 0xff, 0xff, SDL_ALPHA_OPAQUE);
+    SDL_RenderDebugText(vm->renderer, (float)x, (float)y, str);
+    SDL_SetRenderDrawColor(vm->renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
+}
+
+SDL_AppResult SDL_AppInit(void** appstate, int argc, char* argv[]) {
+    BytePusher* vm;
+    SDL_Palette* palette;
+    SDL_Rect usable_bounds;
+    SDL_AudioSpec audiospec = { SDL_AUDIO_S8, 1, SAMPLES_PER_FRAME * FRAMES_PER_SECOND };
+    SDL_DisplayID primary_display;
+    SDL_PropertiesID texprops;
+    int zoom = 2;
+    int i;
+    Uint8 r, g, b;
+    (void)argc;
+    (void)argv;
+
+    if (!SDL_SetAppMetadata("SDL 3 BytePusher", "1.0", "com.example.SDL3BytePusher")) {
+        return SDL_APP_FAILURE;
+    }
+
+    for (i = 0; i < (int)SDL_arraysize(extended_metadata); i++) {
+        if (!SDL_SetAppMetadataProperty(extended_metadata[i].key, extended_metadata[i].value)) {
+            return SDL_APP_FAILURE;
+        }
+    }
+
+    if (!SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO)) {
+        return SDL_APP_FAILURE;
+    }
+
+    if (!(vm = SDL_calloc(1, sizeof(*vm)))) {
+        return SDL_APP_FAILURE;
+    }
+    *(BytePusher**)appstate = vm;
+
+    vm->display_help = true;
+
+    primary_display = SDL_GetPrimaryDisplay();
+    if (SDL_GetDisplayUsableBounds(primary_display, &usable_bounds)) {
+        int zoom_w = (usable_bounds.w - usable_bounds.x) * 2 / 3 / SCREEN_W;
+        int zoom_h = (usable_bounds.h - usable_bounds.y) * 2 / 3 / SCREEN_H;
+        zoom = zoom_w < zoom_h ? zoom_w : zoom_h;
+        if (zoom < 1) {
+            zoom = 1;
+        }
+    }
+
+    if (!SDL_CreateWindowAndRenderer("SDL 3 BytePusher",
+        SCREEN_W * zoom, SCREEN_H * zoom, SDL_WINDOW_RESIZABLE,
+        &vm->window, &vm->renderer
+    )) {
+        return SDL_APP_FAILURE;
+    }
+
+    if (!SDL_SetRenderLogicalPresentation(
+        vm->renderer, SCREEN_W, SCREEN_H, SDL_LOGICAL_PRESENTATION_INTEGER_SCALE
+    )) {
+        return SDL_APP_FAILURE;
+    }
+
+    if (!(vm->screen = SDL_CreateSurfaceFrom(
+        SCREEN_W, SCREEN_H, SDL_PIXELFORMAT_INDEX8, vm->screenbuf, SCREEN_W
+    ))) {
+        return SDL_APP_FAILURE;
+    }
+
+    if (!(palette = SDL_CreateSurfacePalette(vm->screen))) {
+        return SDL_APP_FAILURE;
+    }
+    i = 0;
+    for (r = 0; r < 6; ++r) {
+        for (g = 0; g < 6; ++g) {
+            for (b = 0; b < 6; ++b, ++i) {
+                SDL_Color color = { r * 0x33, g * 0x33, b * 0x33, SDL_ALPHA_OPAQUE };
+                palette->colors[i] = color;
+            }
+        }
+    }
+    for (; i < 256; ++i) {
+        SDL_Color color = { 0, 0, 0, SDL_ALPHA_OPAQUE };
+        palette->colors[i] = color;
+    }
+
+    texprops = SDL_CreateProperties();
+    SDL_SetNumberProperty(texprops, SDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER, SDL_TEXTUREACCESS_STREAMING);
+    SDL_SetNumberProperty(texprops, SDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER, SCREEN_W);
+    SDL_SetNumberProperty(texprops, SDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER, SCREEN_H);
+    vm->screentex = SDL_CreateTextureWithProperties(vm->renderer, texprops);
+    SDL_SetNumberProperty(texprops, SDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER, SDL_TEXTUREACCESS_TARGET);
+    vm->rendertarget = SDL_CreateTextureWithProperties(vm->renderer, texprops);
+    SDL_DestroyProperties(texprops);
+    if (!vm->screentex || !vm->rendertarget) {
+        return SDL_APP_FAILURE;
+    }
+    SDL_SetTextureScaleMode(vm->screentex, SDL_SCALEMODE_NEAREST);
+    SDL_SetTextureScaleMode(vm->rendertarget, SDL_SCALEMODE_NEAREST);
+
+    if (!(vm->audiostream = SDL_OpenAudioDeviceStream(
+        SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &audiospec, NULL, NULL
+    ))) {
+        return SDL_APP_FAILURE;
+    }
+    SDL_SetAudioStreamGain(vm->audiostream, 0.1f); /* examples are loud! */
+    SDL_ResumeAudioStreamDevice(vm->audiostream);
+
+    set_status(vm, "renderer: %s", SDL_GetRendererName(vm->renderer));
+
+    vm->last_tick = SDL_GetTicksNS();
+    vm->tick_acc = NS_PER_SECOND;
+
+    return SDL_APP_CONTINUE;
+}
+
+SDL_AppResult SDL_AppIterate(void* appstate) {
+    BytePusher* vm = (BytePusher*)appstate;
+
+    Uint64 tick = SDL_GetTicksNS();
+    Uint64 delta = tick - vm->last_tick;
+    bool updated, skip_audio;
+
+    vm->last_tick = tick;
+
+    vm->tick_acc += delta * FRAMES_PER_SECOND;
+    updated = vm->tick_acc >= NS_PER_SECOND;
+    skip_audio = vm->tick_acc >= MAX_AUDIO_LATENCY_FRAMES * NS_PER_SECOND;
+
+    if (skip_audio) {
+        // don't let audio fall too far behind
+        SDL_ClearAudioStream(vm->audiostream);
+    }
+
+    while (vm->tick_acc >= NS_PER_SECOND) {
+        Uint32 pc;
+        int i;
+
+        vm->tick_acc -= NS_PER_SECOND;
+
+        vm->ram[IO_KEYBOARD] = (Uint8)(vm->keystate >> 8);
+        vm->ram[IO_KEYBOARD + 1] = (Uint8)(vm->keystate);
+
+        pc = read_u24(vm, IO_PC);
+        for (i = 0; i < SCREEN_W * SCREEN_H; ++i) {
+            Uint32 src = read_u24(vm, pc);
+            Uint32 dst = read_u24(vm, pc + 3);
+            vm->ram[dst] = vm->ram[src];
+            pc = read_u24(vm, pc + 6);
+        }
+
+        if (!skip_audio || vm->tick_acc < NS_PER_SECOND) {
+            SDL_PutAudioStreamData(
+                vm->audiostream,
+                &vm->ram[(Uint32)read_u16(vm, IO_AUDIO_BANK) << 8],
+                SAMPLES_PER_FRAME
+            );
+        }
+    }
+
+    if (updated) {
+        SDL_Surface *tex;
+
+        SDL_SetRenderTarget(vm->renderer, vm->rendertarget);
+
+        if (!SDL_LockTextureToSurface(vm->screentex, NULL, &tex)) {
+            return SDL_APP_FAILURE;
+        }
+        vm->screen->pixels = &vm->ram[(Uint32)vm->ram[IO_SCREEN_PAGE] << 16];
+        SDL_BlitSurface(vm->screen, NULL, tex, NULL);
+        SDL_UnlockTexture(vm->screentex);
+
+        SDL_RenderTexture(vm->renderer, vm->screentex, NULL, NULL);
+    }
+
+    if (vm->display_help) {
+        print(vm, 4, 4, "Drop a BytePusher file in this");
+        print(vm, 8, 12, "window to load and run it!");
+        print(vm, 4, 28, "Press ENTER to switch between");
+        print(vm, 8, 36, "positional and symbolic input.");
+    }
+
+    if (vm->status_ticks > 0) {
+        vm->status_ticks -= 1;
+        print(vm, 4, SCREEN_H - 12, vm->status);
+    }
+
+    SDL_SetRenderTarget(vm->renderer, NULL);
+    SDL_RenderClear(vm->renderer);
+    SDL_RenderTexture(vm->renderer, vm->rendertarget, NULL, NULL);
+    SDL_RenderPresent(vm->renderer);
+
+    return SDL_APP_CONTINUE;
+}
+
+static Uint16 keycode_mask(SDL_Keycode key) {
+    int index;
+    if (key >= SDLK_0 && key <= SDLK_9) {
+        index = key - SDLK_0;
+    } else if (key >= SDLK_A && key <= SDLK_F) {
+        index = key - SDLK_A + 10;
+    } else {
+        return 0;
+    }
+    return (Uint16)1 << index;
+}
+
+static Uint16 scancode_mask(SDL_Scancode scancode) {
+    int index;
+    switch (scancode) {
+        case SDL_SCANCODE_1: index = 0x1; break;
+        case SDL_SCANCODE_2: index = 0x2; break;
+        case SDL_SCANCODE_3: index = 0x3; break;
+        case SDL_SCANCODE_4: index = 0xc; break;
+        case SDL_SCANCODE_Q: index = 0x4; break;
+        case SDL_SCANCODE_W: index = 0x5; break;
+        case SDL_SCANCODE_E: index = 0x6; break;
+        case SDL_SCANCODE_R: index = 0xd; break;
+        case SDL_SCANCODE_A: index = 0x7; break;
+        case SDL_SCANCODE_S: index = 0x8; break;
+        case SDL_SCANCODE_D: index = 0x9; break;
+        case SDL_SCANCODE_F: index = 0xe; break;
+        case SDL_SCANCODE_Z: index = 0xa; break;
+        case SDL_SCANCODE_X: index = 0x0; break;
+        case SDL_SCANCODE_C: index = 0xb; break;
+        case SDL_SCANCODE_V: index = 0xf; break;
+        default: return 0;
+    }
+    return (Uint16)1 << index;
+}
+
+SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event) {
+    BytePusher* vm = (BytePusher*)appstate;
+
+    switch (event->type) {
+        case SDL_EVENT_QUIT:
+            return SDL_APP_SUCCESS;
+
+        case SDL_EVENT_DROP_FILE:
+            load_file(vm, event->drop.data);
+            break;
+        
+        case SDL_EVENT_KEY_DOWN:
+#ifndef __EMSCRIPTEN__
+            if (event->key.key == SDLK_ESCAPE) {
+                return SDL_APP_SUCCESS;
+            }
+#endif
+            if (event->key.key == SDLK_RETURN) {
+                vm->positional_input = !vm->positional_input;
+                vm->keystate = 0;
+                if (vm->positional_input) {
+                    set_status(vm, "switched to positional input");
+                } else {
+                    set_status(vm, "switched to symbolic input");
+                }
+            }
+            if (vm->positional_input) {
+                vm->keystate |= scancode_mask(event->key.scancode);
+            } else {
+                vm->keystate |= keycode_mask(event->key.key);
+            }
+            break;
+        
+        case SDL_EVENT_KEY_UP: 
+            if (vm->positional_input) {
+                vm->keystate &= ~scancode_mask(event->key.scancode);
+            } else {
+                vm->keystate &= ~keycode_mask(event->key.key);
+            }
+            break;
+    }
+
+    return SDL_APP_CONTINUE;
+}
+
+void SDL_AppQuit(void* appstate, SDL_AppResult result) {
+    if (result == SDL_APP_FAILURE) {
+        SDL_Log("Error: %s", SDL_GetError());
+    }
+    if (appstate) {
+        BytePusher* vm = (BytePusher*)appstate;
+        SDL_DestroyAudioStream(vm->audiostream);
+        SDL_DestroyTexture(vm->rendertarget);
+        SDL_DestroyTexture(vm->screentex);
+        SDL_DestroySurface(vm->screen);
+        SDL_DestroyRenderer(vm->renderer);
+        SDL_DestroyWindow(vm->window);
+        SDL_free(vm);
+    }
+}

BIN
libs/SDL3/examples/demo/04-bytepusher/onmouseover.webp


BIN
libs/SDL3/examples/demo/04-bytepusher/thumbnail.png


+ 1 - 0
libs/SDL3/examples/demo/description.txt

@@ -0,0 +1 @@
+Full game and app demos

+ 2 - 0
libs/SDL3/examples/input/01-joystick-polling/README.txt

@@ -0,0 +1,2 @@
+This example code looks for the current joystick state once per frame,
+and draws a visual representation of it.

+ 193 - 0
libs/SDL3/examples/input/01-joystick-polling/joystick-polling.c

@@ -0,0 +1,193 @@
+/*
+ * This example code looks for the current joystick state once per frame,
+ * and draws a visual representation of it.
+ *
+ * This code is public domain. Feel free to use it for any purpose!
+ */
+
+/* Joysticks are low-level interfaces: there's something with a bunch of
+   buttons, axes and hats, in no understood order or position. This is
+   a flexible interface, but you'll need to build some sort of configuration
+   UI to let people tell you what button, etc, does what. On top of this
+   interface, SDL offers the "gamepad" API, which works with lots of devices,
+   and knows how to map arbitrary buttons and such to look like an
+   Xbox/PlayStation/etc gamepad. This is easier, and better, for many games,
+   but isn't necessarily a good fit for complex apps and hardware. A flight
+   simulator, a realistic racing game, etc, might want this interface instead
+   of gamepads. */
+
+/* SDL can handle multiple joysticks, but for simplicity, this program only
+   deals with the first stick it sees. */
+
+#define SDL_MAIN_USE_CALLBACKS 1  /* use the callbacks instead of main() */
+#include <SDL3/SDL.h>
+#include <SDL3/SDL_main.h>
+
+/* We will use this renderer to draw into this window every frame. */
+static SDL_Window *window = NULL;
+static SDL_Renderer *renderer = NULL;
+static SDL_Joystick *joystick = NULL;
+static SDL_Color colors[64];
+
+/* This function runs once at startup. */
+SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
+{
+    int i;
+
+    SDL_SetAppMetadata("Example Input Joystick Polling", "1.0", "com.example.input-joystick-polling");
+
+    if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK)) {
+        SDL_Log("Couldn't initialize SDL: %s", SDL_GetError());
+        return SDL_APP_FAILURE;
+    }
+
+    if (!SDL_CreateWindowAndRenderer("examples/input/joystick-polling", 640, 480, 0, &window, &renderer)) {
+        SDL_Log("Couldn't create window/renderer: %s", SDL_GetError());
+        return SDL_APP_FAILURE;
+    }
+
+    for (i = 0; i < SDL_arraysize(colors); i++) {
+        colors[i].r = SDL_rand(255);
+        colors[i].g = SDL_rand(255);
+        colors[i].b = SDL_rand(255);
+        colors[i].a = 255;
+    }
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs when a new event (mouse input, keypresses, etc) occurs. */
+SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event)
+{
+    if (event->type == SDL_EVENT_QUIT) {
+        return SDL_APP_SUCCESS;  /* end the program, reporting success to the OS. */
+    } else if (event->type == SDL_EVENT_JOYSTICK_ADDED) {
+        /* this event is sent for each hotplugged stick, but also each already-connected joystick during SDL_Init(). */
+        if (joystick == NULL) {  /* we don't have a stick yet and one was added, open it! */
+            joystick = SDL_OpenJoystick(event->jdevice.which);
+            if (!joystick) {
+                SDL_Log("Failed to open joystick ID %u: %s", (unsigned int) event->jdevice.which, SDL_GetError());
+            }
+        }
+    } else if (event->type == SDL_EVENT_JOYSTICK_REMOVED) {
+        if (joystick && (SDL_GetJoystickID(joystick) == event->jdevice.which)) {
+            SDL_CloseJoystick(joystick);  /* our joystick was unplugged. */
+            joystick = NULL;
+        }
+    }
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs once per frame, and is the heart of the program. */
+SDL_AppResult SDL_AppIterate(void *appstate)
+{
+    int winw = 640, winh = 480;
+    const char *text = "Plug in a joystick, please.";
+    float x, y;
+    int i;
+
+    if (joystick) {  /* we have a stick opened? */
+        text = SDL_GetJoystickName(joystick);
+    }
+
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
+    SDL_RenderClear(renderer);
+    SDL_GetWindowSize(window, &winw, &winh);
+
+    /* note that you can get input as events, instead of polling, which is
+       better since it won't miss button presses if the system is lagging,
+       but often times checking the current state per-frame is good enough,
+       and maybe better if you'd rather _drop_ inputs due to lag. */
+
+    if (joystick) {  /* we have a stick opened? */
+        const float size = 30.0f;
+        int total;
+
+        /* draw axes as bars going across middle of screen. We don't know if it's an X or Y or whatever axis, so we can't do more than this. */
+        total = SDL_GetNumJoystickAxes(joystick);
+        y = (float) ((winh - (total * size)) / 2);
+        x = ((float) winw) / 2.0f;
+        for (i = 0; i < total; i++) {
+            const SDL_Color *color = &colors[i % SDL_arraysize(colors)];
+            const float val = (((float) SDL_GetJoystickAxis(joystick, i)) / 32767.0f);  /* make it -1.0f to 1.0f */
+            const float dx = x + (val * x);
+            const SDL_FRect dst = { dx, y, x - SDL_fabsf(dx), size };
+            SDL_SetRenderDrawColor(renderer, color->r, color->g, color->b, color->a);
+            SDL_RenderFillRect(renderer, &dst);
+            y += size;
+        }
+
+        /* draw buttons as blocks across top of window. We only know the button numbers, but not where they are on the device. */
+        total = SDL_GetNumJoystickButtons(joystick);
+        x = (float) ((winw - (total * size)) / 2);
+        for (i = 0; i < total; i++) {
+            const SDL_Color *color = &colors[i % SDL_arraysize(colors)];
+            const SDL_FRect dst = { x, 0.0f, size, size };
+            if (SDL_GetJoystickButton(joystick, i)) {
+                SDL_SetRenderDrawColor(renderer, color->r, color->g, color->b, color->a);
+            } else {
+                SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
+            }
+            SDL_RenderFillRect(renderer, &dst);
+            SDL_SetRenderDrawColor(renderer, 255, 255, 255, color->a);
+            SDL_RenderRect(renderer, &dst);  /* outline it */
+            x += size;
+        }
+
+        /* draw hats across the bottom of the screen. */
+        total = SDL_GetNumJoystickHats(joystick);
+        x = ((float) ((winw - (total * (size * 2.0f))) / 2.0f)) + (size / 2.0f);
+        y = ((float) winh) - size;
+        for (i = 0; i < total; i++) {
+            const SDL_Color *color = &colors[i % SDL_arraysize(colors)];
+            const float thirdsize = size / 3.0f;
+            const SDL_FRect cross[] = { { x, y + thirdsize, size, thirdsize }, { x + thirdsize, y, thirdsize, size } };
+            const Uint8 hat = SDL_GetJoystickHat(joystick, i);
+
+            SDL_SetRenderDrawColor(renderer, 90, 90, 90, 255);
+            SDL_RenderFillRects(renderer, cross, SDL_arraysize(cross));
+
+            SDL_SetRenderDrawColor(renderer, color->r, color->g, color->b, color->a);
+
+            if (hat & SDL_HAT_UP) {
+                const SDL_FRect dst = { x + thirdsize, y, thirdsize, thirdsize };
+                SDL_RenderFillRect(renderer, &dst);
+            }
+
+            if (hat & SDL_HAT_RIGHT) {
+                const SDL_FRect dst = { x + (thirdsize * 2), y + thirdsize, thirdsize, thirdsize };
+                SDL_RenderFillRect(renderer, &dst);
+            }
+
+            if (hat & SDL_HAT_DOWN) {
+                const SDL_FRect dst = { x + thirdsize, y + (thirdsize * 2), thirdsize, thirdsize };
+                SDL_RenderFillRect(renderer, &dst);
+            }
+
+            if (hat & SDL_HAT_LEFT) {
+                const SDL_FRect dst = { x, y + thirdsize, thirdsize, thirdsize };
+                SDL_RenderFillRect(renderer, &dst);
+            }
+
+            x += size * 2;
+        }
+    }
+
+    x = (((float) winw) - (SDL_strlen(text) * SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE)) / 2.0f;
+    y = (((float) winh) - SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE) / 2.0f;
+    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
+    SDL_RenderDebugText(renderer, x, y, text);
+    SDL_RenderPresent(renderer);
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs once at shutdown. */
+void SDL_AppQuit(void *appstate, SDL_AppResult result)
+{
+    if (joystick) {
+        SDL_CloseJoystick(joystick);
+    }
+
+    /* SDL will clean up the window/renderer for us. */
+}

BIN
libs/SDL3/examples/input/01-joystick-polling/onmouseover.webp


BIN
libs/SDL3/examples/input/01-joystick-polling/thumbnail.png


+ 2 - 0
libs/SDL3/examples/input/02-joystick-events/README.txt

@@ -0,0 +1,2 @@
+This example code looks for joystick input in the event handler, and
+reports any changes as a flood of info.

+ 232 - 0
libs/SDL3/examples/input/02-joystick-events/joystick-events.c

@@ -0,0 +1,232 @@
+/*
+ * This example code looks for joystick input in the event handler, and
+ * reports any changes as a flood of info.
+ *
+ * This code is public domain. Feel free to use it for any purpose!
+ */
+
+/* Joysticks are low-level interfaces: there's something with a bunch of
+   buttons, axes and hats, in no understood order or position. This is
+   a flexible interface, but you'll need to build some sort of configuration
+   UI to let people tell you what button, etc, does what. On top of this
+   interface, SDL offers the "gamepad" API, which works with lots of devices,
+   and knows how to map arbitrary buttons and such to look like an
+   Xbox/PlayStation/etc gamepad. This is easier, and better, for many games,
+   but isn't necessarily a good fit for complex apps and hardware. A flight
+   simulator, a realistic racing game, etc, might want this interface instead
+   of gamepads. */
+
+#define SDL_MAIN_USE_CALLBACKS 1  /* use the callbacks instead of main() */
+#include <SDL3/SDL.h>
+#include <SDL3/SDL_main.h>
+
+/* We will use this renderer to draw into this window every frame. */
+static SDL_Window *window = NULL;
+static SDL_Renderer *renderer = NULL;
+static SDL_Color colors[64];
+
+#define MOTION_EVENT_COOLDOWN 40
+
+typedef struct EventMessage
+{
+    char *str;
+    SDL_Color color;
+    Uint64 start_ticks;
+    struct EventMessage *next;
+} EventMessage;
+
+static EventMessage messages;
+static EventMessage *messages_tail = &messages;
+
+static const char *hat_state_string(Uint8 state)
+{
+    switch (state) {
+        case SDL_HAT_CENTERED: return "CENTERED";
+        case SDL_HAT_UP: return "UP";
+        case SDL_HAT_RIGHT: return "RIGHT";
+        case SDL_HAT_DOWN: return "DOWN";
+        case SDL_HAT_LEFT: return "LEFT";
+        case SDL_HAT_RIGHTUP: return "RIGHT+UP";
+        case SDL_HAT_RIGHTDOWN: return "RIGHT+DOWN";
+        case SDL_HAT_LEFTUP: return "LEFT+UP";
+        case SDL_HAT_LEFTDOWN: return "LEFT+DOWN";
+        default: break;
+    }
+    return "UNKNOWN";
+}
+
+static const char *battery_state_string(SDL_PowerState state)
+{
+    switch (state) {
+        case SDL_POWERSTATE_ERROR: return "ERROR";
+        case SDL_POWERSTATE_UNKNOWN: return "UNKNOWN";
+        case SDL_POWERSTATE_ON_BATTERY: return "ON BATTERY";
+        case SDL_POWERSTATE_NO_BATTERY: return "NO BATTERY";
+        case SDL_POWERSTATE_CHARGING: return "CHARGING";
+        case SDL_POWERSTATE_CHARGED: return "CHARGED";
+        default: break;
+    }
+    return "UNKNOWN";
+}
+
+static void add_message(SDL_JoystickID jid, const char *fmt, ...)
+{
+    const SDL_Color *color = &colors[((size_t) jid) % SDL_arraysize(colors)];
+    EventMessage *msg = NULL;
+    char *str = NULL;
+    va_list ap;
+
+    msg = (EventMessage *) SDL_calloc(1, sizeof (*msg));
+    if (!msg) {
+        return;  // oh well.
+    }
+
+    va_start(ap, fmt);
+    SDL_vasprintf(&str, fmt, ap);
+    va_end(ap);
+    if (!str) {
+        SDL_free(msg);
+        return;  // oh well.
+    }
+
+    msg->str = str;
+    SDL_copyp(&msg->color, color);
+    msg->start_ticks = SDL_GetTicks();
+    msg->next = NULL;
+
+    messages_tail->next = msg;
+    messages_tail = msg;
+}
+
+
+/* This function runs once at startup. */
+SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
+{
+    int i;
+
+    SDL_SetAppMetadata("Example Input Joystick Events", "1.0", "com.example.input-joystick-events");
+
+    if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK)) {
+        SDL_Log("Couldn't initialize SDL: %s", SDL_GetError());
+        return SDL_APP_FAILURE;
+    }
+
+    if (!SDL_CreateWindowAndRenderer("examples/input/joystick-events", 640, 480, 0, &window, &renderer)) {
+        SDL_Log("Couldn't create window/renderer: %s", SDL_GetError());
+        return SDL_APP_FAILURE;
+    }
+
+    colors[0].r = colors[0].g = colors[0].b = colors[0].a = 255;
+    for (i = 1; i < SDL_arraysize(colors); i++) {
+        colors[i].r = SDL_rand(255);
+        colors[i].g = SDL_rand(255);
+        colors[i].b = SDL_rand(255);
+        colors[i].a = 255;
+    }
+
+    add_message(0, "Please plug in a joystick.");
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs when a new event (mouse input, keypresses, etc) occurs. */
+SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event)
+{
+    if (event->type == SDL_EVENT_QUIT) {
+        return SDL_APP_SUCCESS;  /* end the program, reporting success to the OS. */
+    } else if (event->type == SDL_EVENT_JOYSTICK_ADDED) {
+        /* this event is sent for each hotplugged stick, but also each already-connected joystick during SDL_Init(). */
+        const SDL_JoystickID which = event->jdevice.which;
+        SDL_Joystick *joystick = SDL_OpenJoystick(which);
+        if (!joystick) {
+            add_message(which, "Joystick #%u add, but not opened: %s", (unsigned int) which, SDL_GetError());
+        } else {
+            add_message(which, "Joystick #%u ('%s') added", (unsigned int) which, SDL_GetJoystickName(joystick));
+        }
+    } else if (event->type == SDL_EVENT_JOYSTICK_REMOVED) {
+        const SDL_JoystickID which = event->jdevice.which;
+        SDL_Joystick *joystick = SDL_GetJoystickFromID(which);
+        if (joystick) {
+            SDL_CloseJoystick(joystick);  /* the joystick was unplugged. */
+        }
+        add_message(which, "Joystick #%u removed", (unsigned int) which);
+    } else if (event->type == SDL_EVENT_JOYSTICK_AXIS_MOTION) {
+        static Uint64 axis_motion_cooldown_time = 0;  /* these are spammy, only show every X milliseconds. */
+        const Uint64 now = SDL_GetTicks();
+        if (now >= axis_motion_cooldown_time) {
+            const SDL_JoystickID which = event->jaxis.which;
+            axis_motion_cooldown_time = now + MOTION_EVENT_COOLDOWN;
+            add_message(which, "Joystick #%u axis %d -> %d", (unsigned int) which, (int) event->jaxis.axis, (int) event->jaxis.value);
+        }
+    } else if (event->type == SDL_EVENT_JOYSTICK_BALL_MOTION) {
+        static Uint64 ball_motion_cooldown_time = 0;  /* these are spammy, only show every X milliseconds. */
+        const Uint64 now = SDL_GetTicks();
+        if (now >= ball_motion_cooldown_time) {
+            const SDL_JoystickID which = event->jball.which;
+            ball_motion_cooldown_time = now + MOTION_EVENT_COOLDOWN;
+            add_message(which, "Joystick #%u ball %d -> %d, %d", (unsigned int) which, (int) event->jball.ball, (int) event->jball.xrel, (int) event->jball.yrel);
+        }
+    } else if (event->type == SDL_EVENT_JOYSTICK_HAT_MOTION) {
+        const SDL_JoystickID which = event->jhat.which;
+        add_message(which, "Joystick #%u hat %d -> %s", (unsigned int) which, (int) event->jhat.hat, hat_state_string(event->jhat.value));
+    } else if ((event->type == SDL_EVENT_JOYSTICK_BUTTON_UP) || (event->type == SDL_EVENT_JOYSTICK_BUTTON_DOWN)) {
+        const SDL_JoystickID which = event->jbutton.which;
+        add_message(which, "Joystick #%u button %d -> %s", (unsigned int) which, (int) event->jbutton.button, event->jbutton.down ? "PRESSED" : "RELEASED");
+    } else if (event->type == SDL_EVENT_JOYSTICK_BATTERY_UPDATED) {
+        const SDL_JoystickID which = event->jbattery.which;
+        add_message(which, "Joystick #%u battery -> %s - %d%%", (unsigned int) which, battery_state_string(event->jbattery.state), event->jbattery.percent);
+    }
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs once per frame, and is the heart of the program. */
+SDL_AppResult SDL_AppIterate(void *appstate)
+{
+    const Uint64 now = SDL_GetTicks();
+    const float msg_lifetime = 3500.0f;  /* milliseconds a message lives for. */
+    EventMessage *msg = messages.next;
+    float prev_y = 0.0f;
+    int winw = 640, winh = 480;
+
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
+    SDL_RenderClear(renderer);
+    SDL_GetWindowSize(window, &winw, &winh);
+
+    while (msg) {
+        float x, y;
+        const float life_percent = ((float) (now - msg->start_ticks)) / msg_lifetime;
+        if (life_percent >= 1.0f) {  /* msg is done. */
+            messages.next = msg->next;
+            if (messages_tail == msg) {
+                messages_tail = &messages;
+            }
+            SDL_free(msg->str);
+            SDL_free(msg);
+            msg = messages.next;
+            continue;
+        }
+        x = (((float) winw) - (SDL_strlen(msg->str) * SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE)) / 2.0f;
+        y = ((float) winh) * life_percent;
+        if ((prev_y != 0.0f) && ((prev_y - y) < ((float) SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE))) {
+            msg->start_ticks = now;
+            break;  // wait for the previous message to tick up a little.
+        }
+
+        SDL_SetRenderDrawColor(renderer, msg->color.r, msg->color.g, msg->color.b, (Uint8) (((float) msg->color.a) * (1.0f - life_percent)));
+        SDL_RenderDebugText(renderer, x, y, msg->str);
+
+        prev_y = y;
+        msg = msg->next;
+    }
+    
+    SDL_RenderPresent(renderer);
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs once at shutdown. */
+void SDL_AppQuit(void *appstate, SDL_AppResult result)
+{
+    /* SDL will clean up the window/renderer for us. We let the joysticks leak. */
+}

BIN
libs/SDL3/examples/input/02-joystick-events/onmouseover.webp


BIN
libs/SDL3/examples/input/02-joystick-events/thumbnail.png


BIN
libs/SDL3/examples/pen/01-drawing-lines/onmouseover.webp


BIN
libs/SDL3/examples/pen/01-drawing-lines/thumbnail.png


BIN
libs/SDL3/examples/renderer/01-clear/onmouseover.webp


BIN
libs/SDL3/examples/renderer/01-clear/thumbnail.png


BIN
libs/SDL3/examples/renderer/02-primitives/thumbnail.png


BIN
libs/SDL3/examples/renderer/03-lines/onmouseover.webp


BIN
libs/SDL3/examples/renderer/03-lines/thumbnail.png


BIN
libs/SDL3/examples/renderer/04-points/onmouseover.webp


BIN
libs/SDL3/examples/renderer/04-points/thumbnail.png


BIN
libs/SDL3/examples/renderer/05-rectangles/onmouseover.webp


BIN
libs/SDL3/examples/renderer/05-rectangles/thumbnail.png


BIN
libs/SDL3/examples/renderer/06-textures/onmouseover.webp


BIN
libs/SDL3/examples/renderer/06-textures/thumbnail.png


BIN
libs/SDL3/examples/renderer/07-streaming-textures/onmouseover.webp


BIN
libs/SDL3/examples/renderer/07-streaming-textures/thumbnail.png


BIN
libs/SDL3/examples/renderer/08-rotating-textures/onmouseover.webp


BIN
libs/SDL3/examples/renderer/08-rotating-textures/thumbnail.png


BIN
libs/SDL3/examples/renderer/09-scaling-textures/onmouseover.webp


Some files were not shown because too many files changed in this diff