diff --git a/Frameworks/SDL3.xcframework/Info.plist b/Frameworks/SDL3.xcframework/Info.plist
new file mode 100644
index 0000000..4c3d858
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/Info.plist
@@ -0,0 +1,90 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ SDL3.framework/Versions/A/SDL3
+ LibraryIdentifier
+ macos-arm64_x86_64
+ LibraryPath
+ SDL3.framework
+ SupportedArchitectures
+
+ arm64
+ x86_64
+
+ SupportedPlatform
+ macos
+
+
+ BinaryPath
+ SDL3.framework/SDL3
+ LibraryIdentifier
+ ios-arm64_x86_64-simulator
+ LibraryPath
+ SDL3.framework
+ SupportedArchitectures
+
+ arm64
+ x86_64
+
+ SupportedPlatform
+ ios
+ SupportedPlatformVariant
+ simulator
+
+
+ BinaryPath
+ SDL3.framework/SDL3
+ LibraryIdentifier
+ tvos-arm64
+ LibraryPath
+ SDL3.framework
+ SupportedArchitectures
+
+ arm64
+
+ SupportedPlatform
+ tvos
+
+
+ BinaryPath
+ SDL3.framework/SDL3
+ LibraryIdentifier
+ ios-arm64
+ LibraryPath
+ SDL3.framework
+ SupportedArchitectures
+
+ arm64
+
+ SupportedPlatform
+ ios
+
+
+ BinaryPath
+ SDL3.framework/SDL3
+ LibraryIdentifier
+ tvos-arm64_x86_64-simulator
+ LibraryPath
+ SDL3.framework
+ SupportedArchitectures
+
+ arm64
+ x86_64
+
+ SupportedPlatform
+ tvos
+ SupportedPlatformVariant
+ simulator
+
+
+ CFBundlePackageType
+ XFWK
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/Frameworks/SDL3.xcframework/_CodeSignature/CodeDirectory b/Frameworks/SDL3.xcframework/_CodeSignature/CodeDirectory
new file mode 100644
index 0000000..d977a47
Binary files /dev/null and b/Frameworks/SDL3.xcframework/_CodeSignature/CodeDirectory differ
diff --git a/Frameworks/SDL3.xcframework/_CodeSignature/CodeRequirements b/Frameworks/SDL3.xcframework/_CodeSignature/CodeRequirements
new file mode 100644
index 0000000..550aad6
Binary files /dev/null and b/Frameworks/SDL3.xcframework/_CodeSignature/CodeRequirements differ
diff --git a/Frameworks/SDL3.xcframework/_CodeSignature/CodeRequirements-1 b/Frameworks/SDL3.xcframework/_CodeSignature/CodeRequirements-1
new file mode 100644
index 0000000..29bd254
Binary files /dev/null and b/Frameworks/SDL3.xcframework/_CodeSignature/CodeRequirements-1 differ
diff --git a/Frameworks/SDL3.xcframework/_CodeSignature/CodeResources b/Frameworks/SDL3.xcframework/_CodeSignature/CodeResources
new file mode 100644
index 0000000..f9fb9a4
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/_CodeSignature/CodeResources
@@ -0,0 +1,5976 @@
+
+
+
+
+ files
+
+ .DS_Store
+
+ pI3yUBGseF/r/ImTld2WCmCrCDg=
+
+ ios-arm64/SDL3.framework/CMake/sdl3-config-version.cmake
+
+ gQ+LV+T54JMbmVqczZwWryOwVns=
+
+ ios-arm64/SDL3.framework/CMake/sdl3-config.cmake
+
+ E+bsKFeYRozn4nSWM4OxBPxu3Wo=
+
+ ios-arm64/SDL3.framework/Headers/SDL.h
+
+ FTMTHjsuYteQonu++Ckywry5GVU=
+
+ ios-arm64/SDL3.framework/Headers/SDL_assert.h
+
+ P0NggofzAq3POji+d/Ff5sRjoCY=
+
+ ios-arm64/SDL3.framework/Headers/SDL_atomic.h
+
+ ix/kK20wL//FZQpVEACluxR8g84=
+
+ ios-arm64/SDL3.framework/Headers/SDL_audio.h
+
+ 6VLe7o8LZrzIospLupv0FgnIbjM=
+
+ ios-arm64/SDL3.framework/Headers/SDL_begin_code.h
+
+ 7G18WpoAb9cfZCsf3rik/xI8ZtA=
+
+ ios-arm64/SDL3.framework/Headers/SDL_bits.h
+
+ 9GKUlmUdEkM57qkENBCuQNFOmZk=
+
+ ios-arm64/SDL3.framework/Headers/SDL_blendmode.h
+
+ kY2sXgPn94QaEvGR7lxj8R2RRO0=
+
+ ios-arm64/SDL3.framework/Headers/SDL_camera.h
+
+ /sqKZTtQvj7rsdkz34yMVHEycwk=
+
+ ios-arm64/SDL3.framework/Headers/SDL_clipboard.h
+
+ jdxic1IegrdEvs0uRuyXnjLLlxM=
+
+ ios-arm64/SDL3.framework/Headers/SDL_close_code.h
+
+ stpI2IKLGwyLPg+/VRffIpnJprU=
+
+ ios-arm64/SDL3.framework/Headers/SDL_copying.h
+
+ gJU9ZWFTfu1EWAYO8Eou18UaQzU=
+
+ ios-arm64/SDL3.framework/Headers/SDL_cpuinfo.h
+
+ 55rHaPSpVLQeAZMVANVT9tdXUCM=
+
+ ios-arm64/SDL3.framework/Headers/SDL_dialog.h
+
+ kKKCCkyYlc1KePFlWyj5ew6qKiM=
+
+ ios-arm64/SDL3.framework/Headers/SDL_egl.h
+
+ DFPtq0RjCP4+3UsNLTKNq6adAfI=
+
+ ios-arm64/SDL3.framework/Headers/SDL_endian.h
+
+ hRBYGpJQbPcJHbOa+tk/zLs1Nwo=
+
+ ios-arm64/SDL3.framework/Headers/SDL_error.h
+
+ Ela9DWG/EP3oPMx755ZNrBYmu2Q=
+
+ ios-arm64/SDL3.framework/Headers/SDL_events.h
+
+ bUizFrQhB49dyuQGW5Y0mB5bXVc=
+
+ ios-arm64/SDL3.framework/Headers/SDL_filesystem.h
+
+ usWcz40Sp9rBZ30AJiHJqpvLQFI=
+
+ ios-arm64/SDL3.framework/Headers/SDL_gamepad.h
+
+ S8VEL/ZT27PyCVaH0E0bl4bVjEQ=
+
+ ios-arm64/SDL3.framework/Headers/SDL_guid.h
+
+ +qe4pwSeQDilfoGsQSddhHV2vUw=
+
+ ios-arm64/SDL3.framework/Headers/SDL_haptic.h
+
+ spxndIYWTumv/KqEL1upOaaDbw8=
+
+ ios-arm64/SDL3.framework/Headers/SDL_hidapi.h
+
+ MDTprYwZ0155/rrIVsmAcAHaijE=
+
+ ios-arm64/SDL3.framework/Headers/SDL_hints.h
+
+ 5EwtyU5lf9qyrG2N5/cuACo5+3U=
+
+ ios-arm64/SDL3.framework/Headers/SDL_init.h
+
+ xt+XRyxBSg4hKXoTGTbq4rmw9fw=
+
+ ios-arm64/SDL3.framework/Headers/SDL_intrin.h
+
+ Kq1mo1fZkIH/HKH/amIPdhoTCh4=
+
+ ios-arm64/SDL3.framework/Headers/SDL_iostream.h
+
+ znvH2dvHGuYAL+LrvRzeIQlc1Kw=
+
+ ios-arm64/SDL3.framework/Headers/SDL_joystick.h
+
+ LDFa0Vfu7aUyFrXweYz61XMAtSY=
+
+ ios-arm64/SDL3.framework/Headers/SDL_keyboard.h
+
+ 7bRCUW0PYGdiT5ALqTxyuN8k81o=
+
+ ios-arm64/SDL3.framework/Headers/SDL_keycode.h
+
+ 7nrB/CfwjugeoW8S6GSafPAhCcI=
+
+ ios-arm64/SDL3.framework/Headers/SDL_loadso.h
+
+ 9X7aeCQBaGlVYLl8WHChoD+y7oE=
+
+ ios-arm64/SDL3.framework/Headers/SDL_locale.h
+
+ 3UgabWi37OSUaR5Cv3ykSpFRSFU=
+
+ ios-arm64/SDL3.framework/Headers/SDL_log.h
+
+ AjGovpbmz2+Zjg4vFoA+jRln9Ag=
+
+ ios-arm64/SDL3.framework/Headers/SDL_main.h
+
+ nM5LWIZF3HLAad3qVK5YSL8tPo8=
+
+ ios-arm64/SDL3.framework/Headers/SDL_main_impl.h
+
+ /j/z5uFhPx1k4ignpIT7OuI9eCE=
+
+ ios-arm64/SDL3.framework/Headers/SDL_messagebox.h
+
+ l3z7HIKvgvcl88uPQgwirKUBGxQ=
+
+ ios-arm64/SDL3.framework/Headers/SDL_metal.h
+
+ h/b2709w5AE+fKfTbka2JJvvqDo=
+
+ ios-arm64/SDL3.framework/Headers/SDL_misc.h
+
+ /UKenlwt9bM3OZPOLaAefIawb0s=
+
+ ios-arm64/SDL3.framework/Headers/SDL_mouse.h
+
+ U3/L2aFFC+IFjHHspqA/dnmn/tY=
+
+ ios-arm64/SDL3.framework/Headers/SDL_mutex.h
+
+ wUS9C/TOUloJjZlCpzUTJc2L3Nw=
+
+ ios-arm64/SDL3.framework/Headers/SDL_oldnames.h
+
+ qROTHGOa/EOq6psC86LmkXZEgeA=
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengl.h
+
+ 5XjZdn58klM/ZH4xRL32kWFvwmQ=
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengl_glext.h
+
+ eOvalGUielSzNuOWWDLYkwqpYrg=
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengles.h
+
+ gG8fFwXRxWfFzL5XD2UffDRXZ3Q=
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengles2.h
+
+ AxfYXQsD0wpyQFFalhC2+H+bbJw=
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengles2_gl2.h
+
+ GbD4M9ZIR9sxgLX4G8T/ojLVQJk=
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengles2_gl2ext.h
+
+ frTvd+EfShO/uonAvnnsnPkqc80=
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengles2_gl2platform.h
+
+ JO1DB28zz7TCz/P5YCSvV1PaqWg=
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengles2_khrplatform.h
+
+ mBjqEs+5bGC9u1ED2M93VNzONPQ=
+
+ ios-arm64/SDL3.framework/Headers/SDL_pen.h
+
+ 682iJ7WBcXPP59n6GotWTTLbcF4=
+
+ ios-arm64/SDL3.framework/Headers/SDL_pixels.h
+
+ XMpENyf+JyXMoOlgLXvAVH2XWUk=
+
+ ios-arm64/SDL3.framework/Headers/SDL_platform.h
+
+ ibx+rBzgiofjabvIoz74IR6I520=
+
+ ios-arm64/SDL3.framework/Headers/SDL_platform_defines.h
+
+ /Kbr1IehNE5PCihNTCISGfpFGQE=
+
+ ios-arm64/SDL3.framework/Headers/SDL_power.h
+
+ VXRD8swjN+SVSGXhEHbx5kJjpws=
+
+ ios-arm64/SDL3.framework/Headers/SDL_properties.h
+
+ F150c1qnBNLBgeEUC1TBC6Oouoc=
+
+ ios-arm64/SDL3.framework/Headers/SDL_rect.h
+
+ 8qzy2zRniQeliH43voxw/RVwLZs=
+
+ ios-arm64/SDL3.framework/Headers/SDL_render.h
+
+ E42djJM4TabkF6rgVFoXXb2e6A0=
+
+ ios-arm64/SDL3.framework/Headers/SDL_revision.h
+
+ wPbbJkv48GXw7JirykuAoX/HX+s=
+
+ ios-arm64/SDL3.framework/Headers/SDL_scancode.h
+
+ TFln1sCjEKyQIpVx9Rrexg61/tc=
+
+ ios-arm64/SDL3.framework/Headers/SDL_sensor.h
+
+ 9tubC8rImcEZ176ITWeqmbIEmkY=
+
+ ios-arm64/SDL3.framework/Headers/SDL_stdinc.h
+
+ GK+yk89W1wKKSwfZinmtiLKnkaE=
+
+ ios-arm64/SDL3.framework/Headers/SDL_storage.h
+
+ WMFpkEtzGQBue7CMmxa0KEGpHHo=
+
+ ios-arm64/SDL3.framework/Headers/SDL_surface.h
+
+ OkLZ4CQFo0/pQ8F9tHoo8Gdo6c4=
+
+ ios-arm64/SDL3.framework/Headers/SDL_system.h
+
+ p/vP9wu1luKvxk5pOpa7c+G+AI4=
+
+ ios-arm64/SDL3.framework/Headers/SDL_thread.h
+
+ zj6XYOdz8AUI1EPm52Xzvy24l8k=
+
+ ios-arm64/SDL3.framework/Headers/SDL_time.h
+
+ amXdZSZWmQpHKsgNNVSx+Dzf4pc=
+
+ ios-arm64/SDL3.framework/Headers/SDL_timer.h
+
+ q0F4Eu5yrr8qahWsIiPYFFI+S7U=
+
+ ios-arm64/SDL3.framework/Headers/SDL_touch.h
+
+ akfk8DSVubEtG3EbGDEif0lzP4I=
+
+ ios-arm64/SDL3.framework/Headers/SDL_version.h
+
+ sYkB+NDCq7ZZF0DlML1zmn+k79A=
+
+ ios-arm64/SDL3.framework/Headers/SDL_video.h
+
+ tC+nlvGbjtXBTDtkNVqOSFfwms4=
+
+ ios-arm64/SDL3.framework/Headers/SDL_vulkan.h
+
+ /l3bNRmSicwCYWC83cV/5Cb3tjU=
+
+ ios-arm64/SDL3.framework/Info.plist
+
+ rxJ7AxbIlXq/Nf5y930RIqk6Q3Q=
+
+ ios-arm64/SDL3.framework/License.txt
+
+ A8VTYHTg+gsOssUp337xdGbdHW0=
+
+ ios-arm64/SDL3.framework/ReadMe.txt
+
+ fmvVN4l2bp/qrM2l1v1dfNxJRyo=
+
+ ios-arm64/SDL3.framework/SDL3
+
+ H0bq5Gw4fKpNMRmCvErnzvQzFDM=
+
+ ios-arm64/SDL3.framework/_CodeSignature/CodeResources
+
+ A+64zKzkj57i4N+vSsx2bVC3LaU=
+
+ ios-arm64/SDL3.framework/default.metallib
+
+ Ykm7c+b4FKGjWC7z20zqDT5j6c8=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/CMake/sdl3-config-version.cmake
+
+ gQ+LV+T54JMbmVqczZwWryOwVns=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/CMake/sdl3-config.cmake
+
+ E+bsKFeYRozn4nSWM4OxBPxu3Wo=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL.h
+
+ FTMTHjsuYteQonu++Ckywry5GVU=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_assert.h
+
+ P0NggofzAq3POji+d/Ff5sRjoCY=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_atomic.h
+
+ ix/kK20wL//FZQpVEACluxR8g84=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_audio.h
+
+ 6VLe7o8LZrzIospLupv0FgnIbjM=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_begin_code.h
+
+ 7G18WpoAb9cfZCsf3rik/xI8ZtA=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_bits.h
+
+ 9GKUlmUdEkM57qkENBCuQNFOmZk=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_blendmode.h
+
+ kY2sXgPn94QaEvGR7lxj8R2RRO0=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_camera.h
+
+ /sqKZTtQvj7rsdkz34yMVHEycwk=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_clipboard.h
+
+ jdxic1IegrdEvs0uRuyXnjLLlxM=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_close_code.h
+
+ stpI2IKLGwyLPg+/VRffIpnJprU=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_copying.h
+
+ gJU9ZWFTfu1EWAYO8Eou18UaQzU=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_cpuinfo.h
+
+ 55rHaPSpVLQeAZMVANVT9tdXUCM=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_dialog.h
+
+ kKKCCkyYlc1KePFlWyj5ew6qKiM=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_egl.h
+
+ DFPtq0RjCP4+3UsNLTKNq6adAfI=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_endian.h
+
+ hRBYGpJQbPcJHbOa+tk/zLs1Nwo=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_error.h
+
+ Ela9DWG/EP3oPMx755ZNrBYmu2Q=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_events.h
+
+ bUizFrQhB49dyuQGW5Y0mB5bXVc=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_filesystem.h
+
+ usWcz40Sp9rBZ30AJiHJqpvLQFI=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_gamepad.h
+
+ S8VEL/ZT27PyCVaH0E0bl4bVjEQ=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_guid.h
+
+ +qe4pwSeQDilfoGsQSddhHV2vUw=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_haptic.h
+
+ spxndIYWTumv/KqEL1upOaaDbw8=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hidapi.h
+
+ MDTprYwZ0155/rrIVsmAcAHaijE=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hints.h
+
+ 5EwtyU5lf9qyrG2N5/cuACo5+3U=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_init.h
+
+ xt+XRyxBSg4hKXoTGTbq4rmw9fw=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_intrin.h
+
+ Kq1mo1fZkIH/HKH/amIPdhoTCh4=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_iostream.h
+
+ znvH2dvHGuYAL+LrvRzeIQlc1Kw=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_joystick.h
+
+ LDFa0Vfu7aUyFrXweYz61XMAtSY=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keyboard.h
+
+ 7bRCUW0PYGdiT5ALqTxyuN8k81o=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keycode.h
+
+ 7nrB/CfwjugeoW8S6GSafPAhCcI=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_loadso.h
+
+ 9X7aeCQBaGlVYLl8WHChoD+y7oE=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_locale.h
+
+ 3UgabWi37OSUaR5Cv3ykSpFRSFU=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_log.h
+
+ AjGovpbmz2+Zjg4vFoA+jRln9Ag=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main.h
+
+ nM5LWIZF3HLAad3qVK5YSL8tPo8=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main_impl.h
+
+ /j/z5uFhPx1k4ignpIT7OuI9eCE=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_messagebox.h
+
+ l3z7HIKvgvcl88uPQgwirKUBGxQ=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_metal.h
+
+ h/b2709w5AE+fKfTbka2JJvvqDo=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_misc.h
+
+ /UKenlwt9bM3OZPOLaAefIawb0s=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mouse.h
+
+ U3/L2aFFC+IFjHHspqA/dnmn/tY=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mutex.h
+
+ wUS9C/TOUloJjZlCpzUTJc2L3Nw=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_oldnames.h
+
+ qROTHGOa/EOq6psC86LmkXZEgeA=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengl.h
+
+ 5XjZdn58klM/ZH4xRL32kWFvwmQ=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengl_glext.h
+
+ eOvalGUielSzNuOWWDLYkwqpYrg=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles.h
+
+ gG8fFwXRxWfFzL5XD2UffDRXZ3Q=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2.h
+
+ AxfYXQsD0wpyQFFalhC2+H+bbJw=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_gl2.h
+
+ GbD4M9ZIR9sxgLX4G8T/ojLVQJk=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_gl2ext.h
+
+ frTvd+EfShO/uonAvnnsnPkqc80=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_gl2platform.h
+
+ JO1DB28zz7TCz/P5YCSvV1PaqWg=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_khrplatform.h
+
+ mBjqEs+5bGC9u1ED2M93VNzONPQ=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pen.h
+
+ 682iJ7WBcXPP59n6GotWTTLbcF4=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pixels.h
+
+ XMpENyf+JyXMoOlgLXvAVH2XWUk=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform.h
+
+ ibx+rBzgiofjabvIoz74IR6I520=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform_defines.h
+
+ /Kbr1IehNE5PCihNTCISGfpFGQE=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_power.h
+
+ VXRD8swjN+SVSGXhEHbx5kJjpws=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_properties.h
+
+ F150c1qnBNLBgeEUC1TBC6Oouoc=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_rect.h
+
+ 8qzy2zRniQeliH43voxw/RVwLZs=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_render.h
+
+ E42djJM4TabkF6rgVFoXXb2e6A0=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_revision.h
+
+ wPbbJkv48GXw7JirykuAoX/HX+s=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_scancode.h
+
+ TFln1sCjEKyQIpVx9Rrexg61/tc=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_sensor.h
+
+ 9tubC8rImcEZ176ITWeqmbIEmkY=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_stdinc.h
+
+ GK+yk89W1wKKSwfZinmtiLKnkaE=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_storage.h
+
+ WMFpkEtzGQBue7CMmxa0KEGpHHo=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_surface.h
+
+ OkLZ4CQFo0/pQ8F9tHoo8Gdo6c4=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_system.h
+
+ p/vP9wu1luKvxk5pOpa7c+G+AI4=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_thread.h
+
+ zj6XYOdz8AUI1EPm52Xzvy24l8k=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_time.h
+
+ amXdZSZWmQpHKsgNNVSx+Dzf4pc=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_timer.h
+
+ q0F4Eu5yrr8qahWsIiPYFFI+S7U=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_touch.h
+
+ akfk8DSVubEtG3EbGDEif0lzP4I=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_version.h
+
+ sYkB+NDCq7ZZF0DlML1zmn+k79A=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_video.h
+
+ tC+nlvGbjtXBTDtkNVqOSFfwms4=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_vulkan.h
+
+ /l3bNRmSicwCYWC83cV/5Cb3tjU=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Info.plist
+
+ U6d8MZfvzpGioi2hzmtl6Alh7Kw=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/License.txt
+
+ A8VTYHTg+gsOssUp337xdGbdHW0=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/ReadMe.txt
+
+ fmvVN4l2bp/qrM2l1v1dfNxJRyo=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/SDL3
+
+ PCskDNdfGFVZhhVpPRxWioNQyAM=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/_CodeSignature/CodeResources
+
+ TIEsYO05UH+i8IWfQAPax2prcOI=
+
+ ios-arm64_x86_64-simulator/SDL3.framework/default.metallib
+
+ a2mo7WO50E5tbglYvQP3J9ig25s=
+
+ macos-arm64_x86_64/.DS_Store
+
+ CSq+DW4NFQulmqR2oi0tyatRCCs=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL.h
+
+ FTMTHjsuYteQonu++Ckywry5GVU=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_assert.h
+
+ P0NggofzAq3POji+d/Ff5sRjoCY=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_atomic.h
+
+ ix/kK20wL//FZQpVEACluxR8g84=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_audio.h
+
+ 6VLe7o8LZrzIospLupv0FgnIbjM=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_begin_code.h
+
+ 7G18WpoAb9cfZCsf3rik/xI8ZtA=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_bits.h
+
+ 9GKUlmUdEkM57qkENBCuQNFOmZk=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_blendmode.h
+
+ kY2sXgPn94QaEvGR7lxj8R2RRO0=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_camera.h
+
+ /sqKZTtQvj7rsdkz34yMVHEycwk=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_clipboard.h
+
+ jdxic1IegrdEvs0uRuyXnjLLlxM=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_close_code.h
+
+ stpI2IKLGwyLPg+/VRffIpnJprU=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_copying.h
+
+ gJU9ZWFTfu1EWAYO8Eou18UaQzU=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_cpuinfo.h
+
+ 55rHaPSpVLQeAZMVANVT9tdXUCM=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_dialog.h
+
+ kKKCCkyYlc1KePFlWyj5ew6qKiM=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_egl.h
+
+ DFPtq0RjCP4+3UsNLTKNq6adAfI=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_endian.h
+
+ hRBYGpJQbPcJHbOa+tk/zLs1Nwo=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_error.h
+
+ Ela9DWG/EP3oPMx755ZNrBYmu2Q=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_events.h
+
+ bUizFrQhB49dyuQGW5Y0mB5bXVc=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_filesystem.h
+
+ usWcz40Sp9rBZ30AJiHJqpvLQFI=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_gamepad.h
+
+ S8VEL/ZT27PyCVaH0E0bl4bVjEQ=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_guid.h
+
+ +qe4pwSeQDilfoGsQSddhHV2vUw=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_haptic.h
+
+ spxndIYWTumv/KqEL1upOaaDbw8=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_hidapi.h
+
+ MDTprYwZ0155/rrIVsmAcAHaijE=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_hints.h
+
+ 5EwtyU5lf9qyrG2N5/cuACo5+3U=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_init.h
+
+ xt+XRyxBSg4hKXoTGTbq4rmw9fw=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_intrin.h
+
+ Kq1mo1fZkIH/HKH/amIPdhoTCh4=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_iostream.h
+
+ znvH2dvHGuYAL+LrvRzeIQlc1Kw=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_joystick.h
+
+ LDFa0Vfu7aUyFrXweYz61XMAtSY=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_keyboard.h
+
+ 7bRCUW0PYGdiT5ALqTxyuN8k81o=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_keycode.h
+
+ 7nrB/CfwjugeoW8S6GSafPAhCcI=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_loadso.h
+
+ 9X7aeCQBaGlVYLl8WHChoD+y7oE=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_locale.h
+
+ 3UgabWi37OSUaR5Cv3ykSpFRSFU=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_log.h
+
+ AjGovpbmz2+Zjg4vFoA+jRln9Ag=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_main.h
+
+ nM5LWIZF3HLAad3qVK5YSL8tPo8=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_main_impl.h
+
+ /j/z5uFhPx1k4ignpIT7OuI9eCE=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_messagebox.h
+
+ l3z7HIKvgvcl88uPQgwirKUBGxQ=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_metal.h
+
+ h/b2709w5AE+fKfTbka2JJvvqDo=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_misc.h
+
+ /UKenlwt9bM3OZPOLaAefIawb0s=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_mouse.h
+
+ U3/L2aFFC+IFjHHspqA/dnmn/tY=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_mutex.h
+
+ wUS9C/TOUloJjZlCpzUTJc2L3Nw=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_oldnames.h
+
+ qROTHGOa/EOq6psC86LmkXZEgeA=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengl.h
+
+ 5XjZdn58klM/ZH4xRL32kWFvwmQ=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengl_glext.h
+
+ eOvalGUielSzNuOWWDLYkwqpYrg=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengles.h
+
+ gG8fFwXRxWfFzL5XD2UffDRXZ3Q=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengles2.h
+
+ AxfYXQsD0wpyQFFalhC2+H+bbJw=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengles2_gl2.h
+
+ GbD4M9ZIR9sxgLX4G8T/ojLVQJk=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengles2_gl2ext.h
+
+ frTvd+EfShO/uonAvnnsnPkqc80=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengles2_gl2platform.h
+
+ JO1DB28zz7TCz/P5YCSvV1PaqWg=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengles2_khrplatform.h
+
+ mBjqEs+5bGC9u1ED2M93VNzONPQ=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_pen.h
+
+ 682iJ7WBcXPP59n6GotWTTLbcF4=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_pixels.h
+
+ XMpENyf+JyXMoOlgLXvAVH2XWUk=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_platform.h
+
+ ibx+rBzgiofjabvIoz74IR6I520=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_platform_defines.h
+
+ /Kbr1IehNE5PCihNTCISGfpFGQE=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_power.h
+
+ VXRD8swjN+SVSGXhEHbx5kJjpws=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_properties.h
+
+ F150c1qnBNLBgeEUC1TBC6Oouoc=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_rect.h
+
+ 8qzy2zRniQeliH43voxw/RVwLZs=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_render.h
+
+ E42djJM4TabkF6rgVFoXXb2e6A0=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_revision.h
+
+ wPbbJkv48GXw7JirykuAoX/HX+s=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_scancode.h
+
+ TFln1sCjEKyQIpVx9Rrexg61/tc=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_sensor.h
+
+ 9tubC8rImcEZ176ITWeqmbIEmkY=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_stdinc.h
+
+ GK+yk89W1wKKSwfZinmtiLKnkaE=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_storage.h
+
+ WMFpkEtzGQBue7CMmxa0KEGpHHo=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_surface.h
+
+ OkLZ4CQFo0/pQ8F9tHoo8Gdo6c4=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_system.h
+
+ p/vP9wu1luKvxk5pOpa7c+G+AI4=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_thread.h
+
+ zj6XYOdz8AUI1EPm52Xzvy24l8k=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_time.h
+
+ amXdZSZWmQpHKsgNNVSx+Dzf4pc=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_timer.h
+
+ q0F4Eu5yrr8qahWsIiPYFFI+S7U=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_touch.h
+
+ akfk8DSVubEtG3EbGDEif0lzP4I=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_version.h
+
+ sYkB+NDCq7ZZF0DlML1zmn+k79A=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_video.h
+
+ tC+nlvGbjtXBTDtkNVqOSFfwms4=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_vulkan.h
+
+ /l3bNRmSicwCYWC83cV/5Cb3tjU=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/CMake/sdl3-config-version.cmake
+
+ gQ+LV+T54JMbmVqczZwWryOwVns=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/CMake/sdl3-config.cmake
+
+ E+bsKFeYRozn4nSWM4OxBPxu3Wo=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/Info.plist
+
+ +rA+DhTG8sfSGnkfPHTDfD76jz4=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/License.txt
+
+ A8VTYHTg+gsOssUp337xdGbdHW0=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/ReadMe.txt
+
+ fmvVN4l2bp/qrM2l1v1dfNxJRyo=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/default.metallib
+
+ K8Zg1yQX0y63m9J1c5BKYZN/+gQ=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/SDL3
+
+ RtRSU6xXRxLzf859Cz5dswfwzjw=
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/_CodeSignature/CodeResources
+
+ yuSvdLvTIU0msnVWw9TQ3n9N2HI=
+
+ tvos-arm64/SDL3.framework/CMake/sdl3-config-version.cmake
+
+ gQ+LV+T54JMbmVqczZwWryOwVns=
+
+ tvos-arm64/SDL3.framework/CMake/sdl3-config.cmake
+
+ E+bsKFeYRozn4nSWM4OxBPxu3Wo=
+
+ tvos-arm64/SDL3.framework/Headers/SDL.h
+
+ FTMTHjsuYteQonu++Ckywry5GVU=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_assert.h
+
+ P0NggofzAq3POji+d/Ff5sRjoCY=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_atomic.h
+
+ ix/kK20wL//FZQpVEACluxR8g84=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_audio.h
+
+ 6VLe7o8LZrzIospLupv0FgnIbjM=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_begin_code.h
+
+ 7G18WpoAb9cfZCsf3rik/xI8ZtA=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_bits.h
+
+ 9GKUlmUdEkM57qkENBCuQNFOmZk=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_blendmode.h
+
+ kY2sXgPn94QaEvGR7lxj8R2RRO0=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_camera.h
+
+ /sqKZTtQvj7rsdkz34yMVHEycwk=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_clipboard.h
+
+ jdxic1IegrdEvs0uRuyXnjLLlxM=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_close_code.h
+
+ stpI2IKLGwyLPg+/VRffIpnJprU=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_copying.h
+
+ gJU9ZWFTfu1EWAYO8Eou18UaQzU=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_cpuinfo.h
+
+ 55rHaPSpVLQeAZMVANVT9tdXUCM=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_dialog.h
+
+ kKKCCkyYlc1KePFlWyj5ew6qKiM=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_egl.h
+
+ DFPtq0RjCP4+3UsNLTKNq6adAfI=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_endian.h
+
+ hRBYGpJQbPcJHbOa+tk/zLs1Nwo=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_error.h
+
+ Ela9DWG/EP3oPMx755ZNrBYmu2Q=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_events.h
+
+ bUizFrQhB49dyuQGW5Y0mB5bXVc=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_filesystem.h
+
+ usWcz40Sp9rBZ30AJiHJqpvLQFI=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_gamepad.h
+
+ S8VEL/ZT27PyCVaH0E0bl4bVjEQ=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_guid.h
+
+ +qe4pwSeQDilfoGsQSddhHV2vUw=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_haptic.h
+
+ spxndIYWTumv/KqEL1upOaaDbw8=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_hidapi.h
+
+ MDTprYwZ0155/rrIVsmAcAHaijE=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_hints.h
+
+ 5EwtyU5lf9qyrG2N5/cuACo5+3U=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_init.h
+
+ xt+XRyxBSg4hKXoTGTbq4rmw9fw=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_intrin.h
+
+ Kq1mo1fZkIH/HKH/amIPdhoTCh4=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_iostream.h
+
+ znvH2dvHGuYAL+LrvRzeIQlc1Kw=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_joystick.h
+
+ LDFa0Vfu7aUyFrXweYz61XMAtSY=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_keyboard.h
+
+ 7bRCUW0PYGdiT5ALqTxyuN8k81o=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_keycode.h
+
+ 7nrB/CfwjugeoW8S6GSafPAhCcI=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_loadso.h
+
+ 9X7aeCQBaGlVYLl8WHChoD+y7oE=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_locale.h
+
+ 3UgabWi37OSUaR5Cv3ykSpFRSFU=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_log.h
+
+ AjGovpbmz2+Zjg4vFoA+jRln9Ag=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_main.h
+
+ nM5LWIZF3HLAad3qVK5YSL8tPo8=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_main_impl.h
+
+ /j/z5uFhPx1k4ignpIT7OuI9eCE=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_messagebox.h
+
+ l3z7HIKvgvcl88uPQgwirKUBGxQ=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_metal.h
+
+ h/b2709w5AE+fKfTbka2JJvvqDo=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_misc.h
+
+ /UKenlwt9bM3OZPOLaAefIawb0s=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_mouse.h
+
+ U3/L2aFFC+IFjHHspqA/dnmn/tY=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_mutex.h
+
+ wUS9C/TOUloJjZlCpzUTJc2L3Nw=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_oldnames.h
+
+ qROTHGOa/EOq6psC86LmkXZEgeA=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengl.h
+
+ 5XjZdn58klM/ZH4xRL32kWFvwmQ=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengl_glext.h
+
+ eOvalGUielSzNuOWWDLYkwqpYrg=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengles.h
+
+ gG8fFwXRxWfFzL5XD2UffDRXZ3Q=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengles2.h
+
+ AxfYXQsD0wpyQFFalhC2+H+bbJw=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengles2_gl2.h
+
+ GbD4M9ZIR9sxgLX4G8T/ojLVQJk=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengles2_gl2ext.h
+
+ frTvd+EfShO/uonAvnnsnPkqc80=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengles2_gl2platform.h
+
+ JO1DB28zz7TCz/P5YCSvV1PaqWg=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengles2_khrplatform.h
+
+ mBjqEs+5bGC9u1ED2M93VNzONPQ=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_pen.h
+
+ 682iJ7WBcXPP59n6GotWTTLbcF4=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_pixels.h
+
+ XMpENyf+JyXMoOlgLXvAVH2XWUk=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_platform.h
+
+ ibx+rBzgiofjabvIoz74IR6I520=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_platform_defines.h
+
+ /Kbr1IehNE5PCihNTCISGfpFGQE=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_power.h
+
+ VXRD8swjN+SVSGXhEHbx5kJjpws=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_properties.h
+
+ F150c1qnBNLBgeEUC1TBC6Oouoc=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_rect.h
+
+ 8qzy2zRniQeliH43voxw/RVwLZs=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_render.h
+
+ E42djJM4TabkF6rgVFoXXb2e6A0=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_revision.h
+
+ wPbbJkv48GXw7JirykuAoX/HX+s=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_scancode.h
+
+ TFln1sCjEKyQIpVx9Rrexg61/tc=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_sensor.h
+
+ 9tubC8rImcEZ176ITWeqmbIEmkY=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_stdinc.h
+
+ GK+yk89W1wKKSwfZinmtiLKnkaE=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_storage.h
+
+ WMFpkEtzGQBue7CMmxa0KEGpHHo=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_surface.h
+
+ OkLZ4CQFo0/pQ8F9tHoo8Gdo6c4=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_system.h
+
+ p/vP9wu1luKvxk5pOpa7c+G+AI4=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_thread.h
+
+ zj6XYOdz8AUI1EPm52Xzvy24l8k=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_time.h
+
+ amXdZSZWmQpHKsgNNVSx+Dzf4pc=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_timer.h
+
+ q0F4Eu5yrr8qahWsIiPYFFI+S7U=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_touch.h
+
+ akfk8DSVubEtG3EbGDEif0lzP4I=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_version.h
+
+ sYkB+NDCq7ZZF0DlML1zmn+k79A=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_video.h
+
+ tC+nlvGbjtXBTDtkNVqOSFfwms4=
+
+ tvos-arm64/SDL3.framework/Headers/SDL_vulkan.h
+
+ /l3bNRmSicwCYWC83cV/5Cb3tjU=
+
+ tvos-arm64/SDL3.framework/Info.plist
+
+ 2vpVmy35bMHbCdB7TQ49HRPWlfw=
+
+ tvos-arm64/SDL3.framework/License.txt
+
+ A8VTYHTg+gsOssUp337xdGbdHW0=
+
+ tvos-arm64/SDL3.framework/ReadMe.txt
+
+ fmvVN4l2bp/qrM2l1v1dfNxJRyo=
+
+ tvos-arm64/SDL3.framework/SDL3
+
+ XG8hvJrkMdSVHH4hZU5e5WH1Dfg=
+
+ tvos-arm64/SDL3.framework/_CodeSignature/CodeResources
+
+ CFH7PslU4Qqi0QPdRVfveo0Eg34=
+
+ tvos-arm64/SDL3.framework/default.metallib
+
+ Ykm7c+b4FKGjWC7z20zqDT5j6c8=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/CMake/sdl3-config-version.cmake
+
+ gQ+LV+T54JMbmVqczZwWryOwVns=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/CMake/sdl3-config.cmake
+
+ E+bsKFeYRozn4nSWM4OxBPxu3Wo=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL.h
+
+ FTMTHjsuYteQonu++Ckywry5GVU=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_assert.h
+
+ P0NggofzAq3POji+d/Ff5sRjoCY=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_atomic.h
+
+ ix/kK20wL//FZQpVEACluxR8g84=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_audio.h
+
+ 6VLe7o8LZrzIospLupv0FgnIbjM=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_begin_code.h
+
+ 7G18WpoAb9cfZCsf3rik/xI8ZtA=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_bits.h
+
+ 9GKUlmUdEkM57qkENBCuQNFOmZk=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_blendmode.h
+
+ kY2sXgPn94QaEvGR7lxj8R2RRO0=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_camera.h
+
+ /sqKZTtQvj7rsdkz34yMVHEycwk=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_clipboard.h
+
+ jdxic1IegrdEvs0uRuyXnjLLlxM=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_close_code.h
+
+ stpI2IKLGwyLPg+/VRffIpnJprU=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_copying.h
+
+ gJU9ZWFTfu1EWAYO8Eou18UaQzU=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_cpuinfo.h
+
+ 55rHaPSpVLQeAZMVANVT9tdXUCM=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_dialog.h
+
+ kKKCCkyYlc1KePFlWyj5ew6qKiM=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_egl.h
+
+ DFPtq0RjCP4+3UsNLTKNq6adAfI=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_endian.h
+
+ hRBYGpJQbPcJHbOa+tk/zLs1Nwo=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_error.h
+
+ Ela9DWG/EP3oPMx755ZNrBYmu2Q=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_events.h
+
+ bUizFrQhB49dyuQGW5Y0mB5bXVc=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_filesystem.h
+
+ usWcz40Sp9rBZ30AJiHJqpvLQFI=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_gamepad.h
+
+ S8VEL/ZT27PyCVaH0E0bl4bVjEQ=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_guid.h
+
+ +qe4pwSeQDilfoGsQSddhHV2vUw=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_haptic.h
+
+ spxndIYWTumv/KqEL1upOaaDbw8=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hidapi.h
+
+ MDTprYwZ0155/rrIVsmAcAHaijE=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hints.h
+
+ 5EwtyU5lf9qyrG2N5/cuACo5+3U=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_init.h
+
+ xt+XRyxBSg4hKXoTGTbq4rmw9fw=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_intrin.h
+
+ Kq1mo1fZkIH/HKH/amIPdhoTCh4=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_iostream.h
+
+ znvH2dvHGuYAL+LrvRzeIQlc1Kw=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_joystick.h
+
+ LDFa0Vfu7aUyFrXweYz61XMAtSY=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keyboard.h
+
+ 7bRCUW0PYGdiT5ALqTxyuN8k81o=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keycode.h
+
+ 7nrB/CfwjugeoW8S6GSafPAhCcI=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_loadso.h
+
+ 9X7aeCQBaGlVYLl8WHChoD+y7oE=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_locale.h
+
+ 3UgabWi37OSUaR5Cv3ykSpFRSFU=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_log.h
+
+ AjGovpbmz2+Zjg4vFoA+jRln9Ag=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main.h
+
+ nM5LWIZF3HLAad3qVK5YSL8tPo8=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main_impl.h
+
+ /j/z5uFhPx1k4ignpIT7OuI9eCE=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_messagebox.h
+
+ l3z7HIKvgvcl88uPQgwirKUBGxQ=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_metal.h
+
+ h/b2709w5AE+fKfTbka2JJvvqDo=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_misc.h
+
+ /UKenlwt9bM3OZPOLaAefIawb0s=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mouse.h
+
+ U3/L2aFFC+IFjHHspqA/dnmn/tY=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mutex.h
+
+ wUS9C/TOUloJjZlCpzUTJc2L3Nw=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_oldnames.h
+
+ qROTHGOa/EOq6psC86LmkXZEgeA=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengl.h
+
+ 5XjZdn58klM/ZH4xRL32kWFvwmQ=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengl_glext.h
+
+ eOvalGUielSzNuOWWDLYkwqpYrg=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles.h
+
+ gG8fFwXRxWfFzL5XD2UffDRXZ3Q=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2.h
+
+ AxfYXQsD0wpyQFFalhC2+H+bbJw=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_gl2.h
+
+ GbD4M9ZIR9sxgLX4G8T/ojLVQJk=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_gl2ext.h
+
+ frTvd+EfShO/uonAvnnsnPkqc80=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_gl2platform.h
+
+ JO1DB28zz7TCz/P5YCSvV1PaqWg=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_khrplatform.h
+
+ mBjqEs+5bGC9u1ED2M93VNzONPQ=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pen.h
+
+ 682iJ7WBcXPP59n6GotWTTLbcF4=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pixels.h
+
+ XMpENyf+JyXMoOlgLXvAVH2XWUk=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform.h
+
+ ibx+rBzgiofjabvIoz74IR6I520=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform_defines.h
+
+ /Kbr1IehNE5PCihNTCISGfpFGQE=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_power.h
+
+ VXRD8swjN+SVSGXhEHbx5kJjpws=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_properties.h
+
+ F150c1qnBNLBgeEUC1TBC6Oouoc=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_rect.h
+
+ 8qzy2zRniQeliH43voxw/RVwLZs=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_render.h
+
+ E42djJM4TabkF6rgVFoXXb2e6A0=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_revision.h
+
+ wPbbJkv48GXw7JirykuAoX/HX+s=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_scancode.h
+
+ TFln1sCjEKyQIpVx9Rrexg61/tc=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_sensor.h
+
+ 9tubC8rImcEZ176ITWeqmbIEmkY=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_stdinc.h
+
+ GK+yk89W1wKKSwfZinmtiLKnkaE=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_storage.h
+
+ WMFpkEtzGQBue7CMmxa0KEGpHHo=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_surface.h
+
+ OkLZ4CQFo0/pQ8F9tHoo8Gdo6c4=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_system.h
+
+ p/vP9wu1luKvxk5pOpa7c+G+AI4=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_thread.h
+
+ zj6XYOdz8AUI1EPm52Xzvy24l8k=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_time.h
+
+ amXdZSZWmQpHKsgNNVSx+Dzf4pc=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_timer.h
+
+ q0F4Eu5yrr8qahWsIiPYFFI+S7U=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_touch.h
+
+ akfk8DSVubEtG3EbGDEif0lzP4I=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_version.h
+
+ sYkB+NDCq7ZZF0DlML1zmn+k79A=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_video.h
+
+ tC+nlvGbjtXBTDtkNVqOSFfwms4=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_vulkan.h
+
+ /l3bNRmSicwCYWC83cV/5Cb3tjU=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Info.plist
+
+ J1O2OrL3k0KC7u2MiY9gGK3XcJI=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/License.txt
+
+ A8VTYHTg+gsOssUp337xdGbdHW0=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/ReadMe.txt
+
+ fmvVN4l2bp/qrM2l1v1dfNxJRyo=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/SDL3
+
+ Rw67gB3KfdCP57+k+MG7Z08e418=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/_CodeSignature/CodeResources
+
+ vIYxq18Z+gEyLlolhSs0uq9hVFk=
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/default.metallib
+
+ 9R086eHZgkyx+wIhdHDaf4ZNx0w=
+
+
+ files2
+
+ ios-arm64/SDL3.framework/CMake/sdl3-config-version.cmake
+
+ hash
+
+ gQ+LV+T54JMbmVqczZwWryOwVns=
+
+ hash2
+
+ o4od03lMXeFmSf7XQVrg+cMoEnzDAA0bJIE6oslEQe0=
+
+
+ ios-arm64/SDL3.framework/CMake/sdl3-config.cmake
+
+ hash
+
+ E+bsKFeYRozn4nSWM4OxBPxu3Wo=
+
+ hash2
+
+ VxylhJ7S86lzsQJvXNKSHDGFR01PL4b7kLkIhMAayCI=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL.h
+
+ hash
+
+ FTMTHjsuYteQonu++Ckywry5GVU=
+
+ hash2
+
+ 9aNi0GcnRnROa/pxub1yt6Svy5od8xyHkKILlFr3Id0=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_assert.h
+
+ hash
+
+ P0NggofzAq3POji+d/Ff5sRjoCY=
+
+ hash2
+
+ pa3PhUKCa5zZ7qBkAbKi/VUMsQ+KCnvkgB55ZJweMOI=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_atomic.h
+
+ hash
+
+ ix/kK20wL//FZQpVEACluxR8g84=
+
+ hash2
+
+ 0ikeN0T0/8NBM68wroRmfzBcVy1b/v+mdKfk6pONi30=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_audio.h
+
+ hash
+
+ 6VLe7o8LZrzIospLupv0FgnIbjM=
+
+ hash2
+
+ 9PtlNNe4RJcxA1KUpmVf0CCaOFD1RKxJ9ePuHzkNgj8=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_begin_code.h
+
+ hash
+
+ 7G18WpoAb9cfZCsf3rik/xI8ZtA=
+
+ hash2
+
+ A7wqJrpVG9rddmswfQLBTYkLCQ7OWHgcK1ERDOYFxF4=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_bits.h
+
+ hash
+
+ 9GKUlmUdEkM57qkENBCuQNFOmZk=
+
+ hash2
+
+ 9qfqBJ/8ebcazXzN5LJhzTpcuAgTZQjBDx2FeM09CpM=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_blendmode.h
+
+ hash
+
+ kY2sXgPn94QaEvGR7lxj8R2RRO0=
+
+ hash2
+
+ p6JBtjwHFvidf/5GdgqM4oRxr4zeL7mYYVNGlyc58UU=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_camera.h
+
+ hash
+
+ /sqKZTtQvj7rsdkz34yMVHEycwk=
+
+ hash2
+
+ 9IltUNp+OEpKhwiiu+fveWW7394bro/il8j5a3e7jgA=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_clipboard.h
+
+ hash
+
+ jdxic1IegrdEvs0uRuyXnjLLlxM=
+
+ hash2
+
+ 5fhZNCfIH2MBmFqmlngmUpV1hwgO+xBgBDptoi0XyzI=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_close_code.h
+
+ hash
+
+ stpI2IKLGwyLPg+/VRffIpnJprU=
+
+ hash2
+
+ bdZE3br3xGggRwF5l6xU5W9vjQUgB9p4t+10F5SEhnA=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_copying.h
+
+ hash
+
+ gJU9ZWFTfu1EWAYO8Eou18UaQzU=
+
+ hash2
+
+ vqH3+9MIb2T5AP0+Wy4Vl4JO7kIr5B/FlRKGbOVButE=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_cpuinfo.h
+
+ hash
+
+ 55rHaPSpVLQeAZMVANVT9tdXUCM=
+
+ hash2
+
+ r0S+Rn9dRrduxf6kk14asFCYsaBsnE241geet6TJY2s=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_dialog.h
+
+ hash
+
+ kKKCCkyYlc1KePFlWyj5ew6qKiM=
+
+ hash2
+
+ p8ld7FxtmlwUpxElqKv452Dw0hixH9S55FtJGYnQU28=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_egl.h
+
+ hash
+
+ DFPtq0RjCP4+3UsNLTKNq6adAfI=
+
+ hash2
+
+ 3bqSsp9JRnF9dLy8lfkfkzv3v6QU0IR7rx35nmXpMGU=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_endian.h
+
+ hash
+
+ hRBYGpJQbPcJHbOa+tk/zLs1Nwo=
+
+ hash2
+
+ leP6qVZ8JVFkYZxzbeCKbYgsuGdQVo72uAVU3UeOmjo=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_error.h
+
+ hash
+
+ Ela9DWG/EP3oPMx755ZNrBYmu2Q=
+
+ hash2
+
+ /p2iNoN6JaAaN0LyZnqVb0WBefbZGv7OxfxIUiLxvrs=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_events.h
+
+ hash
+
+ bUizFrQhB49dyuQGW5Y0mB5bXVc=
+
+ hash2
+
+ bVVuJAyhkuHoa+f8vgRVzpWfDqL1X/bc3DupoC65N7E=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_filesystem.h
+
+ hash
+
+ usWcz40Sp9rBZ30AJiHJqpvLQFI=
+
+ hash2
+
+ 1zr9pYjnlG3v/QoNzQVvmxufNzGn4LIFiB1l1k+xV9Q=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_gamepad.h
+
+ hash
+
+ S8VEL/ZT27PyCVaH0E0bl4bVjEQ=
+
+ hash2
+
+ dPhusBvgBj73h1ZuWsGsCVHHMzXZUlqHnDnb1dMYhro=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_guid.h
+
+ hash
+
+ +qe4pwSeQDilfoGsQSddhHV2vUw=
+
+ hash2
+
+ mZwI6lGgX6SKgxGS+EoWFe0xL4oohP2pVgPpT7kQXjI=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_haptic.h
+
+ hash
+
+ spxndIYWTumv/KqEL1upOaaDbw8=
+
+ hash2
+
+ m81Pi+WNNpjGpsLWM8EkPqolbvJ8cpdj4tYjo4YlKtQ=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_hidapi.h
+
+ hash
+
+ MDTprYwZ0155/rrIVsmAcAHaijE=
+
+ hash2
+
+ hvoNAXTxbTaxT5ZiTZ3/v5VVNJFNGmfMYNsecfet2iQ=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_hints.h
+
+ hash
+
+ 5EwtyU5lf9qyrG2N5/cuACo5+3U=
+
+ hash2
+
+ 0vZJYHQeQCkY3vfqrzCA13jR7Tg2H9WSXMYad6lK2l4=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_init.h
+
+ hash
+
+ xt+XRyxBSg4hKXoTGTbq4rmw9fw=
+
+ hash2
+
+ 7LhP0O26ntkrZdPcCuWRjkXm424l5LA9FQOJtT1i23g=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_intrin.h
+
+ hash
+
+ Kq1mo1fZkIH/HKH/amIPdhoTCh4=
+
+ hash2
+
+ LwGY43+m8i4eQo9+5emflGxQ6iiXTmWXnEh2BmR/sts=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_iostream.h
+
+ hash
+
+ znvH2dvHGuYAL+LrvRzeIQlc1Kw=
+
+ hash2
+
+ GnW3bR48TuvbDNr0hCg5bl/TDI3RDy1ttiGHSzFT5i0=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_joystick.h
+
+ hash
+
+ LDFa0Vfu7aUyFrXweYz61XMAtSY=
+
+ hash2
+
+ 0nBglvFxiGkUIt3RfEezy5bXSmJXUxmkZFciIUzpzRY=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_keyboard.h
+
+ hash
+
+ 7bRCUW0PYGdiT5ALqTxyuN8k81o=
+
+ hash2
+
+ j79zksUOi4vVrBvrnPgQJRD4OIQh3UrxdLRuEglwpig=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_keycode.h
+
+ hash
+
+ 7nrB/CfwjugeoW8S6GSafPAhCcI=
+
+ hash2
+
+ dMX0jYn16Lfy0y7tge9wQX8Q+ubJSxOeESV93wkOE9g=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_loadso.h
+
+ hash
+
+ 9X7aeCQBaGlVYLl8WHChoD+y7oE=
+
+ hash2
+
+ Jg/UDLpydORtxkFxbz0XhfNF2Eu302GUG1itkizeXjU=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_locale.h
+
+ hash
+
+ 3UgabWi37OSUaR5Cv3ykSpFRSFU=
+
+ hash2
+
+ B9dUnAsKgcSvvP+eUqf+22xxGX/OmH5eyeBFBSJiDPY=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_log.h
+
+ hash
+
+ AjGovpbmz2+Zjg4vFoA+jRln9Ag=
+
+ hash2
+
+ bUvABdplbCd9/U2eiT2pvPW6VBjJODvBDf8Fu6SnN6M=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_main.h
+
+ hash
+
+ nM5LWIZF3HLAad3qVK5YSL8tPo8=
+
+ hash2
+
+ IJWH/4Oc+C0x3p9ywKE4u7Hu+SWaM1JorQRf7hGqmIc=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_main_impl.h
+
+ hash
+
+ /j/z5uFhPx1k4ignpIT7OuI9eCE=
+
+ hash2
+
+ Ju+WlVFk6UcLLVDkNB5EfpFUqT8U4UboWRfUf8TpC0w=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_messagebox.h
+
+ hash
+
+ l3z7HIKvgvcl88uPQgwirKUBGxQ=
+
+ hash2
+
+ uCj0WyHGh8ddQKtPMVQZWCqqsGJBmICQIPJackUC7gc=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_metal.h
+
+ hash
+
+ h/b2709w5AE+fKfTbka2JJvvqDo=
+
+ hash2
+
+ ZnJqoHPIv5xmwZH3Ya/X2Ck2KFHEJFusU9D7jf2SZmw=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_misc.h
+
+ hash
+
+ /UKenlwt9bM3OZPOLaAefIawb0s=
+
+ hash2
+
+ 6xTiBSCOYB6LgCtJjrtEPSu3UNlBDOJq5Ce5PR6FdQ0=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_mouse.h
+
+ hash
+
+ U3/L2aFFC+IFjHHspqA/dnmn/tY=
+
+ hash2
+
+ wq2m7lfzfam1bamOmxGBdhjM15QZoabP5kWs/nKh25c=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_mutex.h
+
+ hash
+
+ wUS9C/TOUloJjZlCpzUTJc2L3Nw=
+
+ hash2
+
+ mrt3RuUB/NshrAhNF/Nw5GyUhZ/NS7QPsYOLBhbSQV4=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_oldnames.h
+
+ hash
+
+ qROTHGOa/EOq6psC86LmkXZEgeA=
+
+ hash2
+
+ o8g5jafePszDFnXDKO06Y4WMXEF4kFLbZUotQ8NfiR4=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengl.h
+
+ hash
+
+ 5XjZdn58klM/ZH4xRL32kWFvwmQ=
+
+ hash2
+
+ r7KreHSdayrs85RILI8Xgh+JizNq9Vuze3oi1N7dLnw=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengl_glext.h
+
+ hash
+
+ eOvalGUielSzNuOWWDLYkwqpYrg=
+
+ hash2
+
+ GrsoiRybBmG2/zdJ3iZx2l/hK+tbyxgzsta99ciezfg=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengles.h
+
+ hash
+
+ gG8fFwXRxWfFzL5XD2UffDRXZ3Q=
+
+ hash2
+
+ aoo42jon38SwoJd6YxYz+gpHtBEECX685KyFqnRG/yY=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengles2.h
+
+ hash
+
+ AxfYXQsD0wpyQFFalhC2+H+bbJw=
+
+ hash2
+
+ mfh8cJuZsq8zI8LZw40h4NqpQ16HNuHhbbVHw1q6ZqU=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengles2_gl2.h
+
+ hash
+
+ GbD4M9ZIR9sxgLX4G8T/ojLVQJk=
+
+ hash2
+
+ 1uxEsdc/OvzjogrGl223+z2sZWxRkPC1Y+TOkNeaFao=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengles2_gl2ext.h
+
+ hash
+
+ frTvd+EfShO/uonAvnnsnPkqc80=
+
+ hash2
+
+ T8WwA03N6cElki4+cNAUiaazNQdoVu5mApThpjBaNxk=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengles2_gl2platform.h
+
+ hash
+
+ JO1DB28zz7TCz/P5YCSvV1PaqWg=
+
+ hash2
+
+ R3m+mZrNGQRFgjjwnIaYO3lgrEDmEuBdstuX22FfHg8=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_opengles2_khrplatform.h
+
+ hash
+
+ mBjqEs+5bGC9u1ED2M93VNzONPQ=
+
+ hash2
+
+ ex4Bqqetj2/DS1x733nr9RibsJ4sTS55/F01BiPRHoM=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_pen.h
+
+ hash
+
+ 682iJ7WBcXPP59n6GotWTTLbcF4=
+
+ hash2
+
+ IrLPuD9df4GLhqVPV/wYLsMNDtDFlMhMCWC6iOtBQrY=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_pixels.h
+
+ hash
+
+ XMpENyf+JyXMoOlgLXvAVH2XWUk=
+
+ hash2
+
+ /59bliEM9/q7EYaDYAaaH1k0ms7HViADLQUqWEbrqtw=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_platform.h
+
+ hash
+
+ ibx+rBzgiofjabvIoz74IR6I520=
+
+ hash2
+
+ AWapRPc+AyddZhvn1FMjdcIJdX7crJ1mN78vxLVxm+Y=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_platform_defines.h
+
+ hash
+
+ /Kbr1IehNE5PCihNTCISGfpFGQE=
+
+ hash2
+
+ uRsNq1jA7eXKXqnDtikD181YR+p1cz0EfDnR4VDIpZo=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_power.h
+
+ hash
+
+ VXRD8swjN+SVSGXhEHbx5kJjpws=
+
+ hash2
+
+ UcZ2bS20U4hBnqMc794XIqIxSHx2Xzu+v8TM+ECQPhg=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_properties.h
+
+ hash
+
+ F150c1qnBNLBgeEUC1TBC6Oouoc=
+
+ hash2
+
+ CiomCgkVq6u+WWo2vh+ItNU1JkGtn2HpguEqRlTQzQM=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_rect.h
+
+ hash
+
+ 8qzy2zRniQeliH43voxw/RVwLZs=
+
+ hash2
+
+ kY0XN2lKfI3uLvu7ONQmz7rKppdkMxhw+WKqNW6uxAA=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_render.h
+
+ hash
+
+ E42djJM4TabkF6rgVFoXXb2e6A0=
+
+ hash2
+
+ FVECH+hM+0ohtw2q5nhcqxzGJF0CHZe6OmQCAQIhaC0=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_revision.h
+
+ hash
+
+ wPbbJkv48GXw7JirykuAoX/HX+s=
+
+ hash2
+
+ teAz/wtokUzr1b4mFKTyJE22JNx6UFN1UXg77FNf9ak=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_scancode.h
+
+ hash
+
+ TFln1sCjEKyQIpVx9Rrexg61/tc=
+
+ hash2
+
+ y1LYdhxjN9fO3uY50Ke9sVZ9nKBn2K1LPcjLVYhMOkY=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_sensor.h
+
+ hash
+
+ 9tubC8rImcEZ176ITWeqmbIEmkY=
+
+ hash2
+
+ v4+qhML/25/KBtrv+0p6dfHAuvavG18gXtMdEb8dOAE=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_stdinc.h
+
+ hash
+
+ GK+yk89W1wKKSwfZinmtiLKnkaE=
+
+ hash2
+
+ q8U9OkKiiFSTw63QEqOcQVSHDrye4ql96xRlNnQexrI=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_storage.h
+
+ hash
+
+ WMFpkEtzGQBue7CMmxa0KEGpHHo=
+
+ hash2
+
+ +JyqT3bSkEbASqBLXQdWz1gUsEYDzbme6sxq4gsC3wQ=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_surface.h
+
+ hash
+
+ OkLZ4CQFo0/pQ8F9tHoo8Gdo6c4=
+
+ hash2
+
+ WEzdMAWctrJAv+EVRFvXjGyiNgbwKzJfSbOUK3Ie0KY=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_system.h
+
+ hash
+
+ p/vP9wu1luKvxk5pOpa7c+G+AI4=
+
+ hash2
+
+ SV7kGEe9BC+Z2/7QBwUSFhDMAmmM/fRed60ZEIIkuUY=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_thread.h
+
+ hash
+
+ zj6XYOdz8AUI1EPm52Xzvy24l8k=
+
+ hash2
+
+ Bh60e3q2kAgdB5+SI20aAeGaPnla7y8zrjrxJGS2bm0=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_time.h
+
+ hash
+
+ amXdZSZWmQpHKsgNNVSx+Dzf4pc=
+
+ hash2
+
+ 9MOdJKaCKHDZTKVRGavBiUP4X2nuV9avu4GDi0HPPcQ=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_timer.h
+
+ hash
+
+ q0F4Eu5yrr8qahWsIiPYFFI+S7U=
+
+ hash2
+
+ a2YcPY1PJY1dYcj2dNehwKIwD+j8PEvdvcbJ8jNprZ0=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_touch.h
+
+ hash
+
+ akfk8DSVubEtG3EbGDEif0lzP4I=
+
+ hash2
+
+ 17lNGQel6VfvWYFT5WpZHW/4BZLIfas87t3u87SbFc4=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_version.h
+
+ hash
+
+ sYkB+NDCq7ZZF0DlML1zmn+k79A=
+
+ hash2
+
+ SIdy/p8X6AWtsjbKuapx3GGOdWKPKIwWJI2jWKcz43M=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_video.h
+
+ hash
+
+ tC+nlvGbjtXBTDtkNVqOSFfwms4=
+
+ hash2
+
+ chXwjgFTNkmjS1VAavg8PiZ1KgNK1EXniIfbOtg8bVQ=
+
+
+ ios-arm64/SDL3.framework/Headers/SDL_vulkan.h
+
+ hash
+
+ /l3bNRmSicwCYWC83cV/5Cb3tjU=
+
+ hash2
+
+ XuJ8rZGpOCSBnlWxX1BTv8BXdYTX30nvBvvpQuybC9c=
+
+
+ ios-arm64/SDL3.framework/Info.plist
+
+ hash
+
+ rxJ7AxbIlXq/Nf5y930RIqk6Q3Q=
+
+ hash2
+
+ jqNn5One0afv0bZRJuPvEZRz61/s+ZtKjP8JB3KWLeM=
+
+
+ ios-arm64/SDL3.framework/License.txt
+
+ hash
+
+ A8VTYHTg+gsOssUp337xdGbdHW0=
+
+ hash2
+
+ UN4cvaEc5FbrLcR2jBIsS5miYCucbhF1iAKC2EMtJhM=
+
+
+ ios-arm64/SDL3.framework/ReadMe.txt
+
+ hash
+
+ fmvVN4l2bp/qrM2l1v1dfNxJRyo=
+
+ hash2
+
+ gUne5zwAtztNlmXGwQhk5IppZm4RJ3GYBlIcGoKHQXw=
+
+
+ ios-arm64/SDL3.framework/SDL3
+
+ hash
+
+ H0bq5Gw4fKpNMRmCvErnzvQzFDM=
+
+ hash2
+
+ ilJBPUerw/yHFB6+Zp/t10tfPeWOnpnkIAGOip7nB6Y=
+
+
+ ios-arm64/SDL3.framework/_CodeSignature/CodeResources
+
+ hash
+
+ A+64zKzkj57i4N+vSsx2bVC3LaU=
+
+ hash2
+
+ MuyXrXY5TYEhaCtCObj2riVlcb28kP4WMLz+566sb3A=
+
+
+ ios-arm64/SDL3.framework/default.metallib
+
+ hash
+
+ Ykm7c+b4FKGjWC7z20zqDT5j6c8=
+
+ hash2
+
+ 4v4H9kAweVh4NIhwwSvGk2KKPas3TT8OuiqN43M5Q5o=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/CMake/sdl3-config-version.cmake
+
+ hash
+
+ gQ+LV+T54JMbmVqczZwWryOwVns=
+
+ hash2
+
+ o4od03lMXeFmSf7XQVrg+cMoEnzDAA0bJIE6oslEQe0=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/CMake/sdl3-config.cmake
+
+ hash
+
+ E+bsKFeYRozn4nSWM4OxBPxu3Wo=
+
+ hash2
+
+ VxylhJ7S86lzsQJvXNKSHDGFR01PL4b7kLkIhMAayCI=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL.h
+
+ hash
+
+ FTMTHjsuYteQonu++Ckywry5GVU=
+
+ hash2
+
+ 9aNi0GcnRnROa/pxub1yt6Svy5od8xyHkKILlFr3Id0=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_assert.h
+
+ hash
+
+ P0NggofzAq3POji+d/Ff5sRjoCY=
+
+ hash2
+
+ pa3PhUKCa5zZ7qBkAbKi/VUMsQ+KCnvkgB55ZJweMOI=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_atomic.h
+
+ hash
+
+ ix/kK20wL//FZQpVEACluxR8g84=
+
+ hash2
+
+ 0ikeN0T0/8NBM68wroRmfzBcVy1b/v+mdKfk6pONi30=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_audio.h
+
+ hash
+
+ 6VLe7o8LZrzIospLupv0FgnIbjM=
+
+ hash2
+
+ 9PtlNNe4RJcxA1KUpmVf0CCaOFD1RKxJ9ePuHzkNgj8=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_begin_code.h
+
+ hash
+
+ 7G18WpoAb9cfZCsf3rik/xI8ZtA=
+
+ hash2
+
+ A7wqJrpVG9rddmswfQLBTYkLCQ7OWHgcK1ERDOYFxF4=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_bits.h
+
+ hash
+
+ 9GKUlmUdEkM57qkENBCuQNFOmZk=
+
+ hash2
+
+ 9qfqBJ/8ebcazXzN5LJhzTpcuAgTZQjBDx2FeM09CpM=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_blendmode.h
+
+ hash
+
+ kY2sXgPn94QaEvGR7lxj8R2RRO0=
+
+ hash2
+
+ p6JBtjwHFvidf/5GdgqM4oRxr4zeL7mYYVNGlyc58UU=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_camera.h
+
+ hash
+
+ /sqKZTtQvj7rsdkz34yMVHEycwk=
+
+ hash2
+
+ 9IltUNp+OEpKhwiiu+fveWW7394bro/il8j5a3e7jgA=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_clipboard.h
+
+ hash
+
+ jdxic1IegrdEvs0uRuyXnjLLlxM=
+
+ hash2
+
+ 5fhZNCfIH2MBmFqmlngmUpV1hwgO+xBgBDptoi0XyzI=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_close_code.h
+
+ hash
+
+ stpI2IKLGwyLPg+/VRffIpnJprU=
+
+ hash2
+
+ bdZE3br3xGggRwF5l6xU5W9vjQUgB9p4t+10F5SEhnA=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_copying.h
+
+ hash
+
+ gJU9ZWFTfu1EWAYO8Eou18UaQzU=
+
+ hash2
+
+ vqH3+9MIb2T5AP0+Wy4Vl4JO7kIr5B/FlRKGbOVButE=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_cpuinfo.h
+
+ hash
+
+ 55rHaPSpVLQeAZMVANVT9tdXUCM=
+
+ hash2
+
+ r0S+Rn9dRrduxf6kk14asFCYsaBsnE241geet6TJY2s=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_dialog.h
+
+ hash
+
+ kKKCCkyYlc1KePFlWyj5ew6qKiM=
+
+ hash2
+
+ p8ld7FxtmlwUpxElqKv452Dw0hixH9S55FtJGYnQU28=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_egl.h
+
+ hash
+
+ DFPtq0RjCP4+3UsNLTKNq6adAfI=
+
+ hash2
+
+ 3bqSsp9JRnF9dLy8lfkfkzv3v6QU0IR7rx35nmXpMGU=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_endian.h
+
+ hash
+
+ hRBYGpJQbPcJHbOa+tk/zLs1Nwo=
+
+ hash2
+
+ leP6qVZ8JVFkYZxzbeCKbYgsuGdQVo72uAVU3UeOmjo=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_error.h
+
+ hash
+
+ Ela9DWG/EP3oPMx755ZNrBYmu2Q=
+
+ hash2
+
+ /p2iNoN6JaAaN0LyZnqVb0WBefbZGv7OxfxIUiLxvrs=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_events.h
+
+ hash
+
+ bUizFrQhB49dyuQGW5Y0mB5bXVc=
+
+ hash2
+
+ bVVuJAyhkuHoa+f8vgRVzpWfDqL1X/bc3DupoC65N7E=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_filesystem.h
+
+ hash
+
+ usWcz40Sp9rBZ30AJiHJqpvLQFI=
+
+ hash2
+
+ 1zr9pYjnlG3v/QoNzQVvmxufNzGn4LIFiB1l1k+xV9Q=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_gamepad.h
+
+ hash
+
+ S8VEL/ZT27PyCVaH0E0bl4bVjEQ=
+
+ hash2
+
+ dPhusBvgBj73h1ZuWsGsCVHHMzXZUlqHnDnb1dMYhro=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_guid.h
+
+ hash
+
+ +qe4pwSeQDilfoGsQSddhHV2vUw=
+
+ hash2
+
+ mZwI6lGgX6SKgxGS+EoWFe0xL4oohP2pVgPpT7kQXjI=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_haptic.h
+
+ hash
+
+ spxndIYWTumv/KqEL1upOaaDbw8=
+
+ hash2
+
+ m81Pi+WNNpjGpsLWM8EkPqolbvJ8cpdj4tYjo4YlKtQ=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hidapi.h
+
+ hash
+
+ MDTprYwZ0155/rrIVsmAcAHaijE=
+
+ hash2
+
+ hvoNAXTxbTaxT5ZiTZ3/v5VVNJFNGmfMYNsecfet2iQ=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hints.h
+
+ hash
+
+ 5EwtyU5lf9qyrG2N5/cuACo5+3U=
+
+ hash2
+
+ 0vZJYHQeQCkY3vfqrzCA13jR7Tg2H9WSXMYad6lK2l4=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_init.h
+
+ hash
+
+ xt+XRyxBSg4hKXoTGTbq4rmw9fw=
+
+ hash2
+
+ 7LhP0O26ntkrZdPcCuWRjkXm424l5LA9FQOJtT1i23g=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_intrin.h
+
+ hash
+
+ Kq1mo1fZkIH/HKH/amIPdhoTCh4=
+
+ hash2
+
+ LwGY43+m8i4eQo9+5emflGxQ6iiXTmWXnEh2BmR/sts=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_iostream.h
+
+ hash
+
+ znvH2dvHGuYAL+LrvRzeIQlc1Kw=
+
+ hash2
+
+ GnW3bR48TuvbDNr0hCg5bl/TDI3RDy1ttiGHSzFT5i0=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_joystick.h
+
+ hash
+
+ LDFa0Vfu7aUyFrXweYz61XMAtSY=
+
+ hash2
+
+ 0nBglvFxiGkUIt3RfEezy5bXSmJXUxmkZFciIUzpzRY=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keyboard.h
+
+ hash
+
+ 7bRCUW0PYGdiT5ALqTxyuN8k81o=
+
+ hash2
+
+ j79zksUOi4vVrBvrnPgQJRD4OIQh3UrxdLRuEglwpig=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keycode.h
+
+ hash
+
+ 7nrB/CfwjugeoW8S6GSafPAhCcI=
+
+ hash2
+
+ dMX0jYn16Lfy0y7tge9wQX8Q+ubJSxOeESV93wkOE9g=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_loadso.h
+
+ hash
+
+ 9X7aeCQBaGlVYLl8WHChoD+y7oE=
+
+ hash2
+
+ Jg/UDLpydORtxkFxbz0XhfNF2Eu302GUG1itkizeXjU=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_locale.h
+
+ hash
+
+ 3UgabWi37OSUaR5Cv3ykSpFRSFU=
+
+ hash2
+
+ B9dUnAsKgcSvvP+eUqf+22xxGX/OmH5eyeBFBSJiDPY=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_log.h
+
+ hash
+
+ AjGovpbmz2+Zjg4vFoA+jRln9Ag=
+
+ hash2
+
+ bUvABdplbCd9/U2eiT2pvPW6VBjJODvBDf8Fu6SnN6M=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main.h
+
+ hash
+
+ nM5LWIZF3HLAad3qVK5YSL8tPo8=
+
+ hash2
+
+ IJWH/4Oc+C0x3p9ywKE4u7Hu+SWaM1JorQRf7hGqmIc=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main_impl.h
+
+ hash
+
+ /j/z5uFhPx1k4ignpIT7OuI9eCE=
+
+ hash2
+
+ Ju+WlVFk6UcLLVDkNB5EfpFUqT8U4UboWRfUf8TpC0w=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_messagebox.h
+
+ hash
+
+ l3z7HIKvgvcl88uPQgwirKUBGxQ=
+
+ hash2
+
+ uCj0WyHGh8ddQKtPMVQZWCqqsGJBmICQIPJackUC7gc=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_metal.h
+
+ hash
+
+ h/b2709w5AE+fKfTbka2JJvvqDo=
+
+ hash2
+
+ ZnJqoHPIv5xmwZH3Ya/X2Ck2KFHEJFusU9D7jf2SZmw=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_misc.h
+
+ hash
+
+ /UKenlwt9bM3OZPOLaAefIawb0s=
+
+ hash2
+
+ 6xTiBSCOYB6LgCtJjrtEPSu3UNlBDOJq5Ce5PR6FdQ0=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mouse.h
+
+ hash
+
+ U3/L2aFFC+IFjHHspqA/dnmn/tY=
+
+ hash2
+
+ wq2m7lfzfam1bamOmxGBdhjM15QZoabP5kWs/nKh25c=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mutex.h
+
+ hash
+
+ wUS9C/TOUloJjZlCpzUTJc2L3Nw=
+
+ hash2
+
+ mrt3RuUB/NshrAhNF/Nw5GyUhZ/NS7QPsYOLBhbSQV4=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_oldnames.h
+
+ hash
+
+ qROTHGOa/EOq6psC86LmkXZEgeA=
+
+ hash2
+
+ o8g5jafePszDFnXDKO06Y4WMXEF4kFLbZUotQ8NfiR4=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengl.h
+
+ hash
+
+ 5XjZdn58klM/ZH4xRL32kWFvwmQ=
+
+ hash2
+
+ r7KreHSdayrs85RILI8Xgh+JizNq9Vuze3oi1N7dLnw=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengl_glext.h
+
+ hash
+
+ eOvalGUielSzNuOWWDLYkwqpYrg=
+
+ hash2
+
+ GrsoiRybBmG2/zdJ3iZx2l/hK+tbyxgzsta99ciezfg=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles.h
+
+ hash
+
+ gG8fFwXRxWfFzL5XD2UffDRXZ3Q=
+
+ hash2
+
+ aoo42jon38SwoJd6YxYz+gpHtBEECX685KyFqnRG/yY=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2.h
+
+ hash
+
+ AxfYXQsD0wpyQFFalhC2+H+bbJw=
+
+ hash2
+
+ mfh8cJuZsq8zI8LZw40h4NqpQ16HNuHhbbVHw1q6ZqU=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_gl2.h
+
+ hash
+
+ GbD4M9ZIR9sxgLX4G8T/ojLVQJk=
+
+ hash2
+
+ 1uxEsdc/OvzjogrGl223+z2sZWxRkPC1Y+TOkNeaFao=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_gl2ext.h
+
+ hash
+
+ frTvd+EfShO/uonAvnnsnPkqc80=
+
+ hash2
+
+ T8WwA03N6cElki4+cNAUiaazNQdoVu5mApThpjBaNxk=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_gl2platform.h
+
+ hash
+
+ JO1DB28zz7TCz/P5YCSvV1PaqWg=
+
+ hash2
+
+ R3m+mZrNGQRFgjjwnIaYO3lgrEDmEuBdstuX22FfHg8=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_khrplatform.h
+
+ hash
+
+ mBjqEs+5bGC9u1ED2M93VNzONPQ=
+
+ hash2
+
+ ex4Bqqetj2/DS1x733nr9RibsJ4sTS55/F01BiPRHoM=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pen.h
+
+ hash
+
+ 682iJ7WBcXPP59n6GotWTTLbcF4=
+
+ hash2
+
+ IrLPuD9df4GLhqVPV/wYLsMNDtDFlMhMCWC6iOtBQrY=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pixels.h
+
+ hash
+
+ XMpENyf+JyXMoOlgLXvAVH2XWUk=
+
+ hash2
+
+ /59bliEM9/q7EYaDYAaaH1k0ms7HViADLQUqWEbrqtw=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform.h
+
+ hash
+
+ ibx+rBzgiofjabvIoz74IR6I520=
+
+ hash2
+
+ AWapRPc+AyddZhvn1FMjdcIJdX7crJ1mN78vxLVxm+Y=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform_defines.h
+
+ hash
+
+ /Kbr1IehNE5PCihNTCISGfpFGQE=
+
+ hash2
+
+ uRsNq1jA7eXKXqnDtikD181YR+p1cz0EfDnR4VDIpZo=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_power.h
+
+ hash
+
+ VXRD8swjN+SVSGXhEHbx5kJjpws=
+
+ hash2
+
+ UcZ2bS20U4hBnqMc794XIqIxSHx2Xzu+v8TM+ECQPhg=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_properties.h
+
+ hash
+
+ F150c1qnBNLBgeEUC1TBC6Oouoc=
+
+ hash2
+
+ CiomCgkVq6u+WWo2vh+ItNU1JkGtn2HpguEqRlTQzQM=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_rect.h
+
+ hash
+
+ 8qzy2zRniQeliH43voxw/RVwLZs=
+
+ hash2
+
+ kY0XN2lKfI3uLvu7ONQmz7rKppdkMxhw+WKqNW6uxAA=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_render.h
+
+ hash
+
+ E42djJM4TabkF6rgVFoXXb2e6A0=
+
+ hash2
+
+ FVECH+hM+0ohtw2q5nhcqxzGJF0CHZe6OmQCAQIhaC0=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_revision.h
+
+ hash
+
+ wPbbJkv48GXw7JirykuAoX/HX+s=
+
+ hash2
+
+ teAz/wtokUzr1b4mFKTyJE22JNx6UFN1UXg77FNf9ak=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_scancode.h
+
+ hash
+
+ TFln1sCjEKyQIpVx9Rrexg61/tc=
+
+ hash2
+
+ y1LYdhxjN9fO3uY50Ke9sVZ9nKBn2K1LPcjLVYhMOkY=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_sensor.h
+
+ hash
+
+ 9tubC8rImcEZ176ITWeqmbIEmkY=
+
+ hash2
+
+ v4+qhML/25/KBtrv+0p6dfHAuvavG18gXtMdEb8dOAE=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_stdinc.h
+
+ hash
+
+ GK+yk89W1wKKSwfZinmtiLKnkaE=
+
+ hash2
+
+ q8U9OkKiiFSTw63QEqOcQVSHDrye4ql96xRlNnQexrI=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_storage.h
+
+ hash
+
+ WMFpkEtzGQBue7CMmxa0KEGpHHo=
+
+ hash2
+
+ +JyqT3bSkEbASqBLXQdWz1gUsEYDzbme6sxq4gsC3wQ=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_surface.h
+
+ hash
+
+ OkLZ4CQFo0/pQ8F9tHoo8Gdo6c4=
+
+ hash2
+
+ WEzdMAWctrJAv+EVRFvXjGyiNgbwKzJfSbOUK3Ie0KY=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_system.h
+
+ hash
+
+ p/vP9wu1luKvxk5pOpa7c+G+AI4=
+
+ hash2
+
+ SV7kGEe9BC+Z2/7QBwUSFhDMAmmM/fRed60ZEIIkuUY=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_thread.h
+
+ hash
+
+ zj6XYOdz8AUI1EPm52Xzvy24l8k=
+
+ hash2
+
+ Bh60e3q2kAgdB5+SI20aAeGaPnla7y8zrjrxJGS2bm0=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_time.h
+
+ hash
+
+ amXdZSZWmQpHKsgNNVSx+Dzf4pc=
+
+ hash2
+
+ 9MOdJKaCKHDZTKVRGavBiUP4X2nuV9avu4GDi0HPPcQ=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_timer.h
+
+ hash
+
+ q0F4Eu5yrr8qahWsIiPYFFI+S7U=
+
+ hash2
+
+ a2YcPY1PJY1dYcj2dNehwKIwD+j8PEvdvcbJ8jNprZ0=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_touch.h
+
+ hash
+
+ akfk8DSVubEtG3EbGDEif0lzP4I=
+
+ hash2
+
+ 17lNGQel6VfvWYFT5WpZHW/4BZLIfas87t3u87SbFc4=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_version.h
+
+ hash
+
+ sYkB+NDCq7ZZF0DlML1zmn+k79A=
+
+ hash2
+
+ SIdy/p8X6AWtsjbKuapx3GGOdWKPKIwWJI2jWKcz43M=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_video.h
+
+ hash
+
+ tC+nlvGbjtXBTDtkNVqOSFfwms4=
+
+ hash2
+
+ chXwjgFTNkmjS1VAavg8PiZ1KgNK1EXniIfbOtg8bVQ=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_vulkan.h
+
+ hash
+
+ /l3bNRmSicwCYWC83cV/5Cb3tjU=
+
+ hash2
+
+ XuJ8rZGpOCSBnlWxX1BTv8BXdYTX30nvBvvpQuybC9c=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/Info.plist
+
+ hash
+
+ U6d8MZfvzpGioi2hzmtl6Alh7Kw=
+
+ hash2
+
+ tuWMMReBFLfQGykXlFkZ2CKEJZ1wCIIPLoMgQSuhflU=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/License.txt
+
+ hash
+
+ A8VTYHTg+gsOssUp337xdGbdHW0=
+
+ hash2
+
+ UN4cvaEc5FbrLcR2jBIsS5miYCucbhF1iAKC2EMtJhM=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/ReadMe.txt
+
+ hash
+
+ fmvVN4l2bp/qrM2l1v1dfNxJRyo=
+
+ hash2
+
+ gUne5zwAtztNlmXGwQhk5IppZm4RJ3GYBlIcGoKHQXw=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/SDL3
+
+ hash
+
+ PCskDNdfGFVZhhVpPRxWioNQyAM=
+
+ hash2
+
+ qDw+ZnNkVsh2md+SgJ3m5zT3gnAptRcq3WBnqPPZ8vE=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/_CodeSignature/CodeResources
+
+ hash
+
+ TIEsYO05UH+i8IWfQAPax2prcOI=
+
+ hash2
+
+ wmK88Fq+33pBg/EBCZP0LmvHFDAFwRSlyr59Vpv+/9Y=
+
+
+ ios-arm64_x86_64-simulator/SDL3.framework/default.metallib
+
+ hash
+
+ a2mo7WO50E5tbglYvQP3J9ig25s=
+
+ hash2
+
+ XVtRwtH2SPVi2wHMRGpot5PFSDtd89Nbh7xHM0eQMaQ=
+
+
+ macos-arm64_x86_64/SDL3.framework/Headers
+
+ symlink
+ Versions/Current/Headers
+
+ macos-arm64_x86_64/SDL3.framework/Resources
+
+ symlink
+ Versions/Current/Resources
+
+ macos-arm64_x86_64/SDL3.framework/SDL3
+
+ symlink
+ Versions/Current/SDL3
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL.h
+
+ hash
+
+ FTMTHjsuYteQonu++Ckywry5GVU=
+
+ hash2
+
+ 9aNi0GcnRnROa/pxub1yt6Svy5od8xyHkKILlFr3Id0=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_assert.h
+
+ hash
+
+ P0NggofzAq3POji+d/Ff5sRjoCY=
+
+ hash2
+
+ pa3PhUKCa5zZ7qBkAbKi/VUMsQ+KCnvkgB55ZJweMOI=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_atomic.h
+
+ hash
+
+ ix/kK20wL//FZQpVEACluxR8g84=
+
+ hash2
+
+ 0ikeN0T0/8NBM68wroRmfzBcVy1b/v+mdKfk6pONi30=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_audio.h
+
+ hash
+
+ 6VLe7o8LZrzIospLupv0FgnIbjM=
+
+ hash2
+
+ 9PtlNNe4RJcxA1KUpmVf0CCaOFD1RKxJ9ePuHzkNgj8=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_begin_code.h
+
+ hash
+
+ 7G18WpoAb9cfZCsf3rik/xI8ZtA=
+
+ hash2
+
+ A7wqJrpVG9rddmswfQLBTYkLCQ7OWHgcK1ERDOYFxF4=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_bits.h
+
+ hash
+
+ 9GKUlmUdEkM57qkENBCuQNFOmZk=
+
+ hash2
+
+ 9qfqBJ/8ebcazXzN5LJhzTpcuAgTZQjBDx2FeM09CpM=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_blendmode.h
+
+ hash
+
+ kY2sXgPn94QaEvGR7lxj8R2RRO0=
+
+ hash2
+
+ p6JBtjwHFvidf/5GdgqM4oRxr4zeL7mYYVNGlyc58UU=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_camera.h
+
+ hash
+
+ /sqKZTtQvj7rsdkz34yMVHEycwk=
+
+ hash2
+
+ 9IltUNp+OEpKhwiiu+fveWW7394bro/il8j5a3e7jgA=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_clipboard.h
+
+ hash
+
+ jdxic1IegrdEvs0uRuyXnjLLlxM=
+
+ hash2
+
+ 5fhZNCfIH2MBmFqmlngmUpV1hwgO+xBgBDptoi0XyzI=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_close_code.h
+
+ hash
+
+ stpI2IKLGwyLPg+/VRffIpnJprU=
+
+ hash2
+
+ bdZE3br3xGggRwF5l6xU5W9vjQUgB9p4t+10F5SEhnA=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_copying.h
+
+ hash
+
+ gJU9ZWFTfu1EWAYO8Eou18UaQzU=
+
+ hash2
+
+ vqH3+9MIb2T5AP0+Wy4Vl4JO7kIr5B/FlRKGbOVButE=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_cpuinfo.h
+
+ hash
+
+ 55rHaPSpVLQeAZMVANVT9tdXUCM=
+
+ hash2
+
+ r0S+Rn9dRrduxf6kk14asFCYsaBsnE241geet6TJY2s=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_dialog.h
+
+ hash
+
+ kKKCCkyYlc1KePFlWyj5ew6qKiM=
+
+ hash2
+
+ p8ld7FxtmlwUpxElqKv452Dw0hixH9S55FtJGYnQU28=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_egl.h
+
+ hash
+
+ DFPtq0RjCP4+3UsNLTKNq6adAfI=
+
+ hash2
+
+ 3bqSsp9JRnF9dLy8lfkfkzv3v6QU0IR7rx35nmXpMGU=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_endian.h
+
+ hash
+
+ hRBYGpJQbPcJHbOa+tk/zLs1Nwo=
+
+ hash2
+
+ leP6qVZ8JVFkYZxzbeCKbYgsuGdQVo72uAVU3UeOmjo=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_error.h
+
+ hash
+
+ Ela9DWG/EP3oPMx755ZNrBYmu2Q=
+
+ hash2
+
+ /p2iNoN6JaAaN0LyZnqVb0WBefbZGv7OxfxIUiLxvrs=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_events.h
+
+ hash
+
+ bUizFrQhB49dyuQGW5Y0mB5bXVc=
+
+ hash2
+
+ bVVuJAyhkuHoa+f8vgRVzpWfDqL1X/bc3DupoC65N7E=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_filesystem.h
+
+ hash
+
+ usWcz40Sp9rBZ30AJiHJqpvLQFI=
+
+ hash2
+
+ 1zr9pYjnlG3v/QoNzQVvmxufNzGn4LIFiB1l1k+xV9Q=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_gamepad.h
+
+ hash
+
+ S8VEL/ZT27PyCVaH0E0bl4bVjEQ=
+
+ hash2
+
+ dPhusBvgBj73h1ZuWsGsCVHHMzXZUlqHnDnb1dMYhro=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_guid.h
+
+ hash
+
+ +qe4pwSeQDilfoGsQSddhHV2vUw=
+
+ hash2
+
+ mZwI6lGgX6SKgxGS+EoWFe0xL4oohP2pVgPpT7kQXjI=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_haptic.h
+
+ hash
+
+ spxndIYWTumv/KqEL1upOaaDbw8=
+
+ hash2
+
+ m81Pi+WNNpjGpsLWM8EkPqolbvJ8cpdj4tYjo4YlKtQ=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_hidapi.h
+
+ hash
+
+ MDTprYwZ0155/rrIVsmAcAHaijE=
+
+ hash2
+
+ hvoNAXTxbTaxT5ZiTZ3/v5VVNJFNGmfMYNsecfet2iQ=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_hints.h
+
+ hash
+
+ 5EwtyU5lf9qyrG2N5/cuACo5+3U=
+
+ hash2
+
+ 0vZJYHQeQCkY3vfqrzCA13jR7Tg2H9WSXMYad6lK2l4=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_init.h
+
+ hash
+
+ xt+XRyxBSg4hKXoTGTbq4rmw9fw=
+
+ hash2
+
+ 7LhP0O26ntkrZdPcCuWRjkXm424l5LA9FQOJtT1i23g=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_intrin.h
+
+ hash
+
+ Kq1mo1fZkIH/HKH/amIPdhoTCh4=
+
+ hash2
+
+ LwGY43+m8i4eQo9+5emflGxQ6iiXTmWXnEh2BmR/sts=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_iostream.h
+
+ hash
+
+ znvH2dvHGuYAL+LrvRzeIQlc1Kw=
+
+ hash2
+
+ GnW3bR48TuvbDNr0hCg5bl/TDI3RDy1ttiGHSzFT5i0=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_joystick.h
+
+ hash
+
+ LDFa0Vfu7aUyFrXweYz61XMAtSY=
+
+ hash2
+
+ 0nBglvFxiGkUIt3RfEezy5bXSmJXUxmkZFciIUzpzRY=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_keyboard.h
+
+ hash
+
+ 7bRCUW0PYGdiT5ALqTxyuN8k81o=
+
+ hash2
+
+ j79zksUOi4vVrBvrnPgQJRD4OIQh3UrxdLRuEglwpig=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_keycode.h
+
+ hash
+
+ 7nrB/CfwjugeoW8S6GSafPAhCcI=
+
+ hash2
+
+ dMX0jYn16Lfy0y7tge9wQX8Q+ubJSxOeESV93wkOE9g=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_loadso.h
+
+ hash
+
+ 9X7aeCQBaGlVYLl8WHChoD+y7oE=
+
+ hash2
+
+ Jg/UDLpydORtxkFxbz0XhfNF2Eu302GUG1itkizeXjU=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_locale.h
+
+ hash
+
+ 3UgabWi37OSUaR5Cv3ykSpFRSFU=
+
+ hash2
+
+ B9dUnAsKgcSvvP+eUqf+22xxGX/OmH5eyeBFBSJiDPY=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_log.h
+
+ hash
+
+ AjGovpbmz2+Zjg4vFoA+jRln9Ag=
+
+ hash2
+
+ bUvABdplbCd9/U2eiT2pvPW6VBjJODvBDf8Fu6SnN6M=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_main.h
+
+ hash
+
+ nM5LWIZF3HLAad3qVK5YSL8tPo8=
+
+ hash2
+
+ IJWH/4Oc+C0x3p9ywKE4u7Hu+SWaM1JorQRf7hGqmIc=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_main_impl.h
+
+ hash
+
+ /j/z5uFhPx1k4ignpIT7OuI9eCE=
+
+ hash2
+
+ Ju+WlVFk6UcLLVDkNB5EfpFUqT8U4UboWRfUf8TpC0w=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_messagebox.h
+
+ hash
+
+ l3z7HIKvgvcl88uPQgwirKUBGxQ=
+
+ hash2
+
+ uCj0WyHGh8ddQKtPMVQZWCqqsGJBmICQIPJackUC7gc=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_metal.h
+
+ hash
+
+ h/b2709w5AE+fKfTbka2JJvvqDo=
+
+ hash2
+
+ ZnJqoHPIv5xmwZH3Ya/X2Ck2KFHEJFusU9D7jf2SZmw=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_misc.h
+
+ hash
+
+ /UKenlwt9bM3OZPOLaAefIawb0s=
+
+ hash2
+
+ 6xTiBSCOYB6LgCtJjrtEPSu3UNlBDOJq5Ce5PR6FdQ0=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_mouse.h
+
+ hash
+
+ U3/L2aFFC+IFjHHspqA/dnmn/tY=
+
+ hash2
+
+ wq2m7lfzfam1bamOmxGBdhjM15QZoabP5kWs/nKh25c=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_mutex.h
+
+ hash
+
+ wUS9C/TOUloJjZlCpzUTJc2L3Nw=
+
+ hash2
+
+ mrt3RuUB/NshrAhNF/Nw5GyUhZ/NS7QPsYOLBhbSQV4=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_oldnames.h
+
+ hash
+
+ qROTHGOa/EOq6psC86LmkXZEgeA=
+
+ hash2
+
+ o8g5jafePszDFnXDKO06Y4WMXEF4kFLbZUotQ8NfiR4=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengl.h
+
+ hash
+
+ 5XjZdn58klM/ZH4xRL32kWFvwmQ=
+
+ hash2
+
+ r7KreHSdayrs85RILI8Xgh+JizNq9Vuze3oi1N7dLnw=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengl_glext.h
+
+ hash
+
+ eOvalGUielSzNuOWWDLYkwqpYrg=
+
+ hash2
+
+ GrsoiRybBmG2/zdJ3iZx2l/hK+tbyxgzsta99ciezfg=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengles.h
+
+ hash
+
+ gG8fFwXRxWfFzL5XD2UffDRXZ3Q=
+
+ hash2
+
+ aoo42jon38SwoJd6YxYz+gpHtBEECX685KyFqnRG/yY=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengles2.h
+
+ hash
+
+ AxfYXQsD0wpyQFFalhC2+H+bbJw=
+
+ hash2
+
+ mfh8cJuZsq8zI8LZw40h4NqpQ16HNuHhbbVHw1q6ZqU=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengles2_gl2.h
+
+ hash
+
+ GbD4M9ZIR9sxgLX4G8T/ojLVQJk=
+
+ hash2
+
+ 1uxEsdc/OvzjogrGl223+z2sZWxRkPC1Y+TOkNeaFao=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengles2_gl2ext.h
+
+ hash
+
+ frTvd+EfShO/uonAvnnsnPkqc80=
+
+ hash2
+
+ T8WwA03N6cElki4+cNAUiaazNQdoVu5mApThpjBaNxk=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengles2_gl2platform.h
+
+ hash
+
+ JO1DB28zz7TCz/P5YCSvV1PaqWg=
+
+ hash2
+
+ R3m+mZrNGQRFgjjwnIaYO3lgrEDmEuBdstuX22FfHg8=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_opengles2_khrplatform.h
+
+ hash
+
+ mBjqEs+5bGC9u1ED2M93VNzONPQ=
+
+ hash2
+
+ ex4Bqqetj2/DS1x733nr9RibsJ4sTS55/F01BiPRHoM=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_pen.h
+
+ hash
+
+ 682iJ7WBcXPP59n6GotWTTLbcF4=
+
+ hash2
+
+ IrLPuD9df4GLhqVPV/wYLsMNDtDFlMhMCWC6iOtBQrY=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_pixels.h
+
+ hash
+
+ XMpENyf+JyXMoOlgLXvAVH2XWUk=
+
+ hash2
+
+ /59bliEM9/q7EYaDYAaaH1k0ms7HViADLQUqWEbrqtw=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_platform.h
+
+ hash
+
+ ibx+rBzgiofjabvIoz74IR6I520=
+
+ hash2
+
+ AWapRPc+AyddZhvn1FMjdcIJdX7crJ1mN78vxLVxm+Y=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_platform_defines.h
+
+ hash
+
+ /Kbr1IehNE5PCihNTCISGfpFGQE=
+
+ hash2
+
+ uRsNq1jA7eXKXqnDtikD181YR+p1cz0EfDnR4VDIpZo=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_power.h
+
+ hash
+
+ VXRD8swjN+SVSGXhEHbx5kJjpws=
+
+ hash2
+
+ UcZ2bS20U4hBnqMc794XIqIxSHx2Xzu+v8TM+ECQPhg=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_properties.h
+
+ hash
+
+ F150c1qnBNLBgeEUC1TBC6Oouoc=
+
+ hash2
+
+ CiomCgkVq6u+WWo2vh+ItNU1JkGtn2HpguEqRlTQzQM=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_rect.h
+
+ hash
+
+ 8qzy2zRniQeliH43voxw/RVwLZs=
+
+ hash2
+
+ kY0XN2lKfI3uLvu7ONQmz7rKppdkMxhw+WKqNW6uxAA=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_render.h
+
+ hash
+
+ E42djJM4TabkF6rgVFoXXb2e6A0=
+
+ hash2
+
+ FVECH+hM+0ohtw2q5nhcqxzGJF0CHZe6OmQCAQIhaC0=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_revision.h
+
+ hash
+
+ wPbbJkv48GXw7JirykuAoX/HX+s=
+
+ hash2
+
+ teAz/wtokUzr1b4mFKTyJE22JNx6UFN1UXg77FNf9ak=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_scancode.h
+
+ hash
+
+ TFln1sCjEKyQIpVx9Rrexg61/tc=
+
+ hash2
+
+ y1LYdhxjN9fO3uY50Ke9sVZ9nKBn2K1LPcjLVYhMOkY=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_sensor.h
+
+ hash
+
+ 9tubC8rImcEZ176ITWeqmbIEmkY=
+
+ hash2
+
+ v4+qhML/25/KBtrv+0p6dfHAuvavG18gXtMdEb8dOAE=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_stdinc.h
+
+ hash
+
+ GK+yk89W1wKKSwfZinmtiLKnkaE=
+
+ hash2
+
+ q8U9OkKiiFSTw63QEqOcQVSHDrye4ql96xRlNnQexrI=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_storage.h
+
+ hash
+
+ WMFpkEtzGQBue7CMmxa0KEGpHHo=
+
+ hash2
+
+ +JyqT3bSkEbASqBLXQdWz1gUsEYDzbme6sxq4gsC3wQ=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_surface.h
+
+ hash
+
+ OkLZ4CQFo0/pQ8F9tHoo8Gdo6c4=
+
+ hash2
+
+ WEzdMAWctrJAv+EVRFvXjGyiNgbwKzJfSbOUK3Ie0KY=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_system.h
+
+ hash
+
+ p/vP9wu1luKvxk5pOpa7c+G+AI4=
+
+ hash2
+
+ SV7kGEe9BC+Z2/7QBwUSFhDMAmmM/fRed60ZEIIkuUY=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_thread.h
+
+ hash
+
+ zj6XYOdz8AUI1EPm52Xzvy24l8k=
+
+ hash2
+
+ Bh60e3q2kAgdB5+SI20aAeGaPnla7y8zrjrxJGS2bm0=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_time.h
+
+ hash
+
+ amXdZSZWmQpHKsgNNVSx+Dzf4pc=
+
+ hash2
+
+ 9MOdJKaCKHDZTKVRGavBiUP4X2nuV9avu4GDi0HPPcQ=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_timer.h
+
+ hash
+
+ q0F4Eu5yrr8qahWsIiPYFFI+S7U=
+
+ hash2
+
+ a2YcPY1PJY1dYcj2dNehwKIwD+j8PEvdvcbJ8jNprZ0=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_touch.h
+
+ hash
+
+ akfk8DSVubEtG3EbGDEif0lzP4I=
+
+ hash2
+
+ 17lNGQel6VfvWYFT5WpZHW/4BZLIfas87t3u87SbFc4=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_version.h
+
+ hash
+
+ sYkB+NDCq7ZZF0DlML1zmn+k79A=
+
+ hash2
+
+ SIdy/p8X6AWtsjbKuapx3GGOdWKPKIwWJI2jWKcz43M=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_video.h
+
+ hash
+
+ tC+nlvGbjtXBTDtkNVqOSFfwms4=
+
+ hash2
+
+ chXwjgFTNkmjS1VAavg8PiZ1KgNK1EXniIfbOtg8bVQ=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Headers/SDL_vulkan.h
+
+ hash
+
+ /l3bNRmSicwCYWC83cV/5Cb3tjU=
+
+ hash2
+
+ XuJ8rZGpOCSBnlWxX1BTv8BXdYTX30nvBvvpQuybC9c=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/CMake/sdl3-config-version.cmake
+
+ hash
+
+ gQ+LV+T54JMbmVqczZwWryOwVns=
+
+ hash2
+
+ o4od03lMXeFmSf7XQVrg+cMoEnzDAA0bJIE6oslEQe0=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/CMake/sdl3-config.cmake
+
+ hash
+
+ E+bsKFeYRozn4nSWM4OxBPxu3Wo=
+
+ hash2
+
+ VxylhJ7S86lzsQJvXNKSHDGFR01PL4b7kLkIhMAayCI=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/Info.plist
+
+ hash
+
+ +rA+DhTG8sfSGnkfPHTDfD76jz4=
+
+ hash2
+
+ c0a6Ed65+xafQekbkYRPBB38PQeIN09SWHCs8BAbjI8=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/License.txt
+
+ hash
+
+ A8VTYHTg+gsOssUp337xdGbdHW0=
+
+ hash2
+
+ UN4cvaEc5FbrLcR2jBIsS5miYCucbhF1iAKC2EMtJhM=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/ReadMe.txt
+
+ hash
+
+ fmvVN4l2bp/qrM2l1v1dfNxJRyo=
+
+ hash2
+
+ gUne5zwAtztNlmXGwQhk5IppZm4RJ3GYBlIcGoKHQXw=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/Resources/default.metallib
+
+ hash
+
+ K8Zg1yQX0y63m9J1c5BKYZN/+gQ=
+
+ hash2
+
+ IG3DQ+YB9gZBv+Eb4LEmzwhgL8GWBh9rJOuh+5wDSsQ=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/SDL3
+
+ hash
+
+ RtRSU6xXRxLzf859Cz5dswfwzjw=
+
+ hash2
+
+ yceWjy//GgLhT42AXMGk0m3hBKAHuATjQtPYDMb+6QM=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/A/_CodeSignature/CodeResources
+
+ hash
+
+ yuSvdLvTIU0msnVWw9TQ3n9N2HI=
+
+ hash2
+
+ IZyWxEfhxAjIfL/2Mxnts9fPnw/abCr/1DU6h7dwnXw=
+
+
+ macos-arm64_x86_64/SDL3.framework/Versions/Current
+
+ symlink
+ A
+
+ tvos-arm64/SDL3.framework/CMake/sdl3-config-version.cmake
+
+ hash
+
+ gQ+LV+T54JMbmVqczZwWryOwVns=
+
+ hash2
+
+ o4od03lMXeFmSf7XQVrg+cMoEnzDAA0bJIE6oslEQe0=
+
+
+ tvos-arm64/SDL3.framework/CMake/sdl3-config.cmake
+
+ hash
+
+ E+bsKFeYRozn4nSWM4OxBPxu3Wo=
+
+ hash2
+
+ VxylhJ7S86lzsQJvXNKSHDGFR01PL4b7kLkIhMAayCI=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL.h
+
+ hash
+
+ FTMTHjsuYteQonu++Ckywry5GVU=
+
+ hash2
+
+ 9aNi0GcnRnROa/pxub1yt6Svy5od8xyHkKILlFr3Id0=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_assert.h
+
+ hash
+
+ P0NggofzAq3POji+d/Ff5sRjoCY=
+
+ hash2
+
+ pa3PhUKCa5zZ7qBkAbKi/VUMsQ+KCnvkgB55ZJweMOI=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_atomic.h
+
+ hash
+
+ ix/kK20wL//FZQpVEACluxR8g84=
+
+ hash2
+
+ 0ikeN0T0/8NBM68wroRmfzBcVy1b/v+mdKfk6pONi30=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_audio.h
+
+ hash
+
+ 6VLe7o8LZrzIospLupv0FgnIbjM=
+
+ hash2
+
+ 9PtlNNe4RJcxA1KUpmVf0CCaOFD1RKxJ9ePuHzkNgj8=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_begin_code.h
+
+ hash
+
+ 7G18WpoAb9cfZCsf3rik/xI8ZtA=
+
+ hash2
+
+ A7wqJrpVG9rddmswfQLBTYkLCQ7OWHgcK1ERDOYFxF4=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_bits.h
+
+ hash
+
+ 9GKUlmUdEkM57qkENBCuQNFOmZk=
+
+ hash2
+
+ 9qfqBJ/8ebcazXzN5LJhzTpcuAgTZQjBDx2FeM09CpM=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_blendmode.h
+
+ hash
+
+ kY2sXgPn94QaEvGR7lxj8R2RRO0=
+
+ hash2
+
+ p6JBtjwHFvidf/5GdgqM4oRxr4zeL7mYYVNGlyc58UU=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_camera.h
+
+ hash
+
+ /sqKZTtQvj7rsdkz34yMVHEycwk=
+
+ hash2
+
+ 9IltUNp+OEpKhwiiu+fveWW7394bro/il8j5a3e7jgA=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_clipboard.h
+
+ hash
+
+ jdxic1IegrdEvs0uRuyXnjLLlxM=
+
+ hash2
+
+ 5fhZNCfIH2MBmFqmlngmUpV1hwgO+xBgBDptoi0XyzI=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_close_code.h
+
+ hash
+
+ stpI2IKLGwyLPg+/VRffIpnJprU=
+
+ hash2
+
+ bdZE3br3xGggRwF5l6xU5W9vjQUgB9p4t+10F5SEhnA=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_copying.h
+
+ hash
+
+ gJU9ZWFTfu1EWAYO8Eou18UaQzU=
+
+ hash2
+
+ vqH3+9MIb2T5AP0+Wy4Vl4JO7kIr5B/FlRKGbOVButE=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_cpuinfo.h
+
+ hash
+
+ 55rHaPSpVLQeAZMVANVT9tdXUCM=
+
+ hash2
+
+ r0S+Rn9dRrduxf6kk14asFCYsaBsnE241geet6TJY2s=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_dialog.h
+
+ hash
+
+ kKKCCkyYlc1KePFlWyj5ew6qKiM=
+
+ hash2
+
+ p8ld7FxtmlwUpxElqKv452Dw0hixH9S55FtJGYnQU28=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_egl.h
+
+ hash
+
+ DFPtq0RjCP4+3UsNLTKNq6adAfI=
+
+ hash2
+
+ 3bqSsp9JRnF9dLy8lfkfkzv3v6QU0IR7rx35nmXpMGU=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_endian.h
+
+ hash
+
+ hRBYGpJQbPcJHbOa+tk/zLs1Nwo=
+
+ hash2
+
+ leP6qVZ8JVFkYZxzbeCKbYgsuGdQVo72uAVU3UeOmjo=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_error.h
+
+ hash
+
+ Ela9DWG/EP3oPMx755ZNrBYmu2Q=
+
+ hash2
+
+ /p2iNoN6JaAaN0LyZnqVb0WBefbZGv7OxfxIUiLxvrs=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_events.h
+
+ hash
+
+ bUizFrQhB49dyuQGW5Y0mB5bXVc=
+
+ hash2
+
+ bVVuJAyhkuHoa+f8vgRVzpWfDqL1X/bc3DupoC65N7E=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_filesystem.h
+
+ hash
+
+ usWcz40Sp9rBZ30AJiHJqpvLQFI=
+
+ hash2
+
+ 1zr9pYjnlG3v/QoNzQVvmxufNzGn4LIFiB1l1k+xV9Q=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_gamepad.h
+
+ hash
+
+ S8VEL/ZT27PyCVaH0E0bl4bVjEQ=
+
+ hash2
+
+ dPhusBvgBj73h1ZuWsGsCVHHMzXZUlqHnDnb1dMYhro=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_guid.h
+
+ hash
+
+ +qe4pwSeQDilfoGsQSddhHV2vUw=
+
+ hash2
+
+ mZwI6lGgX6SKgxGS+EoWFe0xL4oohP2pVgPpT7kQXjI=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_haptic.h
+
+ hash
+
+ spxndIYWTumv/KqEL1upOaaDbw8=
+
+ hash2
+
+ m81Pi+WNNpjGpsLWM8EkPqolbvJ8cpdj4tYjo4YlKtQ=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_hidapi.h
+
+ hash
+
+ MDTprYwZ0155/rrIVsmAcAHaijE=
+
+ hash2
+
+ hvoNAXTxbTaxT5ZiTZ3/v5VVNJFNGmfMYNsecfet2iQ=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_hints.h
+
+ hash
+
+ 5EwtyU5lf9qyrG2N5/cuACo5+3U=
+
+ hash2
+
+ 0vZJYHQeQCkY3vfqrzCA13jR7Tg2H9WSXMYad6lK2l4=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_init.h
+
+ hash
+
+ xt+XRyxBSg4hKXoTGTbq4rmw9fw=
+
+ hash2
+
+ 7LhP0O26ntkrZdPcCuWRjkXm424l5LA9FQOJtT1i23g=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_intrin.h
+
+ hash
+
+ Kq1mo1fZkIH/HKH/amIPdhoTCh4=
+
+ hash2
+
+ LwGY43+m8i4eQo9+5emflGxQ6iiXTmWXnEh2BmR/sts=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_iostream.h
+
+ hash
+
+ znvH2dvHGuYAL+LrvRzeIQlc1Kw=
+
+ hash2
+
+ GnW3bR48TuvbDNr0hCg5bl/TDI3RDy1ttiGHSzFT5i0=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_joystick.h
+
+ hash
+
+ LDFa0Vfu7aUyFrXweYz61XMAtSY=
+
+ hash2
+
+ 0nBglvFxiGkUIt3RfEezy5bXSmJXUxmkZFciIUzpzRY=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_keyboard.h
+
+ hash
+
+ 7bRCUW0PYGdiT5ALqTxyuN8k81o=
+
+ hash2
+
+ j79zksUOi4vVrBvrnPgQJRD4OIQh3UrxdLRuEglwpig=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_keycode.h
+
+ hash
+
+ 7nrB/CfwjugeoW8S6GSafPAhCcI=
+
+ hash2
+
+ dMX0jYn16Lfy0y7tge9wQX8Q+ubJSxOeESV93wkOE9g=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_loadso.h
+
+ hash
+
+ 9X7aeCQBaGlVYLl8WHChoD+y7oE=
+
+ hash2
+
+ Jg/UDLpydORtxkFxbz0XhfNF2Eu302GUG1itkizeXjU=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_locale.h
+
+ hash
+
+ 3UgabWi37OSUaR5Cv3ykSpFRSFU=
+
+ hash2
+
+ B9dUnAsKgcSvvP+eUqf+22xxGX/OmH5eyeBFBSJiDPY=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_log.h
+
+ hash
+
+ AjGovpbmz2+Zjg4vFoA+jRln9Ag=
+
+ hash2
+
+ bUvABdplbCd9/U2eiT2pvPW6VBjJODvBDf8Fu6SnN6M=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_main.h
+
+ hash
+
+ nM5LWIZF3HLAad3qVK5YSL8tPo8=
+
+ hash2
+
+ IJWH/4Oc+C0x3p9ywKE4u7Hu+SWaM1JorQRf7hGqmIc=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_main_impl.h
+
+ hash
+
+ /j/z5uFhPx1k4ignpIT7OuI9eCE=
+
+ hash2
+
+ Ju+WlVFk6UcLLVDkNB5EfpFUqT8U4UboWRfUf8TpC0w=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_messagebox.h
+
+ hash
+
+ l3z7HIKvgvcl88uPQgwirKUBGxQ=
+
+ hash2
+
+ uCj0WyHGh8ddQKtPMVQZWCqqsGJBmICQIPJackUC7gc=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_metal.h
+
+ hash
+
+ h/b2709w5AE+fKfTbka2JJvvqDo=
+
+ hash2
+
+ ZnJqoHPIv5xmwZH3Ya/X2Ck2KFHEJFusU9D7jf2SZmw=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_misc.h
+
+ hash
+
+ /UKenlwt9bM3OZPOLaAefIawb0s=
+
+ hash2
+
+ 6xTiBSCOYB6LgCtJjrtEPSu3UNlBDOJq5Ce5PR6FdQ0=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_mouse.h
+
+ hash
+
+ U3/L2aFFC+IFjHHspqA/dnmn/tY=
+
+ hash2
+
+ wq2m7lfzfam1bamOmxGBdhjM15QZoabP5kWs/nKh25c=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_mutex.h
+
+ hash
+
+ wUS9C/TOUloJjZlCpzUTJc2L3Nw=
+
+ hash2
+
+ mrt3RuUB/NshrAhNF/Nw5GyUhZ/NS7QPsYOLBhbSQV4=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_oldnames.h
+
+ hash
+
+ qROTHGOa/EOq6psC86LmkXZEgeA=
+
+ hash2
+
+ o8g5jafePszDFnXDKO06Y4WMXEF4kFLbZUotQ8NfiR4=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengl.h
+
+ hash
+
+ 5XjZdn58klM/ZH4xRL32kWFvwmQ=
+
+ hash2
+
+ r7KreHSdayrs85RILI8Xgh+JizNq9Vuze3oi1N7dLnw=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengl_glext.h
+
+ hash
+
+ eOvalGUielSzNuOWWDLYkwqpYrg=
+
+ hash2
+
+ GrsoiRybBmG2/zdJ3iZx2l/hK+tbyxgzsta99ciezfg=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengles.h
+
+ hash
+
+ gG8fFwXRxWfFzL5XD2UffDRXZ3Q=
+
+ hash2
+
+ aoo42jon38SwoJd6YxYz+gpHtBEECX685KyFqnRG/yY=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengles2.h
+
+ hash
+
+ AxfYXQsD0wpyQFFalhC2+H+bbJw=
+
+ hash2
+
+ mfh8cJuZsq8zI8LZw40h4NqpQ16HNuHhbbVHw1q6ZqU=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengles2_gl2.h
+
+ hash
+
+ GbD4M9ZIR9sxgLX4G8T/ojLVQJk=
+
+ hash2
+
+ 1uxEsdc/OvzjogrGl223+z2sZWxRkPC1Y+TOkNeaFao=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengles2_gl2ext.h
+
+ hash
+
+ frTvd+EfShO/uonAvnnsnPkqc80=
+
+ hash2
+
+ T8WwA03N6cElki4+cNAUiaazNQdoVu5mApThpjBaNxk=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengles2_gl2platform.h
+
+ hash
+
+ JO1DB28zz7TCz/P5YCSvV1PaqWg=
+
+ hash2
+
+ R3m+mZrNGQRFgjjwnIaYO3lgrEDmEuBdstuX22FfHg8=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_opengles2_khrplatform.h
+
+ hash
+
+ mBjqEs+5bGC9u1ED2M93VNzONPQ=
+
+ hash2
+
+ ex4Bqqetj2/DS1x733nr9RibsJ4sTS55/F01BiPRHoM=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_pen.h
+
+ hash
+
+ 682iJ7WBcXPP59n6GotWTTLbcF4=
+
+ hash2
+
+ IrLPuD9df4GLhqVPV/wYLsMNDtDFlMhMCWC6iOtBQrY=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_pixels.h
+
+ hash
+
+ XMpENyf+JyXMoOlgLXvAVH2XWUk=
+
+ hash2
+
+ /59bliEM9/q7EYaDYAaaH1k0ms7HViADLQUqWEbrqtw=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_platform.h
+
+ hash
+
+ ibx+rBzgiofjabvIoz74IR6I520=
+
+ hash2
+
+ AWapRPc+AyddZhvn1FMjdcIJdX7crJ1mN78vxLVxm+Y=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_platform_defines.h
+
+ hash
+
+ /Kbr1IehNE5PCihNTCISGfpFGQE=
+
+ hash2
+
+ uRsNq1jA7eXKXqnDtikD181YR+p1cz0EfDnR4VDIpZo=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_power.h
+
+ hash
+
+ VXRD8swjN+SVSGXhEHbx5kJjpws=
+
+ hash2
+
+ UcZ2bS20U4hBnqMc794XIqIxSHx2Xzu+v8TM+ECQPhg=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_properties.h
+
+ hash
+
+ F150c1qnBNLBgeEUC1TBC6Oouoc=
+
+ hash2
+
+ CiomCgkVq6u+WWo2vh+ItNU1JkGtn2HpguEqRlTQzQM=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_rect.h
+
+ hash
+
+ 8qzy2zRniQeliH43voxw/RVwLZs=
+
+ hash2
+
+ kY0XN2lKfI3uLvu7ONQmz7rKppdkMxhw+WKqNW6uxAA=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_render.h
+
+ hash
+
+ E42djJM4TabkF6rgVFoXXb2e6A0=
+
+ hash2
+
+ FVECH+hM+0ohtw2q5nhcqxzGJF0CHZe6OmQCAQIhaC0=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_revision.h
+
+ hash
+
+ wPbbJkv48GXw7JirykuAoX/HX+s=
+
+ hash2
+
+ teAz/wtokUzr1b4mFKTyJE22JNx6UFN1UXg77FNf9ak=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_scancode.h
+
+ hash
+
+ TFln1sCjEKyQIpVx9Rrexg61/tc=
+
+ hash2
+
+ y1LYdhxjN9fO3uY50Ke9sVZ9nKBn2K1LPcjLVYhMOkY=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_sensor.h
+
+ hash
+
+ 9tubC8rImcEZ176ITWeqmbIEmkY=
+
+ hash2
+
+ v4+qhML/25/KBtrv+0p6dfHAuvavG18gXtMdEb8dOAE=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_stdinc.h
+
+ hash
+
+ GK+yk89W1wKKSwfZinmtiLKnkaE=
+
+ hash2
+
+ q8U9OkKiiFSTw63QEqOcQVSHDrye4ql96xRlNnQexrI=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_storage.h
+
+ hash
+
+ WMFpkEtzGQBue7CMmxa0KEGpHHo=
+
+ hash2
+
+ +JyqT3bSkEbASqBLXQdWz1gUsEYDzbme6sxq4gsC3wQ=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_surface.h
+
+ hash
+
+ OkLZ4CQFo0/pQ8F9tHoo8Gdo6c4=
+
+ hash2
+
+ WEzdMAWctrJAv+EVRFvXjGyiNgbwKzJfSbOUK3Ie0KY=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_system.h
+
+ hash
+
+ p/vP9wu1luKvxk5pOpa7c+G+AI4=
+
+ hash2
+
+ SV7kGEe9BC+Z2/7QBwUSFhDMAmmM/fRed60ZEIIkuUY=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_thread.h
+
+ hash
+
+ zj6XYOdz8AUI1EPm52Xzvy24l8k=
+
+ hash2
+
+ Bh60e3q2kAgdB5+SI20aAeGaPnla7y8zrjrxJGS2bm0=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_time.h
+
+ hash
+
+ amXdZSZWmQpHKsgNNVSx+Dzf4pc=
+
+ hash2
+
+ 9MOdJKaCKHDZTKVRGavBiUP4X2nuV9avu4GDi0HPPcQ=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_timer.h
+
+ hash
+
+ q0F4Eu5yrr8qahWsIiPYFFI+S7U=
+
+ hash2
+
+ a2YcPY1PJY1dYcj2dNehwKIwD+j8PEvdvcbJ8jNprZ0=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_touch.h
+
+ hash
+
+ akfk8DSVubEtG3EbGDEif0lzP4I=
+
+ hash2
+
+ 17lNGQel6VfvWYFT5WpZHW/4BZLIfas87t3u87SbFc4=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_version.h
+
+ hash
+
+ sYkB+NDCq7ZZF0DlML1zmn+k79A=
+
+ hash2
+
+ SIdy/p8X6AWtsjbKuapx3GGOdWKPKIwWJI2jWKcz43M=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_video.h
+
+ hash
+
+ tC+nlvGbjtXBTDtkNVqOSFfwms4=
+
+ hash2
+
+ chXwjgFTNkmjS1VAavg8PiZ1KgNK1EXniIfbOtg8bVQ=
+
+
+ tvos-arm64/SDL3.framework/Headers/SDL_vulkan.h
+
+ hash
+
+ /l3bNRmSicwCYWC83cV/5Cb3tjU=
+
+ hash2
+
+ XuJ8rZGpOCSBnlWxX1BTv8BXdYTX30nvBvvpQuybC9c=
+
+
+ tvos-arm64/SDL3.framework/Info.plist
+
+ hash
+
+ 2vpVmy35bMHbCdB7TQ49HRPWlfw=
+
+ hash2
+
+ poSNd9F0tomlb/Ib5VkrHzqvu1f2GOL8suGlelAu61s=
+
+
+ tvos-arm64/SDL3.framework/License.txt
+
+ hash
+
+ A8VTYHTg+gsOssUp337xdGbdHW0=
+
+ hash2
+
+ UN4cvaEc5FbrLcR2jBIsS5miYCucbhF1iAKC2EMtJhM=
+
+
+ tvos-arm64/SDL3.framework/ReadMe.txt
+
+ hash
+
+ fmvVN4l2bp/qrM2l1v1dfNxJRyo=
+
+ hash2
+
+ gUne5zwAtztNlmXGwQhk5IppZm4RJ3GYBlIcGoKHQXw=
+
+
+ tvos-arm64/SDL3.framework/SDL3
+
+ hash
+
+ XG8hvJrkMdSVHH4hZU5e5WH1Dfg=
+
+ hash2
+
+ AV387i3xki3BAlD4ZHQvuNxpT8et8KNjtaxsgo51GFE=
+
+
+ tvos-arm64/SDL3.framework/_CodeSignature/CodeResources
+
+ hash
+
+ CFH7PslU4Qqi0QPdRVfveo0Eg34=
+
+ hash2
+
+ KTQF/7beQ54W1efchOC4ob6J+0mQ0p0CzHDe5XSB5nw=
+
+
+ tvos-arm64/SDL3.framework/default.metallib
+
+ hash
+
+ Ykm7c+b4FKGjWC7z20zqDT5j6c8=
+
+ hash2
+
+ 4v4H9kAweVh4NIhwwSvGk2KKPas3TT8OuiqN43M5Q5o=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/CMake/sdl3-config-version.cmake
+
+ hash
+
+ gQ+LV+T54JMbmVqczZwWryOwVns=
+
+ hash2
+
+ o4od03lMXeFmSf7XQVrg+cMoEnzDAA0bJIE6oslEQe0=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/CMake/sdl3-config.cmake
+
+ hash
+
+ E+bsKFeYRozn4nSWM4OxBPxu3Wo=
+
+ hash2
+
+ VxylhJ7S86lzsQJvXNKSHDGFR01PL4b7kLkIhMAayCI=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL.h
+
+ hash
+
+ FTMTHjsuYteQonu++Ckywry5GVU=
+
+ hash2
+
+ 9aNi0GcnRnROa/pxub1yt6Svy5od8xyHkKILlFr3Id0=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_assert.h
+
+ hash
+
+ P0NggofzAq3POji+d/Ff5sRjoCY=
+
+ hash2
+
+ pa3PhUKCa5zZ7qBkAbKi/VUMsQ+KCnvkgB55ZJweMOI=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_atomic.h
+
+ hash
+
+ ix/kK20wL//FZQpVEACluxR8g84=
+
+ hash2
+
+ 0ikeN0T0/8NBM68wroRmfzBcVy1b/v+mdKfk6pONi30=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_audio.h
+
+ hash
+
+ 6VLe7o8LZrzIospLupv0FgnIbjM=
+
+ hash2
+
+ 9PtlNNe4RJcxA1KUpmVf0CCaOFD1RKxJ9ePuHzkNgj8=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_begin_code.h
+
+ hash
+
+ 7G18WpoAb9cfZCsf3rik/xI8ZtA=
+
+ hash2
+
+ A7wqJrpVG9rddmswfQLBTYkLCQ7OWHgcK1ERDOYFxF4=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_bits.h
+
+ hash
+
+ 9GKUlmUdEkM57qkENBCuQNFOmZk=
+
+ hash2
+
+ 9qfqBJ/8ebcazXzN5LJhzTpcuAgTZQjBDx2FeM09CpM=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_blendmode.h
+
+ hash
+
+ kY2sXgPn94QaEvGR7lxj8R2RRO0=
+
+ hash2
+
+ p6JBtjwHFvidf/5GdgqM4oRxr4zeL7mYYVNGlyc58UU=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_camera.h
+
+ hash
+
+ /sqKZTtQvj7rsdkz34yMVHEycwk=
+
+ hash2
+
+ 9IltUNp+OEpKhwiiu+fveWW7394bro/il8j5a3e7jgA=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_clipboard.h
+
+ hash
+
+ jdxic1IegrdEvs0uRuyXnjLLlxM=
+
+ hash2
+
+ 5fhZNCfIH2MBmFqmlngmUpV1hwgO+xBgBDptoi0XyzI=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_close_code.h
+
+ hash
+
+ stpI2IKLGwyLPg+/VRffIpnJprU=
+
+ hash2
+
+ bdZE3br3xGggRwF5l6xU5W9vjQUgB9p4t+10F5SEhnA=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_copying.h
+
+ hash
+
+ gJU9ZWFTfu1EWAYO8Eou18UaQzU=
+
+ hash2
+
+ vqH3+9MIb2T5AP0+Wy4Vl4JO7kIr5B/FlRKGbOVButE=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_cpuinfo.h
+
+ hash
+
+ 55rHaPSpVLQeAZMVANVT9tdXUCM=
+
+ hash2
+
+ r0S+Rn9dRrduxf6kk14asFCYsaBsnE241geet6TJY2s=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_dialog.h
+
+ hash
+
+ kKKCCkyYlc1KePFlWyj5ew6qKiM=
+
+ hash2
+
+ p8ld7FxtmlwUpxElqKv452Dw0hixH9S55FtJGYnQU28=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_egl.h
+
+ hash
+
+ DFPtq0RjCP4+3UsNLTKNq6adAfI=
+
+ hash2
+
+ 3bqSsp9JRnF9dLy8lfkfkzv3v6QU0IR7rx35nmXpMGU=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_endian.h
+
+ hash
+
+ hRBYGpJQbPcJHbOa+tk/zLs1Nwo=
+
+ hash2
+
+ leP6qVZ8JVFkYZxzbeCKbYgsuGdQVo72uAVU3UeOmjo=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_error.h
+
+ hash
+
+ Ela9DWG/EP3oPMx755ZNrBYmu2Q=
+
+ hash2
+
+ /p2iNoN6JaAaN0LyZnqVb0WBefbZGv7OxfxIUiLxvrs=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_events.h
+
+ hash
+
+ bUizFrQhB49dyuQGW5Y0mB5bXVc=
+
+ hash2
+
+ bVVuJAyhkuHoa+f8vgRVzpWfDqL1X/bc3DupoC65N7E=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_filesystem.h
+
+ hash
+
+ usWcz40Sp9rBZ30AJiHJqpvLQFI=
+
+ hash2
+
+ 1zr9pYjnlG3v/QoNzQVvmxufNzGn4LIFiB1l1k+xV9Q=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_gamepad.h
+
+ hash
+
+ S8VEL/ZT27PyCVaH0E0bl4bVjEQ=
+
+ hash2
+
+ dPhusBvgBj73h1ZuWsGsCVHHMzXZUlqHnDnb1dMYhro=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_guid.h
+
+ hash
+
+ +qe4pwSeQDilfoGsQSddhHV2vUw=
+
+ hash2
+
+ mZwI6lGgX6SKgxGS+EoWFe0xL4oohP2pVgPpT7kQXjI=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_haptic.h
+
+ hash
+
+ spxndIYWTumv/KqEL1upOaaDbw8=
+
+ hash2
+
+ m81Pi+WNNpjGpsLWM8EkPqolbvJ8cpdj4tYjo4YlKtQ=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hidapi.h
+
+ hash
+
+ MDTprYwZ0155/rrIVsmAcAHaijE=
+
+ hash2
+
+ hvoNAXTxbTaxT5ZiTZ3/v5VVNJFNGmfMYNsecfet2iQ=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_hints.h
+
+ hash
+
+ 5EwtyU5lf9qyrG2N5/cuACo5+3U=
+
+ hash2
+
+ 0vZJYHQeQCkY3vfqrzCA13jR7Tg2H9WSXMYad6lK2l4=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_init.h
+
+ hash
+
+ xt+XRyxBSg4hKXoTGTbq4rmw9fw=
+
+ hash2
+
+ 7LhP0O26ntkrZdPcCuWRjkXm424l5LA9FQOJtT1i23g=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_intrin.h
+
+ hash
+
+ Kq1mo1fZkIH/HKH/amIPdhoTCh4=
+
+ hash2
+
+ LwGY43+m8i4eQo9+5emflGxQ6iiXTmWXnEh2BmR/sts=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_iostream.h
+
+ hash
+
+ znvH2dvHGuYAL+LrvRzeIQlc1Kw=
+
+ hash2
+
+ GnW3bR48TuvbDNr0hCg5bl/TDI3RDy1ttiGHSzFT5i0=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_joystick.h
+
+ hash
+
+ LDFa0Vfu7aUyFrXweYz61XMAtSY=
+
+ hash2
+
+ 0nBglvFxiGkUIt3RfEezy5bXSmJXUxmkZFciIUzpzRY=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keyboard.h
+
+ hash
+
+ 7bRCUW0PYGdiT5ALqTxyuN8k81o=
+
+ hash2
+
+ j79zksUOi4vVrBvrnPgQJRD4OIQh3UrxdLRuEglwpig=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_keycode.h
+
+ hash
+
+ 7nrB/CfwjugeoW8S6GSafPAhCcI=
+
+ hash2
+
+ dMX0jYn16Lfy0y7tge9wQX8Q+ubJSxOeESV93wkOE9g=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_loadso.h
+
+ hash
+
+ 9X7aeCQBaGlVYLl8WHChoD+y7oE=
+
+ hash2
+
+ Jg/UDLpydORtxkFxbz0XhfNF2Eu302GUG1itkizeXjU=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_locale.h
+
+ hash
+
+ 3UgabWi37OSUaR5Cv3ykSpFRSFU=
+
+ hash2
+
+ B9dUnAsKgcSvvP+eUqf+22xxGX/OmH5eyeBFBSJiDPY=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_log.h
+
+ hash
+
+ AjGovpbmz2+Zjg4vFoA+jRln9Ag=
+
+ hash2
+
+ bUvABdplbCd9/U2eiT2pvPW6VBjJODvBDf8Fu6SnN6M=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main.h
+
+ hash
+
+ nM5LWIZF3HLAad3qVK5YSL8tPo8=
+
+ hash2
+
+ IJWH/4Oc+C0x3p9ywKE4u7Hu+SWaM1JorQRf7hGqmIc=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_main_impl.h
+
+ hash
+
+ /j/z5uFhPx1k4ignpIT7OuI9eCE=
+
+ hash2
+
+ Ju+WlVFk6UcLLVDkNB5EfpFUqT8U4UboWRfUf8TpC0w=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_messagebox.h
+
+ hash
+
+ l3z7HIKvgvcl88uPQgwirKUBGxQ=
+
+ hash2
+
+ uCj0WyHGh8ddQKtPMVQZWCqqsGJBmICQIPJackUC7gc=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_metal.h
+
+ hash
+
+ h/b2709w5AE+fKfTbka2JJvvqDo=
+
+ hash2
+
+ ZnJqoHPIv5xmwZH3Ya/X2Ck2KFHEJFusU9D7jf2SZmw=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_misc.h
+
+ hash
+
+ /UKenlwt9bM3OZPOLaAefIawb0s=
+
+ hash2
+
+ 6xTiBSCOYB6LgCtJjrtEPSu3UNlBDOJq5Ce5PR6FdQ0=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mouse.h
+
+ hash
+
+ U3/L2aFFC+IFjHHspqA/dnmn/tY=
+
+ hash2
+
+ wq2m7lfzfam1bamOmxGBdhjM15QZoabP5kWs/nKh25c=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_mutex.h
+
+ hash
+
+ wUS9C/TOUloJjZlCpzUTJc2L3Nw=
+
+ hash2
+
+ mrt3RuUB/NshrAhNF/Nw5GyUhZ/NS7QPsYOLBhbSQV4=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_oldnames.h
+
+ hash
+
+ qROTHGOa/EOq6psC86LmkXZEgeA=
+
+ hash2
+
+ o8g5jafePszDFnXDKO06Y4WMXEF4kFLbZUotQ8NfiR4=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengl.h
+
+ hash
+
+ 5XjZdn58klM/ZH4xRL32kWFvwmQ=
+
+ hash2
+
+ r7KreHSdayrs85RILI8Xgh+JizNq9Vuze3oi1N7dLnw=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengl_glext.h
+
+ hash
+
+ eOvalGUielSzNuOWWDLYkwqpYrg=
+
+ hash2
+
+ GrsoiRybBmG2/zdJ3iZx2l/hK+tbyxgzsta99ciezfg=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles.h
+
+ hash
+
+ gG8fFwXRxWfFzL5XD2UffDRXZ3Q=
+
+ hash2
+
+ aoo42jon38SwoJd6YxYz+gpHtBEECX685KyFqnRG/yY=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2.h
+
+ hash
+
+ AxfYXQsD0wpyQFFalhC2+H+bbJw=
+
+ hash2
+
+ mfh8cJuZsq8zI8LZw40h4NqpQ16HNuHhbbVHw1q6ZqU=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_gl2.h
+
+ hash
+
+ GbD4M9ZIR9sxgLX4G8T/ojLVQJk=
+
+ hash2
+
+ 1uxEsdc/OvzjogrGl223+z2sZWxRkPC1Y+TOkNeaFao=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_gl2ext.h
+
+ hash
+
+ frTvd+EfShO/uonAvnnsnPkqc80=
+
+ hash2
+
+ T8WwA03N6cElki4+cNAUiaazNQdoVu5mApThpjBaNxk=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_gl2platform.h
+
+ hash
+
+ JO1DB28zz7TCz/P5YCSvV1PaqWg=
+
+ hash2
+
+ R3m+mZrNGQRFgjjwnIaYO3lgrEDmEuBdstuX22FfHg8=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_opengles2_khrplatform.h
+
+ hash
+
+ mBjqEs+5bGC9u1ED2M93VNzONPQ=
+
+ hash2
+
+ ex4Bqqetj2/DS1x733nr9RibsJ4sTS55/F01BiPRHoM=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pen.h
+
+ hash
+
+ 682iJ7WBcXPP59n6GotWTTLbcF4=
+
+ hash2
+
+ IrLPuD9df4GLhqVPV/wYLsMNDtDFlMhMCWC6iOtBQrY=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_pixels.h
+
+ hash
+
+ XMpENyf+JyXMoOlgLXvAVH2XWUk=
+
+ hash2
+
+ /59bliEM9/q7EYaDYAaaH1k0ms7HViADLQUqWEbrqtw=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform.h
+
+ hash
+
+ ibx+rBzgiofjabvIoz74IR6I520=
+
+ hash2
+
+ AWapRPc+AyddZhvn1FMjdcIJdX7crJ1mN78vxLVxm+Y=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_platform_defines.h
+
+ hash
+
+ /Kbr1IehNE5PCihNTCISGfpFGQE=
+
+ hash2
+
+ uRsNq1jA7eXKXqnDtikD181YR+p1cz0EfDnR4VDIpZo=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_power.h
+
+ hash
+
+ VXRD8swjN+SVSGXhEHbx5kJjpws=
+
+ hash2
+
+ UcZ2bS20U4hBnqMc794XIqIxSHx2Xzu+v8TM+ECQPhg=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_properties.h
+
+ hash
+
+ F150c1qnBNLBgeEUC1TBC6Oouoc=
+
+ hash2
+
+ CiomCgkVq6u+WWo2vh+ItNU1JkGtn2HpguEqRlTQzQM=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_rect.h
+
+ hash
+
+ 8qzy2zRniQeliH43voxw/RVwLZs=
+
+ hash2
+
+ kY0XN2lKfI3uLvu7ONQmz7rKppdkMxhw+WKqNW6uxAA=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_render.h
+
+ hash
+
+ E42djJM4TabkF6rgVFoXXb2e6A0=
+
+ hash2
+
+ FVECH+hM+0ohtw2q5nhcqxzGJF0CHZe6OmQCAQIhaC0=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_revision.h
+
+ hash
+
+ wPbbJkv48GXw7JirykuAoX/HX+s=
+
+ hash2
+
+ teAz/wtokUzr1b4mFKTyJE22JNx6UFN1UXg77FNf9ak=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_scancode.h
+
+ hash
+
+ TFln1sCjEKyQIpVx9Rrexg61/tc=
+
+ hash2
+
+ y1LYdhxjN9fO3uY50Ke9sVZ9nKBn2K1LPcjLVYhMOkY=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_sensor.h
+
+ hash
+
+ 9tubC8rImcEZ176ITWeqmbIEmkY=
+
+ hash2
+
+ v4+qhML/25/KBtrv+0p6dfHAuvavG18gXtMdEb8dOAE=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_stdinc.h
+
+ hash
+
+ GK+yk89W1wKKSwfZinmtiLKnkaE=
+
+ hash2
+
+ q8U9OkKiiFSTw63QEqOcQVSHDrye4ql96xRlNnQexrI=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_storage.h
+
+ hash
+
+ WMFpkEtzGQBue7CMmxa0KEGpHHo=
+
+ hash2
+
+ +JyqT3bSkEbASqBLXQdWz1gUsEYDzbme6sxq4gsC3wQ=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_surface.h
+
+ hash
+
+ OkLZ4CQFo0/pQ8F9tHoo8Gdo6c4=
+
+ hash2
+
+ WEzdMAWctrJAv+EVRFvXjGyiNgbwKzJfSbOUK3Ie0KY=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_system.h
+
+ hash
+
+ p/vP9wu1luKvxk5pOpa7c+G+AI4=
+
+ hash2
+
+ SV7kGEe9BC+Z2/7QBwUSFhDMAmmM/fRed60ZEIIkuUY=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_thread.h
+
+ hash
+
+ zj6XYOdz8AUI1EPm52Xzvy24l8k=
+
+ hash2
+
+ Bh60e3q2kAgdB5+SI20aAeGaPnla7y8zrjrxJGS2bm0=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_time.h
+
+ hash
+
+ amXdZSZWmQpHKsgNNVSx+Dzf4pc=
+
+ hash2
+
+ 9MOdJKaCKHDZTKVRGavBiUP4X2nuV9avu4GDi0HPPcQ=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_timer.h
+
+ hash
+
+ q0F4Eu5yrr8qahWsIiPYFFI+S7U=
+
+ hash2
+
+ a2YcPY1PJY1dYcj2dNehwKIwD+j8PEvdvcbJ8jNprZ0=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_touch.h
+
+ hash
+
+ akfk8DSVubEtG3EbGDEif0lzP4I=
+
+ hash2
+
+ 17lNGQel6VfvWYFT5WpZHW/4BZLIfas87t3u87SbFc4=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_version.h
+
+ hash
+
+ sYkB+NDCq7ZZF0DlML1zmn+k79A=
+
+ hash2
+
+ SIdy/p8X6AWtsjbKuapx3GGOdWKPKIwWJI2jWKcz43M=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_video.h
+
+ hash
+
+ tC+nlvGbjtXBTDtkNVqOSFfwms4=
+
+ hash2
+
+ chXwjgFTNkmjS1VAavg8PiZ1KgNK1EXniIfbOtg8bVQ=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Headers/SDL_vulkan.h
+
+ hash
+
+ /l3bNRmSicwCYWC83cV/5Cb3tjU=
+
+ hash2
+
+ XuJ8rZGpOCSBnlWxX1BTv8BXdYTX30nvBvvpQuybC9c=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/Info.plist
+
+ hash
+
+ J1O2OrL3k0KC7u2MiY9gGK3XcJI=
+
+ hash2
+
+ ITsN8sgl05Xrw2GK/D7VFmYZ2vhe5g5puZ4S0oDt0LM=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/License.txt
+
+ hash
+
+ A8VTYHTg+gsOssUp337xdGbdHW0=
+
+ hash2
+
+ UN4cvaEc5FbrLcR2jBIsS5miYCucbhF1iAKC2EMtJhM=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/ReadMe.txt
+
+ hash
+
+ fmvVN4l2bp/qrM2l1v1dfNxJRyo=
+
+ hash2
+
+ gUne5zwAtztNlmXGwQhk5IppZm4RJ3GYBlIcGoKHQXw=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/SDL3
+
+ hash
+
+ Rw67gB3KfdCP57+k+MG7Z08e418=
+
+ hash2
+
+ TijMQoB2j00YOPGPuI2MrQH2xIX4axvhBQJvnkjc7Z4=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/_CodeSignature/CodeResources
+
+ hash
+
+ vIYxq18Z+gEyLlolhSs0uq9hVFk=
+
+ hash2
+
+ JwCEIkg0iU1UKfPDjCrT5bw0u3udeWhI+PPIuyflsi8=
+
+
+ tvos-arm64_x86_64-simulator/SDL3.framework/default.metallib
+
+ hash
+
+ 9R086eHZgkyx+wIhdHDaf4ZNx0w=
+
+ hash2
+
+ ILuM9l3CViGrEmLwI/yuGDKSgxqwPDcfaH6/Q+lZ9/c=
+
+
+
+ rules
+
+ ^.*
+
+ ^.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Base\.lproj/
+
+ weight
+ 1010
+
+ ^version.plist$
+
+
+ rules2
+
+ .*\.dSYM($|/)
+
+ weight
+ 11
+
+ ^(.*/)?\.DS_Store$
+
+ omit
+
+ weight
+ 2000
+
+ ^.*
+
+ ^.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Base\.lproj/
+
+ weight
+ 1010
+
+ ^Info\.plist$
+
+ omit
+
+ weight
+ 20
+
+ ^PkgInfo$
+
+ omit
+
+ weight
+ 20
+
+ ^embedded\.provisionprofile$
+
+ weight
+ 20
+
+ ^version\.plist$
+
+ weight
+ 20
+
+
+
+
diff --git a/Frameworks/SDL3.xcframework/_CodeSignature/CodeSignature b/Frameworks/SDL3.xcframework/_CodeSignature/CodeSignature
new file mode 100644
index 0000000..56ed47c
Binary files /dev/null and b/Frameworks/SDL3.xcframework/_CodeSignature/CodeSignature differ
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/sdl3-config-version.cmake b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/sdl3-config-version.cmake
new file mode 100644
index 0000000..74329c4
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/sdl3-config-version.cmake
@@ -0,0 +1,57 @@
+# based on the files generated by CMake's write_basic_package_version_file
+
+# SDL CMake version configuration file:
+# This file is meant to be placed in Resources/CMake of a SDL3 framework
+
+cmake_minimum_required(VERSION 3.12)
+
+if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/../../Headers/SDL_version.h")
+ message(AUTHOR_WARNING "Could not find SDL_version.h. This script is meant to be placed in the Resources/CMake directory of SDL2.framework")
+ return()
+endif()
+
+file(READ "${CMAKE_CURRENT_LIST_DIR}/../../Headers/SDL_version.h" _sdl_version_h)
+string(REGEX MATCH "#define[ \t]+SDL_MAJOR_VERSION[ \t]+([0-9]+)" _sdl_major_re "${_sdl_version_h}")
+set(_sdl_major "${CMAKE_MATCH_1}")
+string(REGEX MATCH "#define[ \t]+SDL_MINOR_VERSION[ \t]+([0-9]+)" _sdl_minor_re "${_sdl_version_h}")
+set(_sdl_minor "${CMAKE_MATCH_1}")
+string(REGEX MATCH "#define[ \t]+SDL_MICRO_VERSION[ \t]+([0-9]+)" _sdl_micro_re "${_sdl_version_h}")
+set(_sdl_micro "${CMAKE_MATCH_1}")
+if(_sdl_major_re AND _sdl_minor_re AND _sdl_micro_re)
+ set(PACKAGE_VERSION "${_sdl_major}.${_sdl_minor}.${_sdl_micro}")
+else()
+ message(AUTHOR_WARNING "Could not extract version from SDL_version.h.")
+ return()
+endif()
+
+unset(_sdl_major_re)
+unset(_sdl_major)
+unset(_sdl_minor_re)
+unset(_sdl_minor)
+unset(_sdl_micro_re)
+unset(_sdl_micro)
+
+if(PACKAGE_FIND_VERSION_RANGE)
+ # Package version must be in the requested version range
+ if ((PACKAGE_FIND_VERSION_RANGE_MIN STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MIN)
+ OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_GREATER PACKAGE_FIND_VERSION_MAX)
+ OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND PACKAGE_VERSION VERSION_GREATER_EQUAL PACKAGE_FIND_VERSION_MAX)))
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
+ else()
+ set(PACKAGE_VERSION_COMPATIBLE TRUE)
+ endif()
+else()
+ if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
+ else()
+ set(PACKAGE_VERSION_COMPATIBLE TRUE)
+ if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
+ set(PACKAGE_VERSION_EXACT TRUE)
+ endif()
+ endif()
+endif()
+
+# The SDL3.xcframework only contains 64-bit archives
+if(NOT "${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
+ set(PACKAGE_VERSION_UNSUITABLE TRUE)
+endif()
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/sdl3-config.cmake b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/sdl3-config.cmake
new file mode 100644
index 0000000..784d27d
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/CMake/sdl3-config.cmake
@@ -0,0 +1,106 @@
+# SDL3 CMake configuration file:
+# This file is meant to be placed in Resources/CMake of a SDL3 framework
+
+# INTERFACE_LINK_OPTIONS needs CMake 3.12
+cmake_minimum_required(VERSION 3.12)
+
+include(FeatureSummary)
+set_package_properties(SDL3 PROPERTIES
+ URL "https://www.libsdl.org/"
+ DESCRIPTION "low level access to audio, keyboard, mouse, joystick, and graphics hardware"
+)
+
+# Copied from `configure_package_config_file`
+macro(set_and_check _var _file)
+ set(${_var} "${_file}")
+ if(NOT EXISTS "${_file}")
+ message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
+ endif()
+endmacro()
+
+# Copied from `configure_package_config_file`
+macro(check_required_components _NAME)
+ foreach(comp ${${_NAME}_FIND_COMPONENTS})
+ if(NOT ${_NAME}_${comp}_FOUND)
+ if(${_NAME}_FIND_REQUIRED_${comp})
+ set(${_NAME}_FOUND FALSE)
+ endif()
+ endif()
+ endforeach()
+endmacro()
+
+set(SDL3_FOUND TRUE)
+
+# Compute the installation prefix relative to this file.
+set(_sdl3_framework_path "${CMAKE_CURRENT_LIST_DIR}") # > /SDL3.framework/Resources/CMake/
+get_filename_component(_sdl3_framework_path "${_sdl3_framework_path}" REALPATH) # > /SDL3.framework/Versions/Current/Resources/CMake
+get_filename_component(_sdl3_framework_path "${_sdl3_framework_path}" REALPATH) # > /SDL3.framework/Versions/A/Resources/CMake/
+get_filename_component(_sdl3_framework_path "${_sdl3_framework_path}" PATH) # > /SDL3.framework/Versions/A/Resources/
+get_filename_component(_sdl3_framework_path "${_sdl3_framework_path}" PATH) # > /SDL3.framework/Versions/A/
+get_filename_component(_sdl3_framework_path "${_sdl3_framework_path}" PATH) # > /SDL3.framework/Versions/
+get_filename_component(_sdl3_framework_path "${_sdl3_framework_path}" PATH) # > /SDL3.framework/
+get_filename_component(_sdl3_framework_parent_path "${_sdl3_framework_path}" PATH) # > /
+
+
+# All targets are created, even when some might not be requested though COMPONENTS.
+# This is done for compatibility with CMake generated SDL3-target.cmake files.
+
+if(NOT TARGET SDL3::Headers)
+ add_library(SDL3::Headers INTERFACE IMPORTED)
+ set_target_properties(SDL3::Headers
+ PROPERTIES
+ INTERFACE_COMPILE_OPTIONS "SHELL:-F \"${_sdl3_framework_parent_path}\""
+ )
+endif()
+set(SDL3_Headers_FOUND TRUE)
+
+if(NOT TARGET SDL3::SDL3-shared)
+ add_library(SDL3::SDL3-shared SHARED IMPORTED)
+ set_target_properties(SDL3::SDL3-shared
+ PROPERTIES
+ FRAMEWORK "TRUE"
+ IMPORTED_LOCATION "${_sdl3_framework_path}/SDL3"
+ INTERFACE_LINK_LIBRARIES "SDL3::Headers"
+ COMPATIBLE_INTERFACE_BOOL "SDL3_SHARED"
+ INTERFACE_SDL3_SHARED "ON"
+ COMPATIBLE_INTERFACE_STRING "SDL_VERSION"
+ INTERFACE_SDL_VERSION "SDL3"
+ )
+endif()
+set(SDL3_SDL3-shared_FOUND TRUE)
+
+set(SDL3_SDL3-static FALSE)
+
+set(SDL3_SDL3_test FALSE)
+
+unset(_sdl3_framework_parent_path)
+unset(_sdl3_framework_path)
+
+if(SDL3_SDL3-shared_FOUND)
+ set(SDL3_SDL3_FOUND TRUE)
+endif()
+
+function(_sdl_create_target_alias_compat NEW_TARGET TARGET)
+ if(CMAKE_VERSION VERSION_LESS "3.18")
+ # Aliasing local targets is not supported on CMake < 3.18, so make it global.
+ add_library(${NEW_TARGET} INTERFACE IMPORTED)
+ set_target_properties(${NEW_TARGET} PROPERTIES INTERFACE_LINK_LIBRARIES "${TARGET}")
+ else()
+ add_library(${NEW_TARGET} ALIAS ${TARGET})
+ endif()
+endfunction()
+
+# Make sure SDL3::SDL3 always exists
+if(NOT TARGET SDL3::SDL3)
+ if(TARGET SDL3::SDL3-shared)
+ _sdl_create_target_alias_compat(SDL3::SDL3 SDL3::SDL3-shared)
+ endif()
+endif()
+
+check_required_components(SDL3)
+
+set(SDL3_LIBRARIES SDL3::SDL3)
+set(SDL3_STATIC_LIBRARIES SDL3::SDL3-static)
+set(SDL3_STATIC_PRIVATE_LIBS)
+
+set(SDL3TEST_LIBRARY SDL3::SDL3_test)
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL.h
new file mode 100644
index 0000000..4e18f63
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL.h
@@ -0,0 +1,83 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * \file SDL.h
+ *
+ * Main include header for the SDL library, version 3.1.2
+ */
+
+#ifndef SDL_h_
+#define SDL_h_
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#endif /* SDL_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_assert.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_assert.h
new file mode 100644
index 0000000..346d1e3
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_assert.h
@@ -0,0 +1,551 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryAssert
+ *
+ * A helpful assertion macro!
+ *
+ * SDL assertions operate like your usual `assert` macro, but with some added
+ * features:
+ *
+ * - It uses a trick with the `sizeof` operator, so disabled assertions
+ * vaporize out of the compiled code, but variables only referenced in the
+ * assertion won't trigger compiler warnings about being unused.
+ * - It is safe to use with a dangling-else: `if (x) SDL_assert(y); else
+ * do_something();`
+ * - It works the same everywhere, instead of counting on various platforms'
+ * compiler and C runtime to behave.
+ * - It provides multiple levels of assertion (SDL_assert, SDL_assert_release,
+ * SDL_assert_paranoid) instead of a single all-or-nothing option.
+ * - It offers a variety of responses when an assertion fails (retry, trigger
+ * the debugger, abort the program, ignore the failure once, ignore it for
+ * the rest of the program's run).
+ * - It tries to show the user a dialog by default, if possible, but the app
+ * can provide a callback to handle assertion failures however they like.
+ * - It lets failed assertions be retried. Perhaps you had a network failure
+ * and just want to retry the test after plugging your network cable back
+ * in? You can.
+ * - It lets the user ignore an assertion failure, if there's a harmless
+ * problem that one can continue past.
+ * - It lets the user mark an assertion as ignored for the rest of the
+ * program's run; if there's a harmless problem that keeps popping up.
+ * - It provides statistics and data on all failed assertions to the app.
+ * - It allows the default assertion handler to be controlled with environment
+ * variables, in case an automated script needs to control it.
+ *
+ * To use it: do a debug build and just sprinkle around tests to check your
+ * code!
+ */
+
+#ifndef SDL_assert_h_
+#define SDL_assert_h_
+
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef SDL_WIKI_DOCUMENTATION_SECTION
+
+/**
+ * The level of assertion aggressiveness.
+ *
+ * This value changes depending on compiler options and other preprocessor
+ * defines.
+ *
+ * It is currently one of the following values, but future SDL releases might
+ * add more:
+ *
+ * - 0: All SDL assertion macros are disabled.
+ * - 1: Release settings: SDL_assert disabled, SDL_assert_release enabled.
+ * - 2: Debug settings: SDL_assert and SDL_assert_release enabled.
+ * - 3: Paranoid settings: All SDL assertion macros enabled, including
+ * SDL_assert_paranoid.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_ASSERT_LEVEL SomeNumberBasedOnVariousFactors
+
+#elif !defined(SDL_ASSERT_LEVEL)
+#ifdef SDL_DEFAULT_ASSERT_LEVEL
+#define SDL_ASSERT_LEVEL SDL_DEFAULT_ASSERT_LEVEL
+#elif defined(_DEBUG) || defined(DEBUG) || \
+ (defined(__GNUC__) && !defined(__OPTIMIZE__))
+#define SDL_ASSERT_LEVEL 2
+#else
+#define SDL_ASSERT_LEVEL 1
+#endif
+#endif
+
+#ifdef SDL_WIKI_DOCUMENTATION_SECTION
+
+/**
+ * Attempt to tell an attached debugger to pause.
+ *
+ * This allows an app to programmatically halt ("break") the debugger as if it
+ * had hit a breakpoint, allowing the developer to examine program state, etc.
+ *
+ * This is a macro--not a function--so that the debugger breaks on the source
+ * code line that used SDL_TriggerBreakpoint and not in some random guts of
+ * SDL. SDL_assert uses this macro for the same reason.
+ *
+ * If the program is not running under a debugger, SDL_TriggerBreakpoint will
+ * likely terminate the app, possibly without warning. If the current platform
+ * isn't supported (SDL doesn't know how to trigger a breakpoint), this macro
+ * does nothing.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_TriggerBreakpoint() TriggerABreakpointInAPlatformSpecificManner
+
+#elif defined(_MSC_VER)
+ /* Don't include intrin.h here because it contains C++ code */
+ extern void __cdecl __debugbreak(void);
+ #define SDL_TriggerBreakpoint() __debugbreak()
+#elif defined(ANDROID)
+ #include
+ #define SDL_TriggerBreakpoint() assert(0)
+#elif SDL_HAS_BUILTIN(__builtin_debugtrap)
+ #define SDL_TriggerBreakpoint() __builtin_debugtrap()
+#elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))
+ #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" )
+#elif (defined(__GNUC__) || defined(__clang__)) && defined(__riscv)
+ #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "ebreak\n\t" )
+#elif ( defined(SDL_PLATFORM_APPLE) && (defined(__arm64__) || defined(__aarch64__)) ) /* this might work on other ARM targets, but this is a known quantity... */
+ #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "brk #22\n\t" )
+#elif defined(SDL_PLATFORM_APPLE) && defined(__arm__)
+ #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "bkpt #22\n\t" )
+#elif defined(_WIN32) && ((defined(__GNUC__) || defined(__clang__)) && (defined(__arm64__) || defined(__aarch64__)) )
+ #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "brk #0xF000\n\t" )
+#elif defined(__386__) && defined(__WATCOMC__)
+ #define SDL_TriggerBreakpoint() { _asm { int 0x03 } }
+#elif defined(HAVE_SIGNAL_H) && !defined(__WATCOMC__)
+ #include
+ #define SDL_TriggerBreakpoint() raise(SIGTRAP)
+#else
+ /* How do we trigger breakpoints on this platform? */
+ #define SDL_TriggerBreakpoint()
+#endif
+
+#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */
+# define SDL_FUNCTION __func__
+#elif ((defined(__GNUC__) && (__GNUC__ >= 2)) || defined(_MSC_VER) || defined (__WATCOMC__))
+# define SDL_FUNCTION __FUNCTION__
+#else
+# define SDL_FUNCTION "???"
+#endif
+#define SDL_FILE __FILE__
+#define SDL_LINE __LINE__
+
+/*
+sizeof (x) makes the compiler still parse the expression even without
+assertions enabled, so the code is always checked at compile time, but
+doesn't actually generate code for it, so there are no side effects or
+expensive checks at run time, just the constant size of what x WOULD be,
+which presumably gets optimized out as unused.
+This also solves the problem of...
+
+ int somevalue = blah();
+ SDL_assert(somevalue == 1);
+
+...which would cause compiles to complain that somevalue is unused if we
+disable assertions.
+*/
+
+/* "while (0,0)" fools Microsoft's compiler's /W4 warning level into thinking
+ this condition isn't constant. And looks like an owl's face! */
+#ifdef _MSC_VER /* stupid /W4 warnings. */
+#define SDL_NULL_WHILE_LOOP_CONDITION (0,0)
+#else
+#define SDL_NULL_WHILE_LOOP_CONDITION (0)
+#endif
+
+#define SDL_disabled_assert(condition) \
+ do { (void) sizeof ((condition)); } while (SDL_NULL_WHILE_LOOP_CONDITION)
+
+/**
+ * Possible outcomes from a triggered assertion.
+ *
+ * When an enabled assertion triggers, it may call the assertion handler
+ * (possibly one provided by the app via SDL_SetAssertionHandler), which will
+ * return one of these values, possibly after asking the user.
+ *
+ * Then SDL will respond based on this outcome (loop around to retry the
+ * condition, try to break in a debugger, kill the program, or ignore the
+ * problem).
+ *
+ * \since This enum is available since SDL 3.0.0.
+ */
+typedef enum SDL_AssertState
+{
+ SDL_ASSERTION_RETRY, /**< Retry the assert immediately. */
+ SDL_ASSERTION_BREAK, /**< Make the debugger trigger a breakpoint. */
+ SDL_ASSERTION_ABORT, /**< Terminate the program. */
+ SDL_ASSERTION_IGNORE, /**< Ignore the assert. */
+ SDL_ASSERTION_ALWAYS_IGNORE /**< Ignore the assert from now on. */
+} SDL_AssertState;
+
+/**
+ * Information about an assertion failure.
+ *
+ * This structure is filled in with information about a triggered assertion,
+ * used by the assertion handler, then added to the assertion report. This is
+ * returned as a linked list from SDL_GetAssertionReport().
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_AssertData
+{
+ SDL_bool always_ignore; /**< SDL_TRUE if app should always continue when assertion is triggered. */
+ unsigned int trigger_count; /**< Number of times this assertion has been triggered. */
+ const char *condition; /**< A string of this assert's test code. */
+ const char *filename; /**< The source file where this assert lives. */
+ int linenum; /**< The line in `filename` where this assert lives. */
+ const char *function; /**< The name of the function where this assert lives. */
+ const struct SDL_AssertData *next; /**< next item in the linked list. */
+} SDL_AssertData;
+
+/**
+ * Never call this directly.
+ *
+ * Use the SDL_assert* macros instead.
+ *
+ * \param data assert data structure.
+ * \param func function name.
+ * \param file file name.
+ * \param line line number.
+ * \returns assert state.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *data,
+ const char *func,
+ const char *file, int line) SDL_ANALYZER_NORETURN;
+
+/* Define the trigger breakpoint call used in asserts */
+#ifndef SDL_AssertBreakpoint
+#if defined(ANDROID) && defined(assert)
+/* Define this as empty in case assert() is defined as SDL_assert */
+#define SDL_AssertBreakpoint()
+#else
+#define SDL_AssertBreakpoint() SDL_TriggerBreakpoint()
+#endif
+#endif /* !SDL_AssertBreakpoint */
+
+/* the do {} while(0) avoids dangling else problems:
+ if (x) SDL_assert(y); else blah();
+ ... without the do/while, the "else" could attach to this macro's "if".
+ We try to handle just the minimum we need here in a macro...the loop,
+ the static vars, and break points. The heavy lifting is handled in
+ SDL_ReportAssertion(), in SDL_assert.c.
+*/
+#define SDL_enabled_assert(condition) \
+ do { \
+ while ( !(condition) ) { \
+ static struct SDL_AssertData sdl_assert_data = { 0, 0, #condition, 0, 0, 0, 0 }; \
+ const SDL_AssertState sdl_assert_state = SDL_ReportAssertion(&sdl_assert_data, SDL_FUNCTION, SDL_FILE, SDL_LINE); \
+ if (sdl_assert_state == SDL_ASSERTION_RETRY) { \
+ continue; /* go again. */ \
+ } else if (sdl_assert_state == SDL_ASSERTION_BREAK) { \
+ SDL_AssertBreakpoint(); \
+ } \
+ break; /* not retrying. */ \
+ } \
+ } while (SDL_NULL_WHILE_LOOP_CONDITION)
+
+#ifdef SDL_WIKI_DOCUMENTATION_SECTION
+
+/**
+ * An assertion test that is normally performed only in debug builds.
+ *
+ * This macro is enabled when the SDL_ASSERT_LEVEL is >= 2, otherwise it is
+ * disabled. This is meant to only do these tests in debug builds, so they can
+ * tend to be more expensive, and they are meant to bring everything to a halt
+ * when they fail, with the programmer there to assess the problem.
+ *
+ * In short: you can sprinkle these around liberally and assume they will
+ * evaporate out of the build when building for end-users.
+ *
+ * When assertions are disabled, this wraps `condition` in a `sizeof`
+ * operator, which means any function calls and side effects will not run, but
+ * the compiler will not complain about any otherwise-unused variables that
+ * are only referenced in the assertion.
+ *
+ * One can set the environment variable "SDL_ASSERT" to one of several strings
+ * ("abort", "break", "retry", "ignore", "always_ignore") to force a default
+ * behavior, which may be desirable for automation purposes. If your platform
+ * requires GUI interfaces to happen on the main thread but you're debugging
+ * an assertion in a background thread, it might be desirable to set this to
+ * "break" so that your debugger takes control as soon as assert is triggered,
+ * instead of risking a bad UI interaction (deadlock, etc) in the application.
+ *
+ * Note that SDL_ASSERT is an _environment variable_ and not an SDL hint!
+ * Please refer to your platform's documentation for how to set it!
+ *
+ * \param condition boolean value to test.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_assert(condition) if (assertion_enabled && (condition)) { trigger_assertion; }
+
+/**
+ * An assertion test that is performed even in release builds.
+ *
+ * This macro is enabled when the SDL_ASSERT_LEVEL is >= 1, otherwise it is
+ * disabled. This is meant to be for tests that are cheap to make and
+ * extremely unlikely to fail; generally it is frowned upon to have an
+ * assertion failure in a release build, so these assertions generally need to
+ * be of more than life-and-death importance if there's a chance they might
+ * trigger. You should almost always consider handling these cases more
+ * gracefully than an assert allows.
+ *
+ * When assertions are disabled, this wraps `condition` in a `sizeof`
+ * operator, which means any function calls and side effects will not run, but
+ * the compiler will not complain about any otherwise-unused variables that
+ * are only referenced in the assertion.
+ *
+ * One can set the environment variable "SDL_ASSERT" to one of several strings
+ * ("abort", "break", "retry", "ignore", "always_ignore") to force a default
+ * behavior, which may be desirable for automation purposes. If your platform
+ * requires GUI interfaces to happen on the main thread but you're debugging
+ * an assertion in a background thread, it might be desirable to set this to
+ * "break" so that your debugger takes control as soon as assert is triggered,
+ * instead of risking a bad UI interaction (deadlock, etc) in the application.
+ *
+ * Note that SDL_ASSERT is an _environment variable_ and not an SDL hint!
+ * Please refer to your platform's documentation for how to set it!
+ *
+ * \param condition boolean value to test.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_assert_release(condition) SDL_disabled_assert(condition)
+
+/**
+ * An assertion test that is performed only when built with paranoid settings.
+ *
+ * This macro is enabled when the SDL_ASSERT_LEVEL is >= 3, otherwise it is
+ * disabled. This is a higher level than both release and debug, so these
+ * tests are meant to be expensive and only run when specifically looking for
+ * extremely unexpected failure cases in a special build.
+ *
+ * When assertions are disabled, this wraps `condition` in a `sizeof`
+ * operator, which means any function calls and side effects will not run, but
+ * the compiler will not complain about any otherwise-unused variables that
+ * are only referenced in the assertion.
+ *
+ * One can set the environment variable "SDL_ASSERT" to one of several strings
+ * ("abort", "break", "retry", "ignore", "always_ignore") to force a default
+ * behavior, which may be desirable for automation purposes. If your platform
+ * requires GUI interfaces to happen on the main thread but you're debugging
+ * an assertion in a background thread, it might be desirable to set this to
+ * "break" so that your debugger takes control as soon as assert is triggered,
+ * instead of risking a bad UI interaction (deadlock, etc) in the application.
+ *
+ * Note that SDL_ASSERT is an _environment variable_ and not an SDL hint!
+ * Please refer to your platform's documentation for how to set it!
+ *
+ * \param condition boolean value to test.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)
+#endif
+
+/* Enable various levels of assertions. */
+#if SDL_ASSERT_LEVEL == 0 /* assertions disabled */
+# define SDL_assert(condition) SDL_disabled_assert(condition)
+# define SDL_assert_release(condition) SDL_disabled_assert(condition)
+# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)
+#elif SDL_ASSERT_LEVEL == 1 /* release settings. */
+# define SDL_assert(condition) SDL_disabled_assert(condition)
+# define SDL_assert_release(condition) SDL_enabled_assert(condition)
+# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)
+#elif SDL_ASSERT_LEVEL == 2 /* debug settings. */
+# define SDL_assert(condition) SDL_enabled_assert(condition)
+# define SDL_assert_release(condition) SDL_enabled_assert(condition)
+# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)
+#elif SDL_ASSERT_LEVEL == 3 /* paranoid settings. */
+# define SDL_assert(condition) SDL_enabled_assert(condition)
+# define SDL_assert_release(condition) SDL_enabled_assert(condition)
+# define SDL_assert_paranoid(condition) SDL_enabled_assert(condition)
+#else
+# error Unknown assertion level.
+#endif
+
+/**
+ * An assertion test that always performed.
+ *
+ * This macro is always enabled no matter what SDL_ASSERT_LEVEL is set to. You
+ * almost never want to use this, as it could trigger on an end-user's system,
+ * crashing your program.
+ *
+ * One can set the environment variable "SDL_ASSERT" to one of several strings
+ * ("abort", "break", "retry", "ignore", "always_ignore") to force a default
+ * behavior, which may be desirable for automation purposes. If your platform
+ * requires GUI interfaces to happen on the main thread but you're debugging
+ * an assertion in a background thread, it might be desirable to set this to
+ * "break" so that your debugger takes control as soon as assert is triggered,
+ * instead of risking a bad UI interaction (deadlock, etc) in the application.
+ *
+ * Note that SDL_ASSERT is an _environment variable_ and not an SDL hint!
+ * Please refer to your platform's documentation for how to set it!
+ *
+ * \param condition boolean value to test.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_assert_always(condition) SDL_enabled_assert(condition)
+
+
+/**
+ * A callback that fires when an SDL assertion fails.
+ *
+ * \param data a pointer to the SDL_AssertData structure corresponding to the
+ * current assertion.
+ * \param userdata what was passed as `userdata` to SDL_SetAssertionHandler().
+ * \returns an SDL_AssertState value indicating how to handle the failure.
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ */
+typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)(
+ const SDL_AssertData *data, void *userdata);
+
+/**
+ * Set an application-defined assertion handler.
+ *
+ * This function allows an application to show its own assertion UI and/or
+ * force the response to an assertion failure. If the application doesn't
+ * provide this, SDL will try to do the right thing, popping up a
+ * system-specific GUI dialog, and probably minimizing any fullscreen windows.
+ *
+ * This callback may fire from any thread, but it runs wrapped in a mutex, so
+ * it will only fire from one thread at a time.
+ *
+ * This callback is NOT reset to SDL's internal handler upon SDL_Quit()!
+ *
+ * \param handler the SDL_AssertionHandler function to call when an assertion
+ * fails or NULL for the default handler.
+ * \param userdata a pointer that is passed to `handler`.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetAssertionHandler
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_SetAssertionHandler(
+ SDL_AssertionHandler handler,
+ void *userdata);
+
+/**
+ * Get the default assertion handler.
+ *
+ * This returns the function pointer that is called by default when an
+ * assertion is triggered. This is an internal function provided by SDL, that
+ * is used for assertions when SDL_SetAssertionHandler() hasn't been used to
+ * provide a different function.
+ *
+ * \returns the default SDL_AssertionHandler that is called when an assert
+ * triggers.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetAssertionHandler
+ */
+extern SDL_DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetDefaultAssertionHandler(void);
+
+/**
+ * Get the current assertion handler.
+ *
+ * This returns the function pointer that is called when an assertion is
+ * triggered. This is either the value last passed to
+ * SDL_SetAssertionHandler(), or if no application-specified function is set,
+ * is equivalent to calling SDL_GetDefaultAssertionHandler().
+ *
+ * The parameter `puserdata` is a pointer to a void*, which will store the
+ * "userdata" pointer that was passed to SDL_SetAssertionHandler(). This value
+ * will always be NULL for the default handler. If you don't care about this
+ * data, it is safe to pass a NULL pointer to this function to ignore it.
+ *
+ * \param puserdata pointer which is filled with the "userdata" pointer that
+ * was passed to SDL_SetAssertionHandler().
+ * \returns the SDL_AssertionHandler that is called when an assert triggers.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAssertionHandler
+ */
+extern SDL_DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void **puserdata);
+
+/**
+ * Get a list of all assertion failures.
+ *
+ * This function gets all assertions triggered since the last call to
+ * SDL_ResetAssertionReport(), or the start of the program.
+ *
+ * The proper way to examine this data looks something like this:
+ *
+ * ```c
+ * const SDL_AssertData *item = SDL_GetAssertionReport();
+ * while (item) {
+ * printf("'%s', %s (%s:%d), triggered %u times, always ignore: %s.\\n",
+ * item->condition, item->function, item->filename,
+ * item->linenum, item->trigger_count,
+ * item->always_ignore ? "yes" : "no");
+ * item = item->next;
+ * }
+ * ```
+ *
+ * \returns a list of all failed assertions or NULL if the list is empty. This
+ * memory should not be modified or freed by the application.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_ResetAssertionReport
+ */
+extern SDL_DECLSPEC const SDL_AssertData * SDLCALL SDL_GetAssertionReport(void);
+
+/**
+ * Clear the list of all assertion failures.
+ *
+ * This function will clear the list of all assertions triggered up to that
+ * point. Immediately following this call, SDL_GetAssertionReport will return
+ * no items. In addition, any previously-triggered assertions will be reset to
+ * a trigger_count of zero, and their always_ignore state will be false.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetAssertionReport
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_ResetAssertionReport(void);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_assert_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_atomic.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_atomic.h
new file mode 100644
index 0000000..fbf01c4
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_atomic.h
@@ -0,0 +1,507 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryAtomic
+ *
+ * Atomic operations.
+ *
+ * IMPORTANT: If you are not an expert in concurrent lockless programming, you
+ * should not be using any functions in this file. You should be protecting
+ * your data structures with full mutexes instead.
+ *
+ * ***Seriously, here be dragons!***
+ *
+ * You can find out a little more about lockless programming and the subtle
+ * issues that can arise here:
+ * https://learn.microsoft.com/en-us/windows/win32/dxtecharts/lockless-programming
+ *
+ * There's also lots of good information here:
+ *
+ * - https://www.1024cores.net/home/lock-free-algorithms
+ * - https://preshing.com/
+ *
+ * These operations may or may not actually be implemented using processor
+ * specific atomic operations. When possible they are implemented as true
+ * processor specific atomic operations. When that is not possible the are
+ * implemented using locks that *do* use the available atomic operations.
+ *
+ * All of the atomic operations that modify memory are full memory barriers.
+ */
+
+#ifndef SDL_atomic_h_
+#define SDL_atomic_h_
+
+#include
+#include
+
+#include
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * An atomic spinlock.
+ *
+ * The atomic locks are efficient spinlocks using CPU instructions, but are
+ * vulnerable to starvation and can spin forever if a thread holding a lock
+ * has been terminated. For this reason you should minimize the code executed
+ * inside an atomic lock and never do expensive things like API or system
+ * calls while holding them.
+ *
+ * They are also vulnerable to starvation if the thread holding the lock is
+ * lower priority than other threads and doesn't get scheduled. In general you
+ * should use mutexes instead, since they have better performance and
+ * contention behavior.
+ *
+ * The atomic locks are not safe to lock recursively.
+ *
+ * Porting Note: The spin lock functions and type are required and can not be
+ * emulated because they are used in the atomic emulation code.
+ */
+typedef int SDL_SpinLock;
+
+/**
+ * Try to lock a spin lock by setting it to a non-zero value.
+ *
+ * ***Please note that spinlocks are dangerous if you don't know what you're
+ * doing. Please be careful using any sort of spinlock!***
+ *
+ * \param lock a pointer to a lock variable.
+ * \returns SDL_TRUE if the lock succeeded, SDL_FALSE if the lock is already
+ * held.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_LockSpinlock
+ * \sa SDL_UnlockSpinlock
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TryLockSpinlock(SDL_SpinLock *lock);
+
+/**
+ * Lock a spin lock by setting it to a non-zero value.
+ *
+ * ***Please note that spinlocks are dangerous if you don't know what you're
+ * doing. Please be careful using any sort of spinlock!***
+ *
+ * \param lock a pointer to a lock variable.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_TryLockSpinlock
+ * \sa SDL_UnlockSpinlock
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_LockSpinlock(SDL_SpinLock *lock);
+
+/**
+ * Unlock a spin lock by setting it to 0.
+ *
+ * Always returns immediately.
+ *
+ * ***Please note that spinlocks are dangerous if you don't know what you're
+ * doing. Please be careful using any sort of spinlock!***
+ *
+ * \param lock a pointer to a lock variable.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_LockSpinlock
+ * \sa SDL_TryLockSpinlock
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_UnlockSpinlock(SDL_SpinLock *lock);
+
+
+#ifdef SDL_WIKI_DOCUMENTATION_SECTION
+
+/**
+ * Mark a compiler barrier.
+ *
+ * A compiler barrier prevents the compiler from reordering reads and writes
+ * to globally visible variables across the call.
+ *
+ * This macro only prevents the compiler from reordering reads and writes, it
+ * does not prevent the CPU from reordering reads and writes. However, all of
+ * the atomic operations that modify memory are full memory barriers.
+ *
+ * \threadsafety Obviously this macro is safe to use from any thread at any
+ * time, but if you find yourself needing this, you are probably
+ * dealing with some very sensitive code; be careful!
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_CompilerBarrier() DoCompilerSpecificReadWriteBarrier()
+#elif defined(_MSC_VER) && (_MSC_VER > 1200) && !defined(__clang__)
+void _ReadWriteBarrier(void);
+#pragma intrinsic(_ReadWriteBarrier)
+#define SDL_CompilerBarrier() _ReadWriteBarrier()
+#elif (defined(__GNUC__) && !defined(SDL_PLATFORM_EMSCRIPTEN)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))
+/* This is correct for all CPUs when using GCC or Solaris Studio 12.1+. */
+#define SDL_CompilerBarrier() __asm__ __volatile__ ("" : : : "memory")
+#elif defined(__WATCOMC__)
+extern __inline void SDL_CompilerBarrier(void);
+#pragma aux SDL_CompilerBarrier = "" parm [] modify exact [];
+#else
+#define SDL_CompilerBarrier() \
+{ SDL_SpinLock _tmp = 0; SDL_LockSpinlock(&_tmp); SDL_UnlockSpinlock(&_tmp); }
+#endif
+
+/**
+ * Insert a memory release barrier.
+ *
+ * Memory barriers are designed to prevent reads and writes from being
+ * reordered by the compiler and being seen out of order on multi-core CPUs.
+ *
+ * A typical pattern would be for thread A to write some data and a flag, and
+ * for thread B to read the flag and get the data. In this case you would
+ * insert a release barrier between writing the data and the flag,
+ * guaranteeing that the data write completes no later than the flag is
+ * written, and you would insert an acquire barrier between reading the flag
+ * and reading the data, to ensure that all the reads associated with the flag
+ * have completed.
+ *
+ * In this pattern you should always see a release barrier paired with an
+ * acquire barrier and you should gate the data reads/writes with a single
+ * flag variable.
+ *
+ * For more information on these semantics, take a look at the blog post:
+ * http://preshing.com/20120913/acquire-and-release-semantics
+ *
+ * \threadsafety Obviously this macro is safe to use from any thread at any
+ * time, but if you find yourself needing this, you are probably
+ * dealing with some very sensitive code; be careful!
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierReleaseFunction(void);
+
+/**
+ * Insert a memory acquire barrier.
+ *
+ * Please refer to SDL_MemoryBarrierReleaseFunction for the details!
+ *
+ * \threadsafety Obviously this function is safe to use from any thread at any
+ * time, but if you find yourself needing this, you are probably
+ * dealing with some very sensitive code; be careful!
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_MemoryBarrierReleaseFunction
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void);
+
+/* !!! FIXME: this should have documentation! */
+#if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
+#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("lwsync" : : : "memory")
+#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("lwsync" : : : "memory")
+#elif defined(__GNUC__) && defined(__aarch64__)
+#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory")
+#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory")
+#elif defined(__GNUC__) && defined(__arm__)
+#if 0 /* defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_ANDROID) */
+/* Information from:
+ https://chromium.googlesource.com/chromium/chromium/+/trunk/base/atomicops_internals_arm_gcc.h#19
+
+ The Linux kernel provides a helper function which provides the right code for a memory barrier,
+ hard-coded at address 0xffff0fa0
+*/
+typedef void (*SDL_KernelMemoryBarrierFunc)();
+#define SDL_MemoryBarrierRelease() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)()
+#define SDL_MemoryBarrierAcquire() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)()
+#else
+#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) || defined(__ARM_ARCH_8A__)
+#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory")
+#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory")
+#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__)
+#ifdef __thumb__
+/* The mcr instruction isn't available in thumb mode, use real functions */
+#define SDL_MEMORY_BARRIER_USES_FUNCTION
+#define SDL_MemoryBarrierRelease() SDL_MemoryBarrierReleaseFunction()
+#define SDL_MemoryBarrierAcquire() SDL_MemoryBarrierAcquireFunction()
+#else
+#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory")
+#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory")
+#endif /* __thumb__ */
+#else
+#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("" : : : "memory")
+#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("" : : : "memory")
+#endif /* SDL_PLATFORM_LINUX || SDL_PLATFORM_ANDROID */
+#endif /* __GNUC__ && __arm__ */
+#else
+#if (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))
+/* This is correct for all CPUs on Solaris when using Solaris Studio 12.1+. */
+#include
+#define SDL_MemoryBarrierRelease() __machine_rel_barrier()
+#define SDL_MemoryBarrierAcquire() __machine_acq_barrier()
+#else
+/* This is correct for the x86 and x64 CPUs, and we'll expand this over time. */
+#define SDL_MemoryBarrierRelease() SDL_CompilerBarrier()
+#define SDL_MemoryBarrierAcquire() SDL_CompilerBarrier()
+#endif
+#endif
+
+/* "REP NOP" is PAUSE, coded for tools that don't know it by that name. */
+#ifdef SDL_WIKI_DOCUMENTATION_SECTION
+
+/**
+ * A macro to insert a CPU-specific "pause" instruction into the program.
+ *
+ * This can be useful in busy-wait loops, as it serves as a hint to the CPU as
+ * to the program's intent; some CPUs can use this to do more efficient
+ * processing. On some platforms, this doesn't do anything, so using this
+ * macro might just be a harmless no-op.
+ *
+ * Note that if you are busy-waiting, there are often more-efficient
+ * approaches with other synchronization primitives: mutexes, semaphores,
+ * condition variables, etc.
+ *
+ * \threadsafety This macro is safe to use from any thread.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_CPUPauseInstruction() DoACPUPauseInACompilerAndArchitectureSpecificWay
+#elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))
+ #define SDL_CPUPauseInstruction() __asm__ __volatile__("pause\n") /* Some assemblers can't do REP NOP, so go with PAUSE. */
+#elif (defined(__arm__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7) || defined(__aarch64__)
+ #define SDL_CPUPauseInstruction() __asm__ __volatile__("yield" ::: "memory")
+#elif (defined(__powerpc__) || defined(__powerpc64__))
+ #define SDL_CPUPauseInstruction() __asm__ __volatile__("or 27,27,27");
+#elif (defined(__riscv) && __riscv_xlen == 64)
+ #define SDL_CPUPauseInstruction() __asm__ __volatile__(".insn i 0x0F, 0, x0, x0, 0x010");
+#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
+ #define SDL_CPUPauseInstruction() _mm_pause() /* this is actually "rep nop" and not a SIMD instruction. No inline asm in MSVC x86-64! */
+#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64))
+ #define SDL_CPUPauseInstruction() __yield()
+#elif defined(__WATCOMC__) && defined(__386__)
+ extern __inline void SDL_CPUPauseInstruction(void);
+ #pragma aux SDL_CPUPauseInstruction = ".686p" ".xmm2" "pause"
+#else
+ #define SDL_CPUPauseInstruction()
+#endif
+
+
+/**
+ * A type representing an atomic integer value.
+ *
+ * This can be used to manage a value that is synchronized across multiple
+ * CPUs without a race condition; when an app sets a value with SDL_AtomicSet
+ * all other threads, regardless of the CPU it is running on, will see that
+ * value when retrieved with SDL_AtomicGet, regardless of CPU caches, etc.
+ *
+ * This is also useful for atomic compare-and-swap operations: a thread can
+ * change the value as long as its current value matches expectations. When
+ * done in a loop, one can guarantee data consistency across threads without a
+ * lock (but the usual warnings apply: if you don't know what you're doing, or
+ * you don't do it carefully, you can confidently cause any number of
+ * disasters with this, so in most cases, you _should_ use a mutex instead of
+ * this!).
+ *
+ * This is a struct so people don't accidentally use numeric operations on it
+ * directly. You have to use SDL_Atomic* functions.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_AtomicCompareAndSwap
+ * \sa SDL_AtomicGet
+ * \sa SDL_AtomicSet
+ * \sa SDL_AtomicAdd
+ */
+typedef struct SDL_AtomicInt { int value; } SDL_AtomicInt;
+
+/**
+ * Set an atomic variable to a new value if it is currently an old value.
+ *
+ * ***Note: If you don't know what this function is for, you shouldn't use
+ * it!***
+ *
+ * \param a a pointer to an SDL_AtomicInt variable to be modified.
+ * \param oldval the old value.
+ * \param newval the new value.
+ * \returns SDL_TRUE if the atomic variable was set, SDL_FALSE otherwise.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AtomicCompareAndSwapPointer
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AtomicCompareAndSwap(SDL_AtomicInt *a, int oldval, int newval);
+
+/**
+ * Set an atomic variable to a value.
+ *
+ * This function also acts as a full memory barrier.
+ *
+ * ***Note: If you don't know what this function is for, you shouldn't use
+ * it!***
+ *
+ * \param a a pointer to an SDL_AtomicInt variable to be modified.
+ * \param v the desired value.
+ * \returns the previous value of the atomic variable.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AtomicGet
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_AtomicSet(SDL_AtomicInt *a, int v);
+
+/**
+ * Get the value of an atomic variable.
+ *
+ * ***Note: If you don't know what this function is for, you shouldn't use
+ * it!***
+ *
+ * \param a a pointer to an SDL_AtomicInt variable.
+ * \returns the current value of an atomic variable.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AtomicSet
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_AtomicGet(SDL_AtomicInt *a);
+
+/**
+ * Add to an atomic variable.
+ *
+ * This function also acts as a full memory barrier.
+ *
+ * ***Note: If you don't know what this function is for, you shouldn't use
+ * it!***
+ *
+ * \param a a pointer to an SDL_AtomicInt variable to be modified.
+ * \param v the desired value to add.
+ * \returns the previous value of the atomic variable.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AtomicDecRef
+ * \sa SDL_AtomicIncRef
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_AtomicInt *a, int v);
+
+#ifndef SDL_AtomicIncRef
+
+/**
+ * Increment an atomic variable used as a reference count.
+ *
+ * ***Note: If you don't know what this macro is for, you shouldn't use it!***
+ *
+ * \param a a pointer to an SDL_AtomicInt to increment.
+ * \returns the previous value of the atomic variable.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_AtomicDecRef
+ */
+#define SDL_AtomicIncRef(a) SDL_AtomicAdd(a, 1)
+#endif
+
+#ifndef SDL_AtomicDecRef
+
+/**
+ * Decrement an atomic variable used as a reference count.
+ *
+ * ***Note: If you don't know what this macro is for, you shouldn't use it!***
+ *
+ * \param a a pointer to an SDL_AtomicInt to increment.
+ * \returns SDL_TRUE if the variable reached zero after decrementing,
+ * SDL_FALSE otherwise.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_AtomicIncRef
+ */
+#define SDL_AtomicDecRef(a) (SDL_AtomicAdd(a, -1) == 1)
+#endif
+
+/**
+ * Set a pointer to a new value if it is currently an old value.
+ *
+ * ***Note: If you don't know what this function is for, you shouldn't use
+ * it!***
+ *
+ * \param a a pointer to a pointer.
+ * \param oldval the old pointer value.
+ * \param newval the new pointer value.
+ * \returns SDL_TRUE if the pointer was set, SDL_FALSE otherwise.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AtomicCompareAndSwap
+ * \sa SDL_AtomicGetPtr
+ * \sa SDL_AtomicSetPtr
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AtomicCompareAndSwapPointer(void **a, void *oldval, void *newval);
+
+/**
+ * Set a pointer to a value atomically.
+ *
+ * ***Note: If you don't know what this function is for, you shouldn't use
+ * it!***
+ *
+ * \param a a pointer to a pointer.
+ * \param v the desired pointer value.
+ * \returns the previous value of the pointer.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AtomicCompareAndSwapPointer
+ * \sa SDL_AtomicGetPtr
+ */
+extern SDL_DECLSPEC void * SDLCALL SDL_AtomicSetPtr(void **a, void *v);
+
+/**
+ * Get the value of a pointer atomically.
+ *
+ * ***Note: If you don't know what this function is for, you shouldn't use
+ * it!***
+ *
+ * \param a a pointer to a pointer.
+ * \returns the current value of a pointer.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AtomicCompareAndSwapPointer
+ * \sa SDL_AtomicSetPtr
+ */
+extern SDL_DECLSPEC void * SDLCALL SDL_AtomicGetPtr(void **a);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#include
+
+#endif /* SDL_atomic_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_audio.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_audio.h
new file mode 100644
index 0000000..f25959c
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_audio.h
@@ -0,0 +1,2021 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryAudio
+ *
+ * Audio functionality for the SDL library.
+ *
+ * All audio in SDL3 revolves around SDL_AudioStream. Whether you want to play
+ * or record audio, convert it, stream it, buffer it, or mix it, you're going
+ * to be passing it through an audio stream.
+ *
+ * Audio streams are quite flexible; they can accept any amount of data at a
+ * time, in any supported format, and output it as needed in any other format,
+ * even if the data format changes on either side halfway through.
+ *
+ * An app opens an audio device and binds any number of audio streams to it,
+ * feeding more data to it as available. When the devices needs more data, it
+ * will pull it from all bound streams and mix them together for playback.
+ *
+ * Audio streams can also use an app-provided callback to supply data
+ * on-demand, which maps pretty closely to the SDL2 audio model.
+ *
+ * SDL also provides a simple .WAV loader in SDL_LoadWAV (and SDL_LoadWAV_IO
+ * if you aren't reading from a file) as a basic means to load sound data into
+ * your program.
+ *
+ * ## Channel layouts
+ *
+ * Audio data passing through SDL is uncompressed PCM data, interleaved. One
+ * can provide their own decompression through an MP3, etc, decoder, but SDL
+ * does not provide this directly. Each interleaved channel of data is meant
+ * to be in a specific order.
+ *
+ * Abbreviations:
+ *
+ * - FRONT = single mono speaker
+ * - FL = front left speaker
+ * - FR = front right speaker
+ * - FC = front center speaker
+ * - BL = back left speaker
+ * - BR = back right speaker
+ * - SR = surround right speaker
+ * - SL = surround left speaker
+ * - BC = back center speaker
+ * - LFE = low-frequency speaker
+ *
+ * These are listed in the order they are laid out in memory, so "FL, FR"
+ * means "the front left speaker is laid out in memory first, then the front
+ * right, then it repeats for the next audio frame".
+ *
+ * - 1 channel (mono) layout: FRONT
+ * - 2 channels (stereo) layout: FL, FR
+ * - 3 channels (2.1) layout: FL, FR, LFE
+ * - 4 channels (quad) layout: FL, FR, BL, BR
+ * - 5 channels (4.1) layout: FL, FR, LFE, BL, BR
+ * - 6 channels (5.1) layout: FL, FR, FC, LFE, BL, BR (last two can also be
+ * BL, BR)
+ * - 7 channels (6.1) layout: FL, FR, FC, LFE, BC, SL, SR
+ * - 8 channels (7.1) layout: FL, FR, FC, LFE, BL, BR, SL, SR
+ *
+ * This is the same order as DirectSound expects, but applied to all
+ * platforms; SDL will swizzle the channels as necessary if a platform expects
+ * something different.
+ *
+ * SDL_AudioStream can also be provided channel maps to change this ordering
+ * to whatever is necessary, in other audio processing scenarios.
+ */
+
+#ifndef SDL_audio_h_
+#define SDL_audio_h_
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* masks for different parts of SDL_AudioFormat. */
+#define SDL_AUDIO_MASK_BITSIZE (0xFFu)
+#define SDL_AUDIO_MASK_FLOAT (1u<<8)
+#define SDL_AUDIO_MASK_BIG_ENDIAN (1u<<12)
+#define SDL_AUDIO_MASK_SIGNED (1u<<15)
+
+#define SDL_DEFINE_AUDIO_FORMAT(signed, bigendian, float, size) \
+ (((Uint16)(signed) << 15) | ((Uint16)(bigendian) << 12) | ((Uint16)(float) << 8) | ((size) & SDL_AUDIO_MASK_BITSIZE))
+
+/**
+ * Audio format.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ *
+ * \sa SDL_AUDIO_BITSIZE
+ * \sa SDL_AUDIO_BYTESIZE
+ * \sa SDL_AUDIO_ISINT
+ * \sa SDL_AUDIO_ISFLOAT
+ * \sa SDL_AUDIO_ISBIGENDIAN
+ * \sa SDL_AUDIO_ISLITTLEENDIAN
+ * \sa SDL_AUDIO_ISSIGNED
+ * \sa SDL_AUDIO_ISUNSIGNED
+ */
+typedef enum SDL_AudioFormat
+{
+ SDL_AUDIO_U8 = 0x0008u, /**< Unsigned 8-bit samples */
+ /* SDL_DEFINE_AUDIO_FORMAT(0, 0, 0, 8), */
+ SDL_AUDIO_S8 = 0x8008u, /**< Signed 8-bit samples */
+ /* SDL_DEFINE_AUDIO_FORMAT(1, 0, 0, 8), */
+ SDL_AUDIO_S16LE = 0x8010u, /**< Signed 16-bit samples */
+ /* SDL_DEFINE_AUDIO_FORMAT(1, 0, 0, 16), */
+ SDL_AUDIO_S16BE = 0x9010u, /**< As above, but big-endian byte order */
+ /* SDL_DEFINE_AUDIO_FORMAT(1, 1, 0, 16), */
+ SDL_AUDIO_S32LE = 0x8020u, /**< 32-bit integer samples */
+ /* SDL_DEFINE_AUDIO_FORMAT(1, 0, 0, 32), */
+ SDL_AUDIO_S32BE = 0x9020u, /**< As above, but big-endian byte order */
+ /* SDL_DEFINE_AUDIO_FORMAT(1, 1, 0, 32), */
+ SDL_AUDIO_F32LE = 0x8120u, /**< 32-bit floating point samples */
+ /* SDL_DEFINE_AUDIO_FORMAT(1, 0, 1, 32), */
+ SDL_AUDIO_F32BE = 0x9120u, /**< As above, but big-endian byte order */
+ /* SDL_DEFINE_AUDIO_FORMAT(1, 1, 1, 32), */
+} SDL_AudioFormat;
+
+#if SDL_BYTEORDER == SDL_LIL_ENDIAN
+#define SDL_AUDIO_S16 SDL_AUDIO_S16LE
+#define SDL_AUDIO_S32 SDL_AUDIO_S32LE
+#define SDL_AUDIO_F32 SDL_AUDIO_F32LE
+#else
+#define SDL_AUDIO_S16 SDL_AUDIO_S16BE
+#define SDL_AUDIO_S32 SDL_AUDIO_S32BE
+#define SDL_AUDIO_F32 SDL_AUDIO_F32BE
+#endif
+
+
+/**
+ * Retrieve the size, in bits, from an SDL_AudioFormat.
+ *
+ * For example, `SDL_AUDIO_BITSIZE(SDL_AUDIO_S16)` returns 16.
+ *
+ * \param x an SDL_AudioFormat value.
+ * \returns data size in bits.
+ *
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_AUDIO_BITSIZE(x) ((x) & SDL_AUDIO_MASK_BITSIZE)
+
+/**
+ * Retrieve the size, in bytes, from an SDL_AudioFormat.
+ *
+ * For example, `SDL_AUDIO_BYTESIZE(SDL_AUDIO_S16)` returns 2.
+ *
+ * \param x an SDL_AudioFormat value.
+ * \returns data size in bytes.
+ *
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_AUDIO_BYTESIZE(x) (SDL_AUDIO_BITSIZE(x) / 8)
+
+/**
+ * Determine if an SDL_AudioFormat represents floating point data.
+ *
+ * For example, `SDL_AUDIO_ISFLOAT(SDL_AUDIO_S16)` returns 0.
+ *
+ * \param x an SDL_AudioFormat value.
+ * \returns non-zero if format is floating point, zero otherwise.
+ *
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_AUDIO_ISFLOAT(x) ((x) & SDL_AUDIO_MASK_FLOAT)
+
+/**
+ * Determine if an SDL_AudioFormat represents bigendian data.
+ *
+ * For example, `SDL_AUDIO_ISBIGENDIAN(SDL_AUDIO_S16LE)` returns 0.
+ *
+ * \param x an SDL_AudioFormat value.
+ * \returns non-zero if format is bigendian, zero otherwise.
+ *
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_AUDIO_ISBIGENDIAN(x) ((x) & SDL_AUDIO_MASK_BIG_ENDIAN)
+
+/**
+ * Determine if an SDL_AudioFormat represents littleendian data.
+ *
+ * For example, `SDL_AUDIO_ISLITTLEENDIAN(SDL_AUDIO_S16BE)` returns 0.
+ *
+ * \param x an SDL_AudioFormat value.
+ * \returns non-zero if format is littleendian, zero otherwise.
+ *
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_AUDIO_ISLITTLEENDIAN(x) (!SDL_AUDIO_ISBIGENDIAN(x))
+
+/**
+ * Determine if an SDL_AudioFormat represents signed data.
+ *
+ * For example, `SDL_AUDIO_ISSIGNED(SDL_AUDIO_U8)` returns 0.
+ *
+ * \param x an SDL_AudioFormat value.
+ * \returns non-zero if format is signed, zero otherwise.
+ *
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_AUDIO_ISSIGNED(x) ((x) & SDL_AUDIO_MASK_SIGNED)
+
+/**
+ * Determine if an SDL_AudioFormat represents integer data.
+ *
+ * For example, `SDL_AUDIO_ISINT(SDL_AUDIO_F32)` returns 0.
+ *
+ * \param x an SDL_AudioFormat value.
+ * \returns non-zero if format is integer, zero otherwise.
+ *
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_AUDIO_ISINT(x) (!SDL_AUDIO_ISFLOAT(x))
+
+/**
+ * Determine if an SDL_AudioFormat represents unsigned data.
+ *
+ * For example, `SDL_AUDIO_ISUNSIGNED(SDL_AUDIO_S16)` returns 0.
+ *
+ * \param x an SDL_AudioFormat value.
+ * \returns non-zero if format is unsigned, zero otherwise.
+ *
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_AUDIO_ISUNSIGNED(x) (!SDL_AUDIO_ISSIGNED(x))
+
+
+/**
+ * SDL Audio Device instance IDs.
+ *
+ * Zero is used to signify an invalid/null device.
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ */
+typedef Uint32 SDL_AudioDeviceID;
+
+/**
+ * A value used to request a default playback audio device.
+ *
+ * Several functions that require an SDL_AudioDeviceID will accept this value
+ * to signify the app just wants the system to choose a default device instead
+ * of the app providing a specific one.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK ((SDL_AudioDeviceID) 0xFFFFFFFFu)
+
+/**
+ * A value used to request a default recording audio device.
+ *
+ * Several functions that require an SDL_AudioDeviceID will accept this value
+ * to signify the app just wants the system to choose a default device instead
+ * of the app providing a specific one.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_AUDIO_DEVICE_DEFAULT_RECORDING ((SDL_AudioDeviceID) 0xFFFFFFFEu)
+
+/**
+ * Format specifier for audio data.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_AudioFormat
+ */
+typedef struct SDL_AudioSpec
+{
+ SDL_AudioFormat format; /**< Audio data format */
+ int channels; /**< Number of channels: 1 mono, 2 stereo, etc */
+ int freq; /**< sample rate: sample frames per second */
+} SDL_AudioSpec;
+
+/**
+ * Calculate the size of each audio frame (in bytes) from an SDL_AudioSpec.
+ *
+ * This reports on the size of an audio sample frame: stereo Sint16 data (2
+ * channels of 2 bytes each) would be 4 bytes per frame, for example.
+ *
+ * \param x an SDL_AudioSpec to query.
+ * \returns the number of bytes used per sample frame.
+ *
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_AUDIO_FRAMESIZE(x) (SDL_AUDIO_BYTESIZE((x).format) * (x).channels)
+
+/**
+ * The opaque handle that represents an audio stream.
+ *
+ * SDL_AudioStream is an audio conversion interface.
+ *
+ * - It can handle resampling data in chunks without generating artifacts,
+ * when it doesn't have the complete buffer available.
+ * - It can handle incoming data in any variable size.
+ * - It can handle input/output format changes on the fly.
+ * - It can remap audio channels between inputs and outputs.
+ * - You push data as you have it, and pull it when you need it
+ * - It can also function as a basic audio data queue even if you just have
+ * sound that needs to pass from one place to another.
+ * - You can hook callbacks up to them when more data is added or requested,
+ * to manage data on-the-fly.
+ *
+ * Audio streams are the core of the SDL3 audio interface. You create one or
+ * more of them, bind them to an opened audio device, and feed data to them
+ * (or for recording, consume data from them).
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_CreateAudioStream
+ */
+typedef struct SDL_AudioStream SDL_AudioStream;
+
+
+/* Function prototypes */
+
+/**
+ * \name Driver discovery functions
+ *
+ * These functions return the list of built in audio drivers, in the
+ * order that they are normally initialized by default.
+ */
+/* @{ */
+
+/**
+ * Use this function to get the number of built-in audio drivers.
+ *
+ * This function returns a hardcoded number. This never returns a negative
+ * value; if there are no drivers compiled into this build of SDL, this
+ * function returns zero. The presence of a driver in this list does not mean
+ * it will function, it just means SDL is capable of interacting with that
+ * interface. For example, a build of SDL might have esound support, but if
+ * there's no esound server available, SDL's esound driver would fail if used.
+ *
+ * By default, SDL tries all drivers, in its preferred order, until one is
+ * found to be usable.
+ *
+ * \returns the number of built-in audio drivers.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetAudioDriver
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetNumAudioDrivers(void);
+
+/**
+ * Use this function to get the name of a built in audio driver.
+ *
+ * The list of audio drivers is given in the order that they are normally
+ * initialized by default; the drivers that seem more reasonable to choose
+ * first (as far as the SDL developers believe) are earlier in the list.
+ *
+ * The names of drivers are all simple, low-ASCII identifiers, like "alsa",
+ * "coreaudio" or "wasapi". These never have Unicode characters, and are not
+ * meant to be proper names.
+ *
+ * \param index the index of the audio driver; the value ranges from 0 to
+ * SDL_GetNumAudioDrivers() - 1.
+ * \returns the name of the audio driver at the requested index, or NULL if an
+ * invalid index was specified.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetNumAudioDrivers
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDriver(int index);
+/* @} */
+
+/**
+ * Get the name of the current audio driver.
+ *
+ * The names of drivers are all simple, low-ASCII identifiers, like "alsa",
+ * "coreaudio" or "wasapi". These never have Unicode characters, and are not
+ * meant to be proper names.
+ *
+ * \returns the name of the current audio driver or NULL if no driver has been
+ * initialized.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentAudioDriver(void);
+
+/**
+ * Get a list of currently-connected audio playback devices.
+ *
+ * This returns of list of available devices that play sound, perhaps to
+ * speakers or headphones ("playback" devices). If you want devices that
+ * record audio, like a microphone ("recording" devices), use
+ * SDL_GetAudioRecordingDevices() instead.
+ *
+ * This only returns a list of physical devices; it will not have any device
+ * IDs returned by SDL_OpenAudioDevice().
+ *
+ * If this function returns NULL, to signify an error, `*count` will be set to
+ * zero.
+ *
+ * \param count a pointer filled in with the number of devices returned, may
+ * be NULL.
+ * \returns a 0 terminated array of device instance IDs or NULL on error; call
+ * SDL_GetError() for more information. This should be freed with
+ * SDL_free() when it is no longer needed.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenAudioDevice
+ * \sa SDL_GetAudioRecordingDevices
+ */
+extern SDL_DECLSPEC SDL_AudioDeviceID * SDLCALL SDL_GetAudioPlaybackDevices(int *count);
+
+/**
+ * Get a list of currently-connected audio recording devices.
+ *
+ * This returns of list of available devices that record audio, like a
+ * microphone ("recording" devices). If you want devices that play sound,
+ * perhaps to speakers or headphones ("playback" devices), use
+ * SDL_GetAudioPlaybackDevices() instead.
+ *
+ * This only returns a list of physical devices; it will not have any device
+ * IDs returned by SDL_OpenAudioDevice().
+ *
+ * If this function returns NULL, to signify an error, `*count` will be set to
+ * zero.
+ *
+ * \param count a pointer filled in with the number of devices returned, may
+ * be NULL.
+ * \returns a 0 terminated array of device instance IDs, or NULL on failure;
+ * call SDL_GetError() for more information. This should be freed
+ * with SDL_free() when it is no longer needed.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenAudioDevice
+ * \sa SDL_GetAudioPlaybackDevices
+ */
+extern SDL_DECLSPEC SDL_AudioDeviceID * SDLCALL SDL_GetAudioRecordingDevices(int *count);
+
+/**
+ * Get the human-readable name of a specific audio device.
+ *
+ * \param devid the instance ID of the device to query.
+ * \returns the name of the audio device, or NULL on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetAudioPlaybackDevices
+ * \sa SDL_GetAudioRecordingDevices
+ * \sa SDL_GetDefaultAudioInfo
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDeviceName(SDL_AudioDeviceID devid);
+
+/**
+ * Get the current audio format of a specific audio device.
+ *
+ * For an opened device, this will report the format the device is currently
+ * using. If the device isn't yet opened, this will report the device's
+ * preferred format (or a reasonable default if this can't be determined).
+ *
+ * You may also specify SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or
+ * SDL_AUDIO_DEVICE_DEFAULT_RECORDING here, which is useful for getting a
+ * reasonable recommendation before opening the system-recommended default
+ * device.
+ *
+ * You can also use this to request the current device buffer size. This is
+ * specified in sample frames and represents the amount of data SDL will feed
+ * to the physical hardware in each chunk. This can be converted to
+ * milliseconds of audio with the following equation:
+ *
+ * `ms = (int) ((((Sint64) frames) * 1000) / spec.freq);`
+ *
+ * Buffer size is only important if you need low-level control over the audio
+ * playback timing. Most apps do not need this.
+ *
+ * \param devid the instance ID of the device to query.
+ * \param spec on return, will be filled with device details.
+ * \param sample_frames pointer to store device buffer size, in sample frames.
+ * Can be NULL.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetAudioDeviceFormat(SDL_AudioDeviceID devid, SDL_AudioSpec *spec, int *sample_frames);
+
+/**
+ * Get the current channel map of an audio device.
+ *
+ * Channel maps are optional; most things do not need them, instead passing
+ * data in the [order that SDL expects](CategoryAudio#channel-layouts).
+ *
+ * Audio devices usually have no remapping applied. This is represented by
+ * returning NULL, and does not signify an error.
+ *
+ * \param devid the instance ID of the device to query.
+ * \param count On output, set to number of channels in the map. Can be NULL.
+ * \returns an array of the current channel mapping, with as many elements as
+ * the current output spec's channels, or NULL if default. This
+ * should be freed with SDL_free() when it is no longer needed.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAudioStreamInputChannelMap
+ */
+extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioDeviceChannelMap(SDL_AudioDeviceID devid, int *count);
+
+/**
+ * Open a specific audio device.
+ *
+ * You can open both playback and recording devices through this function.
+ * Playback devices will take data from bound audio streams, mix it, and send
+ * it to the hardware. Recording devices will feed any bound audio streams
+ * with a copy of any incoming data.
+ *
+ * An opened audio device starts out with no audio streams bound. To start
+ * audio playing, bind a stream and supply audio data to it. Unlike SDL2,
+ * there is no audio callback; you only bind audio streams and make sure they
+ * have data flowing into them (however, you can simulate SDL2's semantics
+ * fairly closely by using SDL_OpenAudioDeviceStream instead of this
+ * function).
+ *
+ * If you don't care about opening a specific device, pass a `devid` of either
+ * `SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK` or
+ * `SDL_AUDIO_DEVICE_DEFAULT_RECORDING`. In this case, SDL will try to pick
+ * the most reasonable default, and may also switch between physical devices
+ * seamlessly later, if the most reasonable default changes during the
+ * lifetime of this opened device (user changed the default in the OS's system
+ * preferences, the default got unplugged so the system jumped to a new
+ * default, the user plugged in headphones on a mobile device, etc). Unless
+ * you have a good reason to choose a specific device, this is probably what
+ * you want.
+ *
+ * You may request a specific format for the audio device, but there is no
+ * promise the device will honor that request for several reasons. As such,
+ * it's only meant to be a hint as to what data your app will provide. Audio
+ * streams will accept data in whatever format you specify and manage
+ * conversion for you as appropriate. SDL_GetAudioDeviceFormat can tell you
+ * the preferred format for the device before opening and the actual format
+ * the device is using after opening.
+ *
+ * It's legal to open the same device ID more than once; each successful open
+ * will generate a new logical SDL_AudioDeviceID that is managed separately
+ * from others on the same physical device. This allows libraries to open a
+ * device separately from the main app and bind its own streams without
+ * conflicting.
+ *
+ * It is also legal to open a device ID returned by a previous call to this
+ * function; doing so just creates another logical device on the same physical
+ * device. This may be useful for making logical groupings of audio streams.
+ *
+ * This function returns the opened device ID on success. This is a new,
+ * unique SDL_AudioDeviceID that represents a logical device.
+ *
+ * Some backends might offer arbitrary devices (for example, a networked audio
+ * protocol that can connect to an arbitrary server). For these, as a change
+ * from SDL2, you should open a default device ID and use an SDL hint to
+ * specify the target if you care, or otherwise let the backend figure out a
+ * reasonable default. Most backends don't offer anything like this, and often
+ * this would be an end user setting an environment variable for their custom
+ * need, and not something an application should specifically manage.
+ *
+ * When done with an audio device, possibly at the end of the app's life, one
+ * should call SDL_CloseAudioDevice() on the returned device id.
+ *
+ * \param devid the device instance id to open, or
+ * SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or
+ * SDL_AUDIO_DEVICE_DEFAULT_RECORDING for the most reasonable
+ * default device.
+ * \param spec the requested device configuration. Can be NULL to use
+ * reasonable defaults.
+ * \returns the device ID on success or 0 on failure; call SDL_GetError() for
+ * more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_CloseAudioDevice
+ * \sa SDL_GetAudioDeviceFormat
+ */
+extern SDL_DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(SDL_AudioDeviceID devid, const SDL_AudioSpec *spec);
+
+/**
+ * Use this function to pause audio playback on a specified device.
+ *
+ * This function pauses audio processing for a given device. Any bound audio
+ * streams will not progress, and no audio will be generated. Pausing one
+ * device does not prevent other unpaused devices from running.
+ *
+ * Unlike in SDL2, audio devices start in an _unpaused_ state, since an app
+ * has to bind a stream before any audio will flow. Pausing a paused device is
+ * a legal no-op.
+ *
+ * Pausing a device can be useful to halt all audio without unbinding all the
+ * audio streams. This might be useful while a game is paused, or a level is
+ * loading, etc.
+ *
+ * Physical devices can not be paused or unpaused, only logical devices
+ * created through SDL_OpenAudioDevice() can be.
+ *
+ * \param dev a device opened by SDL_OpenAudioDevice().
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_ResumeAudioDevice
+ * \sa SDL_AudioDevicePaused
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev);
+
+/**
+ * Use this function to unpause audio playback on a specified device.
+ *
+ * This function unpauses audio processing for a given device that has
+ * previously been paused with SDL_PauseAudioDevice(). Once unpaused, any
+ * bound audio streams will begin to progress again, and audio can be
+ * generated.
+ *
+ * Unlike in SDL2, audio devices start in an _unpaused_ state, since an app
+ * has to bind a stream before any audio will flow. Unpausing an unpaused
+ * device is a legal no-op.
+ *
+ * Physical devices can not be paused or unpaused, only logical devices
+ * created through SDL_OpenAudioDevice() can be.
+ *
+ * \param dev a device opened by SDL_OpenAudioDevice().
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AudioDevicePaused
+ * \sa SDL_PauseAudioDevice
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_ResumeAudioDevice(SDL_AudioDeviceID dev);
+
+/**
+ * Use this function to query if an audio device is paused.
+ *
+ * Unlike in SDL2, audio devices start in an _unpaused_ state, since an app
+ * has to bind a stream before any audio will flow.
+ *
+ * Physical devices can not be paused or unpaused, only logical devices
+ * created through SDL_OpenAudioDevice() can be. Physical and invalid device
+ * IDs will report themselves as unpaused here.
+ *
+ * \param dev a device opened by SDL_OpenAudioDevice().
+ * \returns SDL_TRUE if device is valid and paused, SDL_FALSE otherwise.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PauseAudioDevice
+ * \sa SDL_ResumeAudioDevice
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_AudioDevicePaused(SDL_AudioDeviceID dev);
+
+/**
+ * Get the gain of an audio device.
+ *
+ * The gain of a device is its volume; a larger gain means a louder output,
+ * with a gain of zero being silence.
+ *
+ * Audio devices default to a gain of 1.0f (no change in output).
+ *
+ * Physical devices may not have their gain changed, only logical devices, and
+ * this function will always return -1.0f when used on physical devices.
+ *
+ * \param devid the audio device to query.
+ * \returns the gain of the device or -1.0f on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAudioDeviceGain
+ */
+extern SDL_DECLSPEC float SDLCALL SDL_GetAudioDeviceGain(SDL_AudioDeviceID devid);
+
+/**
+ * Change the gain of an audio device.
+ *
+ * The gain of a device is its volume; a larger gain means a louder output,
+ * with a gain of zero being silence.
+ *
+ * Audio devices default to a gain of 1.0f (no change in output).
+ *
+ * Physical devices may not have their gain changed, only logical devices, and
+ * this function will always return -1 when used on physical devices. While it
+ * might seem attractive to adjust several logical devices at once in this
+ * way, it would allow an app or library to interfere with another portion of
+ * the program's otherwise-isolated devices.
+ *
+ * This is applied, along with any per-audiostream gain, during playback to
+ * the hardware, and can be continuously changed to create various effects. On
+ * recording devices, this will adjust the gain before passing the data into
+ * an audiostream; that recording audiostream can then adjust its gain further
+ * when outputting the data elsewhere, if it likes, but that second gain is
+ * not applied until the data leaves the audiostream again.
+ *
+ * \param devid the audio device on which to change gain.
+ * \param gain the gain. 1.0f is no change, 0.0f is silence.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread, as it holds
+ * a stream-specific mutex while running.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetAudioDeviceGain
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetAudioDeviceGain(SDL_AudioDeviceID devid, float gain);
+
+/**
+ * Close a previously-opened audio device.
+ *
+ * The application should close open audio devices once they are no longer
+ * needed.
+ *
+ * This function may block briefly while pending audio data is played by the
+ * hardware, so that applications don't drop the last buffer of data they
+ * supplied if terminating immediately afterwards.
+ *
+ * \param devid an audio device id previously returned by
+ * SDL_OpenAudioDevice().
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenAudioDevice
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID devid);
+
+/**
+ * Bind a list of audio streams to an audio device.
+ *
+ * Audio data will flow through any bound streams. For a playback device, data
+ * for all bound streams will be mixed together and fed to the device. For a
+ * recording device, a copy of recorded data will be provided to each bound
+ * stream.
+ *
+ * Audio streams can only be bound to an open device. This operation is
+ * atomic--all streams bound in the same call will start processing at the
+ * same time, so they can stay in sync. Also: either all streams will be bound
+ * or none of them will be.
+ *
+ * It is an error to bind an already-bound stream; it must be explicitly
+ * unbound first.
+ *
+ * Binding a stream to a device will set its output format for playback
+ * devices, and its input format for recording devices, so they match the
+ * device's settings. The caller is welcome to change the other end of the
+ * stream's format at any time.
+ *
+ * \param devid an audio device to bind a stream to.
+ * \param streams an array of audio streams to bind.
+ * \param num_streams number streams listed in the `streams` array.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_BindAudioStreams
+ * \sa SDL_UnbindAudioStream
+ * \sa SDL_GetAudioStreamDevice
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_BindAudioStreams(SDL_AudioDeviceID devid, SDL_AudioStream **streams, int num_streams);
+
+/**
+ * Bind a single audio stream to an audio device.
+ *
+ * This is a convenience function, equivalent to calling
+ * `SDL_BindAudioStreams(devid, &stream, 1)`.
+ *
+ * \param devid an audio device to bind a stream to.
+ * \param stream an audio stream to bind to a device.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_BindAudioStreams
+ * \sa SDL_UnbindAudioStream
+ * \sa SDL_GetAudioStreamDevice
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_BindAudioStream(SDL_AudioDeviceID devid, SDL_AudioStream *stream);
+
+/**
+ * Unbind a list of audio streams from their audio devices.
+ *
+ * The streams being unbound do not all have to be on the same device. All
+ * streams on the same device will be unbound atomically (data will stop
+ * flowing through all unbound streams on the same device at the same time).
+ *
+ * Unbinding a stream that isn't bound to a device is a legal no-op.
+ *
+ * \param streams an array of audio streams to unbind.
+ * \param num_streams number streams listed in the `streams` array.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_BindAudioStreams
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStreams(SDL_AudioStream **streams, int num_streams);
+
+/**
+ * Unbind a single audio stream from its audio device.
+ *
+ * This is a convenience function, equivalent to calling
+ * `SDL_UnbindAudioStreams(&stream, 1)`.
+ *
+ * \param stream an audio stream to unbind from a device.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_BindAudioStream
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStream(SDL_AudioStream *stream);
+
+/**
+ * Query an audio stream for its currently-bound device.
+ *
+ * This reports the audio device that an audio stream is currently bound to.
+ *
+ * If not bound, or invalid, this returns zero, which is not a valid device
+ * ID.
+ *
+ * \param stream the audio stream to query.
+ * \returns the bound audio device, or 0 if not bound or invalid.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_BindAudioStream
+ * \sa SDL_BindAudioStreams
+ */
+extern SDL_DECLSPEC SDL_AudioDeviceID SDLCALL SDL_GetAudioStreamDevice(SDL_AudioStream *stream);
+
+/**
+ * Create a new audio stream.
+ *
+ * \param src_spec the format details of the input audio.
+ * \param dst_spec the format details of the output audio.
+ * \returns a new audio stream on success or NULL on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PutAudioStreamData
+ * \sa SDL_GetAudioStreamData
+ * \sa SDL_GetAudioStreamAvailable
+ * \sa SDL_FlushAudioStream
+ * \sa SDL_ClearAudioStream
+ * \sa SDL_SetAudioStreamFormat
+ * \sa SDL_DestroyAudioStream
+ */
+extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_CreateAudioStream(const SDL_AudioSpec *src_spec, const SDL_AudioSpec *dst_spec);
+
+/**
+ * Get the properties associated with an audio stream.
+ *
+ * \param stream the SDL_AudioStream to query.
+ * \returns a valid property ID on success or 0 on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetAudioStreamProperties(SDL_AudioStream *stream);
+
+/**
+ * Query the current format of an audio stream.
+ *
+ * \param stream the SDL_AudioStream to query.
+ * \param src_spec where to store the input audio format; ignored if NULL.
+ * \param dst_spec where to store the output audio format; ignored if NULL.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread, as it holds
+ * a stream-specific mutex while running.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAudioStreamFormat
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamFormat(SDL_AudioStream *stream,
+ SDL_AudioSpec *src_spec,
+ SDL_AudioSpec *dst_spec);
+
+/**
+ * Change the input and output formats of an audio stream.
+ *
+ * Future calls to and SDL_GetAudioStreamAvailable and SDL_GetAudioStreamData
+ * will reflect the new format, and future calls to SDL_PutAudioStreamData
+ * must provide data in the new input formats.
+ *
+ * Data that was previously queued in the stream will still be operated on in
+ * the format that was current when it was added, which is to say you can put
+ * the end of a sound file in one format to a stream, change formats for the
+ * next sound file, and start putting that new data while the previous sound
+ * file is still queued, and everything will still play back correctly.
+ *
+ * \param stream the stream the format is being changed.
+ * \param src_spec the new format of the audio input; if NULL, it is not
+ * changed.
+ * \param dst_spec the new format of the audio output; if NULL, it is not
+ * changed.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread, as it holds
+ * a stream-specific mutex while running.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetAudioStreamFormat
+ * \sa SDL_SetAudioStreamFrequencyRatio
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetAudioStreamFormat(SDL_AudioStream *stream,
+ const SDL_AudioSpec *src_spec,
+ const SDL_AudioSpec *dst_spec);
+
+/**
+ * Get the frequency ratio of an audio stream.
+ *
+ * \param stream the SDL_AudioStream to query.
+ * \returns the frequency ratio of the stream or 0.0 on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread, as it holds
+ * a stream-specific mutex while running.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAudioStreamFrequencyRatio
+ */
+extern SDL_DECLSPEC float SDLCALL SDL_GetAudioStreamFrequencyRatio(SDL_AudioStream *stream);
+
+/**
+ * Change the frequency ratio of an audio stream.
+ *
+ * The frequency ratio is used to adjust the rate at which input data is
+ * consumed. Changing this effectively modifies the speed and pitch of the
+ * audio. A value greater than 1.0 will play the audio faster, and at a higher
+ * pitch. A value less than 1.0 will play the audio slower, and at a lower
+ * pitch.
+ *
+ * This is applied during SDL_GetAudioStreamData, and can be continuously
+ * changed to create various effects.
+ *
+ * \param stream the stream the frequency ratio is being changed.
+ * \param ratio the frequency ratio. 1.0 is normal speed. Must be between 0.01
+ * and 100.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread, as it holds
+ * a stream-specific mutex while running.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetAudioStreamFrequencyRatio
+ * \sa SDL_SetAudioStreamFormat
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetAudioStreamFrequencyRatio(SDL_AudioStream *stream, float ratio);
+
+/**
+ * Get the gain of an audio stream.
+ *
+ * The gain of a stream is its volume; a larger gain means a louder output,
+ * with a gain of zero being silence.
+ *
+ * Audio streams default to a gain of 1.0f (no change in output).
+ *
+ * \param stream the SDL_AudioStream to query.
+ * \returns the gain of the stream or -1.0f on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread, as it holds
+ * a stream-specific mutex while running.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAudioStreamGain
+ */
+extern SDL_DECLSPEC float SDLCALL SDL_GetAudioStreamGain(SDL_AudioStream *stream);
+
+/**
+ * Change the gain of an audio stream.
+ *
+ * The gain of a stream is its volume; a larger gain means a louder output,
+ * with a gain of zero being silence.
+ *
+ * Audio streams default to a gain of 1.0f (no change in output).
+ *
+ * This is applied during SDL_GetAudioStreamData, and can be continuously
+ * changed to create various effects.
+ *
+ * \param stream the stream on which the gain is being changed.
+ * \param gain the gain. 1.0f is no change, 0.0f is silence.
+ * \returns 0 on successor a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread, as it holds
+ * a stream-specific mutex while running.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetAudioStreamGain
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetAudioStreamGain(SDL_AudioStream *stream, float gain);
+
+/**
+ * Get the current input channel map of an audio stream.
+ *
+ * Channel maps are optional; most things do not need them, instead passing
+ * data in the [order that SDL expects](CategoryAudio#channel-layouts).
+ *
+ * Audio streams default to no remapping applied. This is represented by
+ * returning NULL, and does not signify an error.
+ *
+ * \param stream the SDL_AudioStream to query.
+ * \param count On output, set to number of channels in the map. Can be NULL.
+ * \returns an array of the current channel mapping, with as many elements as
+ * the current output spec's channels, or NULL if default. This
+ * should be freed with SDL_free() when it is no longer needed.
+ *
+ * \threadsafety It is safe to call this function from any thread, as it holds
+ * a stream-specific mutex while running.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAudioStreamInputChannelMap
+ */
+extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioStreamInputChannelMap(SDL_AudioStream *stream, int *count);
+
+/**
+ * Get the current output channel map of an audio stream.
+ *
+ * Channel maps are optional; most things do not need them, instead passing
+ * data in the [order that SDL expects](CategoryAudio#channel-layouts).
+ *
+ * Audio streams default to no remapping applied. This is represented by
+ * returning NULL, and does not signify an error.
+ *
+ * \param stream the SDL_AudioStream to query.
+ * \param count On output, set to number of channels in the map. Can be NULL.
+ * \returns an array of the current channel mapping, with as many elements as
+ * the current output spec's channels, or NULL if default. This
+ * should be freed with SDL_free() when it is no longer needed.
+ *
+ * \threadsafety It is safe to call this function from any thread, as it holds
+ * a stream-specific mutex while running.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAudioStreamInputChannelMap
+ */
+extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioStreamOutputChannelMap(SDL_AudioStream *stream, int *count);
+
+/**
+ * Set the current input channel map of an audio stream.
+ *
+ * Channel maps are optional; most things do not need them, instead passing
+ * data in the [order that SDL expects](CategoryAudio#channel-layouts).
+ *
+ * The input channel map reorders data that is added to a stream via
+ * SDL_PutAudioStreamData. Future calls to SDL_PutAudioStreamData must provide
+ * data in the new channel order.
+ *
+ * Each item in the array represents an input channel, and its value is the
+ * channel that it should be remapped to. To reverse a stereo signal's left
+ * and right values, you'd have an array of `{ 1, 0 }`. It is legal to remap
+ * multiple channels to the same thing, so `{ 1, 1 }` would duplicate the
+ * right channel to both channels of a stereo signal. You cannot change the
+ * number of channels through a channel map, just reorder them.
+ *
+ * Data that was previously queued in the stream will still be operated on in
+ * the order that was current when it was added, which is to say you can put
+ * the end of a sound file in one order to a stream, change orders for the
+ * next sound file, and start putting that new data while the previous sound
+ * file is still queued, and everything will still play back correctly.
+ *
+ * Audio streams default to no remapping applied. Passing a NULL channel map
+ * is legal, and turns off remapping.
+ *
+ * SDL will copy the channel map; the caller does not have to save this array
+ * after this call.
+ *
+ * If `count` is not equal to the current number of channels in the audio
+ * stream's format, this will fail. This is a safety measure to make sure a a
+ * race condition hasn't changed the format while you this call is setting the
+ * channel map.
+ *
+ * \param stream the SDL_AudioStream to change.
+ * \param chmap the new channel map, NULL to reset to default.
+ * \param count The number of channels in the map.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread, as it holds
+ * a stream-specific mutex while running. Don't change the
+ * stream's format to have a different number of channels from a
+ * a different thread at the same time, though!
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAudioStreamInputChannelMap
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_AudioStream *stream, const int *chmap, int count);
+
+/**
+ * Set the current output channel map of an audio stream.
+ *
+ * Channel maps are optional; most things do not need them, instead passing
+ * data in the [order that SDL expects](CategoryAudio#channel-layouts).
+ *
+ * The output channel map reorders data that leaving a stream via
+ * SDL_GetAudioStreamData.
+ *
+ * Each item in the array represents an output channel, and its value is the
+ * channel that it should be remapped to. To reverse a stereo signal's left
+ * and right values, you'd have an array of `{ 1, 0 }`. It is legal to remap
+ * multiple channels to the same thing, so `{ 1, 1 }` would duplicate the
+ * right channel to both channels of a stereo signal. You cannot change the
+ * number of channels through a channel map, just reorder them.
+ *
+ * The output channel map can be changed at any time, as output remapping is
+ * applied during SDL_GetAudioStreamData.
+ *
+ * Audio streams default to no remapping applied. Passing a NULL channel map
+ * is legal, and turns off remapping.
+ *
+ * SDL will copy the channel map; the caller does not have to save this array
+ * after this call.
+ *
+ * If `count` is not equal to the current number of channels in the audio
+ * stream's format, this will fail. This is a safety measure to make sure a a
+ * race condition hasn't changed the format while you this call is setting the
+ * channel map.
+ *
+ * \param stream the SDL_AudioStream to change.
+ * \param chmap the new channel map, NULL to reset to default.
+ * \param count The number of channels in the map.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread, as it holds
+ * a stream-specific mutex while running. Don't change the
+ * stream's format to have a different number of channels from a
+ * a different thread at the same time, though!
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAudioStreamInputChannelMap
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetAudioStreamOutputChannelMap(SDL_AudioStream *stream, const int *chmap, int count);
+
+/**
+ * Add data to the stream.
+ *
+ * This data must match the format/channels/samplerate specified in the latest
+ * call to SDL_SetAudioStreamFormat, or the format specified when creating the
+ * stream if it hasn't been changed.
+ *
+ * Note that this call simply copies the unconverted data for later. This is
+ * different than SDL2, where data was converted during the Put call and the
+ * Get call would just dequeue the previously-converted data.
+ *
+ * \param stream the stream the audio data is being added to.
+ * \param buf a pointer to the audio data to add.
+ * \param len the number of bytes to write to the stream.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread, but if the
+ * stream has a callback set, the caller might need to manage
+ * extra locking.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_ClearAudioStream
+ * \sa SDL_FlushAudioStream
+ * \sa SDL_GetAudioStreamData
+ * \sa SDL_GetAudioStreamQueued
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_PutAudioStreamData(SDL_AudioStream *stream, const void *buf, int len);
+
+/**
+ * Get converted/resampled data from the stream.
+ *
+ * The input/output data format/channels/samplerate is specified when creating
+ * the stream, and can be changed after creation by calling
+ * SDL_SetAudioStreamFormat.
+ *
+ * Note that any conversion and resampling necessary is done during this call,
+ * and SDL_PutAudioStreamData simply queues unconverted data for later. This
+ * is different than SDL2, where that work was done while inputting new data
+ * to the stream and requesting the output just copied the converted data.
+ *
+ * \param stream the stream the audio is being requested from.
+ * \param buf a buffer to fill with audio data.
+ * \param len the maximum number of bytes to fill.
+ * \returns the number of bytes read from the stream or a negative error code
+ * on failure; call SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread, but if the
+ * stream has a callback set, the caller might need to manage
+ * extra locking.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_ClearAudioStream
+ * \sa SDL_GetAudioStreamAvailable
+ * \sa SDL_PutAudioStreamData
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamData(SDL_AudioStream *stream, void *buf, int len);
+
+/**
+ * Get the number of converted/resampled bytes available.
+ *
+ * The stream may be buffering data behind the scenes until it has enough to
+ * resample correctly, so this number might be lower than what you expect, or
+ * even be zero. Add more data or flush the stream if you need the data now.
+ *
+ * If the stream has so much data that it would overflow an int, the return
+ * value is clamped to a maximum value, but no queued data is lost; if there
+ * are gigabytes of data queued, the app might need to read some of it with
+ * SDL_GetAudioStreamData before this function's return value is no longer
+ * clamped.
+ *
+ * \param stream the audio stream to query.
+ * \returns the number of converted/resampled bytes available.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetAudioStreamData
+ * \sa SDL_PutAudioStreamData
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamAvailable(SDL_AudioStream *stream);
+
+
+/**
+ * Get the number of bytes currently queued.
+ *
+ * Note that audio streams can change their input format at any time, even if
+ * there is still data queued in a different format, so the returned byte
+ * count will not necessarily match the number of _sample frames_ available.
+ * Users of this API should be aware of format changes they make when feeding
+ * a stream and plan accordingly.
+ *
+ * Queued data is not converted until it is consumed by
+ * SDL_GetAudioStreamData, so this value should be representative of the exact
+ * data that was put into the stream.
+ *
+ * If the stream has so much data that it would overflow an int, the return
+ * value is clamped to a maximum value, but no queued data is lost; if there
+ * are gigabytes of data queued, the app might need to read some of it with
+ * SDL_GetAudioStreamData before this function's return value is no longer
+ * clamped.
+ *
+ * \param stream the audio stream to query.
+ * \returns the number of bytes queued.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PutAudioStreamData
+ * \sa SDL_ClearAudioStream
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamQueued(SDL_AudioStream *stream);
+
+
+/**
+ * Tell the stream that you're done sending data, and anything being buffered
+ * should be converted/resampled and made available immediately.
+ *
+ * It is legal to add more data to a stream after flushing, but there may be
+ * audio gaps in the output. Generally this is intended to signal the end of
+ * input, so the complete output becomes available.
+ *
+ * \param stream the audio stream to flush.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PutAudioStreamData
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_FlushAudioStream(SDL_AudioStream *stream);
+
+/**
+ * Clear any pending data in the stream.
+ *
+ * This drops any queued data, so there will be nothing to read from the
+ * stream until more is added.
+ *
+ * \param stream the audio stream to clear.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetAudioStreamAvailable
+ * \sa SDL_GetAudioStreamData
+ * \sa SDL_GetAudioStreamQueued
+ * \sa SDL_PutAudioStreamData
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_ClearAudioStream(SDL_AudioStream *stream);
+
+/**
+ * Use this function to pause audio playback on the audio device associated
+ * with an audio stream.
+ *
+ * This function pauses audio processing for a given device. Any bound audio
+ * streams will not progress, and no audio will be generated. Pausing one
+ * device does not prevent other unpaused devices from running.
+ *
+ * Pausing a device can be useful to halt all audio without unbinding all the
+ * audio streams. This might be useful while a game is paused, or a level is
+ * loading, etc.
+ *
+ * \param stream the audio stream associated with the audio device to pause.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_ResumeAudioStreamDevice
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_PauseAudioStreamDevice(SDL_AudioStream *stream);
+
+/**
+ * Use this function to unpause audio playback on the audio device associated
+ * with an audio stream.
+ *
+ * This function unpauses audio processing for a given device that has
+ * previously been paused. Once unpaused, any bound audio streams will begin
+ * to progress again, and audio can be generated.
+ *
+ * \param stream the audio stream associated with the audio device to resume.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PauseAudioStreamDevice
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_ResumeAudioStreamDevice(SDL_AudioStream *stream);
+
+/**
+ * Lock an audio stream for serialized access.
+ *
+ * Each SDL_AudioStream has an internal mutex it uses to protect its data
+ * structures from threading conflicts. This function allows an app to lock
+ * that mutex, which could be useful if registering callbacks on this stream.
+ *
+ * One does not need to lock a stream to use in it most cases, as the stream
+ * manages this lock internally. However, this lock is held during callbacks,
+ * which may run from arbitrary threads at any time, so if an app needs to
+ * protect shared data during those callbacks, locking the stream guarantees
+ * that the callback is not running while the lock is held.
+ *
+ * As this is just a wrapper over SDL_LockMutex for an internal lock; it has
+ * all the same attributes (recursive locks are allowed, etc).
+ *
+ * \param stream the audio stream to lock.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_UnlockAudioStream
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_LockAudioStream(SDL_AudioStream *stream);
+
+
+/**
+ * Unlock an audio stream for serialized access.
+ *
+ * This unlocks an audio stream after a call to SDL_LockAudioStream.
+ *
+ * \param stream the audio stream to unlock.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety You should only call this from the same thread that
+ * previously called SDL_LockAudioStream.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_LockAudioStream
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_UnlockAudioStream(SDL_AudioStream *stream);
+
+/**
+ * A callback that fires when data passes through an SDL_AudioStream.
+ *
+ * Apps can (optionally) register a callback with an audio stream that is
+ * called when data is added with SDL_PutAudioStreamData, or requested with
+ * SDL_GetAudioStreamData.
+ *
+ * Two values are offered here: one is the amount of additional data needed to
+ * satisfy the immediate request (which might be zero if the stream already
+ * has enough data queued) and the other is the total amount being requested.
+ * In a Get call triggering a Put callback, these values can be different. In
+ * a Put call triggering a Get callback, these values are always the same.
+ *
+ * Byte counts might be slightly overestimated due to buffering or resampling,
+ * and may change from call to call.
+ *
+ * This callback is not required to do anything. Generally this is useful for
+ * adding/reading data on demand, and the app will often put/get data as
+ * appropriate, but the system goes on with the data currently available to it
+ * if this callback does nothing.
+ *
+ * \param stream the SDL audio stream associated with this callback.
+ * \param additional_amount the amount of data, in bytes, that is needed right
+ * now.
+ * \param total_amount the total amount of data requested, in bytes, that is
+ * requested or available.
+ * \param userdata an opaque pointer provided by the app for their personal
+ * use.
+ *
+ * \threadsafety This callbacks may run from any thread, so if you need to
+ * protect shared data, you should use SDL_LockAudioStream to
+ * serialize access; this lock will be held before your callback
+ * is called, so your callback does not need to manage the lock
+ * explicitly.
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAudioStreamGetCallback
+ * \sa SDL_SetAudioStreamPutCallback
+ */
+typedef void (SDLCALL *SDL_AudioStreamCallback)(void *userdata, SDL_AudioStream *stream, int additional_amount, int total_amount);
+
+/**
+ * Set a callback that runs when data is requested from an audio stream.
+ *
+ * This callback is called _before_ data is obtained from the stream, giving
+ * the callback the chance to add more on-demand.
+ *
+ * The callback can (optionally) call SDL_PutAudioStreamData() to add more
+ * audio to the stream during this call; if needed, the request that triggered
+ * this callback will obtain the new data immediately.
+ *
+ * The callback's `approx_request` argument is roughly how many bytes of
+ * _unconverted_ data (in the stream's input format) is needed by the caller,
+ * although this may overestimate a little for safety. This takes into account
+ * how much is already in the stream and only asks for any extra necessary to
+ * resolve the request, which means the callback may be asked for zero bytes,
+ * and a different amount on each call.
+ *
+ * The callback is not required to supply exact amounts; it is allowed to
+ * supply too much or too little or none at all. The caller will get what's
+ * available, up to the amount they requested, regardless of this callback's
+ * outcome.
+ *
+ * Clearing or flushing an audio stream does not call this callback.
+ *
+ * This function obtains the stream's lock, which means any existing callback
+ * (get or put) in progress will finish running before setting the new
+ * callback.
+ *
+ * Setting a NULL function turns off the callback.
+ *
+ * \param stream the audio stream to set the new callback on.
+ * \param callback the new callback function to call when data is added to the
+ * stream.
+ * \param userdata an opaque pointer provided to the callback for its own
+ * personal use.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information. This only fails if `stream`
+ * is NULL.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAudioStreamPutCallback
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetAudioStreamGetCallback(SDL_AudioStream *stream, SDL_AudioStreamCallback callback, void *userdata);
+
+/**
+ * Set a callback that runs when data is added to an audio stream.
+ *
+ * This callback is called _after_ the data is added to the stream, giving the
+ * callback the chance to obtain it immediately.
+ *
+ * The callback can (optionally) call SDL_GetAudioStreamData() to obtain audio
+ * from the stream during this call.
+ *
+ * The callback's `approx_request` argument is how many bytes of _converted_
+ * data (in the stream's output format) was provided by the caller, although
+ * this may underestimate a little for safety. This value might be less than
+ * what is currently available in the stream, if data was already there, and
+ * might be less than the caller provided if the stream needs to keep a buffer
+ * to aid in resampling. Which means the callback may be provided with zero
+ * bytes, and a different amount on each call.
+ *
+ * The callback may call SDL_GetAudioStreamAvailable to see the total amount
+ * currently available to read from the stream, instead of the total provided
+ * by the current call.
+ *
+ * The callback is not required to obtain all data. It is allowed to read less
+ * or none at all. Anything not read now simply remains in the stream for
+ * later access.
+ *
+ * Clearing or flushing an audio stream does not call this callback.
+ *
+ * This function obtains the stream's lock, which means any existing callback
+ * (get or put) in progress will finish running before setting the new
+ * callback.
+ *
+ * Setting a NULL function turns off the callback.
+ *
+ * \param stream the audio stream to set the new callback on.
+ * \param callback the new callback function to call when data is added to the
+ * stream.
+ * \param userdata an opaque pointer provided to the callback for its own
+ * personal use.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information. This only fails if `stream`
+ * is NULL.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAudioStreamGetCallback
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetAudioStreamPutCallback(SDL_AudioStream *stream, SDL_AudioStreamCallback callback, void *userdata);
+
+
+/**
+ * Free an audio stream.
+ *
+ * This will release all allocated data, including any audio that is still
+ * queued. You do not need to manually clear the stream first.
+ *
+ * If this stream was bound to an audio device, it is unbound during this
+ * call. If this stream was created with SDL_OpenAudioDeviceStream, the audio
+ * device that was opened alongside this stream's creation will be closed,
+ * too.
+ *
+ * \param stream the audio stream to destroy.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_CreateAudioStream
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_DestroyAudioStream(SDL_AudioStream *stream);
+
+
+/**
+ * Convenience function for straightforward audio init for the common case.
+ *
+ * If all your app intends to do is provide a single source of PCM audio, this
+ * function allows you to do all your audio setup in a single call.
+ *
+ * This is also intended to be a clean means to migrate apps from SDL2.
+ *
+ * This function will open an audio device, create a stream and bind it.
+ * Unlike other methods of setup, the audio device will be closed when this
+ * stream is destroyed, so the app can treat the returned SDL_AudioStream as
+ * the only object needed to manage audio playback.
+ *
+ * Also unlike other functions, the audio device begins paused. This is to map
+ * more closely to SDL2-style behavior, since there is no extra step here to
+ * bind a stream to begin audio flowing. The audio device should be resumed
+ * with `SDL_ResumeAudioStreamDevice(stream);`
+ *
+ * This function works with both playback and recording devices.
+ *
+ * The `spec` parameter represents the app's side of the audio stream. That
+ * is, for recording audio, this will be the output format, and for playing
+ * audio, this will be the input format. If spec is NULL, the system will
+ * choose the format, and the app can use SDL_GetAudioStreamFormat() to obtain
+ * this information later.
+ *
+ * If you don't care about opening a specific audio device, you can (and
+ * probably _should_), use SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK for playback and
+ * SDL_AUDIO_DEVICE_DEFAULT_RECORDING for recording.
+ *
+ * One can optionally provide a callback function; if NULL, the app is
+ * expected to queue audio data for playback (or unqueue audio data if
+ * capturing). Otherwise, the callback will begin to fire once the device is
+ * unpaused.
+ *
+ * Destroying the returned stream with SDL_DestroyAudioStream will also close
+ * the audio device associated with this stream.
+ *
+ * \param devid an audio device to open, or SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK
+ * or SDL_AUDIO_DEVICE_DEFAULT_RECORDING.
+ * \param spec the audio stream's data format. Can be NULL.
+ * \param callback a callback where the app will provide new data for
+ * playback, or receive new data for recording. Can be NULL,
+ * in which case the app will need to call
+ * SDL_PutAudioStreamData or SDL_GetAudioStreamData as
+ * necessary.
+ * \param userdata app-controlled pointer passed to callback. Can be NULL.
+ * Ignored if callback is NULL.
+ * \returns an audio stream on success, ready to use, or NULL on failure; call
+ * SDL_GetError() for more information. When done with this stream,
+ * call SDL_DestroyAudioStream to free resources and close the
+ * device.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetAudioStreamDevice
+ * \sa SDL_ResumeAudioStreamDevice
+ */
+extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_OpenAudioDeviceStream(SDL_AudioDeviceID devid, const SDL_AudioSpec *spec, SDL_AudioStreamCallback callback, void *userdata);
+
+/**
+ * A callback that fires when data is about to be fed to an audio device.
+ *
+ * This is useful for accessing the final mix, perhaps for writing a
+ * visualizer or applying a final effect to the audio data before playback.
+ *
+ * This callback should run as quickly as possible and not block for any
+ * significant time, as this callback delays submission of data to the audio
+ * device, which can cause audio playback problems.
+ *
+ * The postmix callback _must_ be able to handle any audio data format
+ * specified in `spec`, which can change between callbacks if the audio device
+ * changed. However, this only covers frequency and channel count; data is
+ * always provided here in SDL_AUDIO_F32 format.
+ *
+ * The postmix callback runs _after_ logical device gain and audiostream gain
+ * have been applied, which is to say you can make the output data louder at
+ * this point than the gain settings would suggest.
+ *
+ * \param userdata a pointer provided by the app through
+ * SDL_SetAudioPostmixCallback, for its own use.
+ * \param spec the current format of audio that is to be submitted to the
+ * audio device.
+ * \param buffer the buffer of audio samples to be submitted. The callback can
+ * inspect and/or modify this data.
+ * \param buflen the size of `buffer` in bytes.
+ *
+ * \threadsafety This will run from a background thread owned by SDL. The
+ * application is responsible for locking resources the callback
+ * touches that need to be protected.
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAudioPostmixCallback
+ */
+typedef void (SDLCALL *SDL_AudioPostmixCallback)(void *userdata, const SDL_AudioSpec *spec, float *buffer, int buflen);
+
+/**
+ * Set a callback that fires when data is about to be fed to an audio device.
+ *
+ * This is useful for accessing the final mix, perhaps for writing a
+ * visualizer or applying a final effect to the audio data before playback.
+ *
+ * The buffer is the final mix of all bound audio streams on an opened device;
+ * this callback will fire regularly for any device that is both opened and
+ * unpaused. If there is no new data to mix, either because no streams are
+ * bound to the device or all the streams are empty, this callback will still
+ * fire with the entire buffer set to silence.
+ *
+ * This callback is allowed to make changes to the data; the contents of the
+ * buffer after this call is what is ultimately passed along to the hardware.
+ *
+ * The callback is always provided the data in float format (values from -1.0f
+ * to 1.0f), but the number of channels or sample rate may be different than
+ * the format the app requested when opening the device; SDL might have had to
+ * manage a conversion behind the scenes, or the playback might have jumped to
+ * new physical hardware when a system default changed, etc. These details may
+ * change between calls. Accordingly, the size of the buffer might change
+ * between calls as well.
+ *
+ * This callback can run at any time, and from any thread; if you need to
+ * serialize access to your app's data, you should provide and use a mutex or
+ * other synchronization device.
+ *
+ * All of this to say: there are specific needs this callback can fulfill, but
+ * it is not the simplest interface. Apps should generally provide audio in
+ * their preferred format through an SDL_AudioStream and let SDL handle the
+ * difference.
+ *
+ * This function is extremely time-sensitive; the callback should do the least
+ * amount of work possible and return as quickly as it can. The longer the
+ * callback runs, the higher the risk of audio dropouts or other problems.
+ *
+ * This function will block until the audio device is in between iterations,
+ * so any existing callback that might be running will finish before this
+ * function sets the new callback and returns.
+ *
+ * Setting a NULL callback function disables any previously-set callback.
+ *
+ * \param devid the ID of an opened audio device.
+ * \param callback a callback function to be called. Can be NULL.
+ * \param userdata app-controlled pointer passed to callback. Can be NULL.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDeviceID devid, SDL_AudioPostmixCallback callback, void *userdata);
+
+
+/**
+ * Load the audio data of a WAVE file into memory.
+ *
+ * Loading a WAVE file requires `src`, `spec`, `audio_buf` and `audio_len` to
+ * be valid pointers. The entire data portion of the file is then loaded into
+ * memory and decoded if necessary.
+ *
+ * Supported formats are RIFF WAVE files with the formats PCM (8, 16, 24, and
+ * 32 bits), IEEE Float (32 bits), Microsoft ADPCM and IMA ADPCM (4 bits), and
+ * A-law and mu-law (8 bits). Other formats are currently unsupported and
+ * cause an error.
+ *
+ * If this function succeeds, the return value is zero and the pointer to the
+ * audio data allocated by the function is written to `audio_buf` and its
+ * length in bytes to `audio_len`. The SDL_AudioSpec members `freq`,
+ * `channels`, and `format` are set to the values of the audio data in the
+ * buffer.
+ *
+ * It's necessary to use SDL_free() to free the audio data returned in
+ * `audio_buf` when it is no longer used.
+ *
+ * Because of the underspecification of the .WAV format, there are many
+ * problematic files in the wild that cause issues with strict decoders. To
+ * provide compatibility with these files, this decoder is lenient in regards
+ * to the truncation of the file, the fact chunk, and the size of the RIFF
+ * chunk. The hints `SDL_HINT_WAVE_RIFF_CHUNK_SIZE`,
+ * `SDL_HINT_WAVE_TRUNCATION`, and `SDL_HINT_WAVE_FACT_CHUNK` can be used to
+ * tune the behavior of the loading process.
+ *
+ * Any file that is invalid (due to truncation, corruption, or wrong values in
+ * the headers), too big, or unsupported causes an error. Additionally, any
+ * critical I/O error from the data source will terminate the loading process
+ * with an error. The function returns NULL on error and in all cases (with
+ * the exception of `src` being NULL), an appropriate error message will be
+ * set.
+ *
+ * It is required that the data source supports seeking.
+ *
+ * Example:
+ *
+ * ```c
+ * SDL_LoadWAV_IO(SDL_IOFromFile("sample.wav", "rb"), 1, &spec, &buf, &len);
+ * ```
+ *
+ * Note that the SDL_LoadWAV function does this same thing for you, but in a
+ * less messy way:
+ *
+ * ```c
+ * SDL_LoadWAV("sample.wav", &spec, &buf, &len);
+ * ```
+ *
+ * \param src the data source for the WAVE data.
+ * \param closeio if SDL_TRUE, calls SDL_CloseIO() on `src` before returning,
+ * even in the case of an error.
+ * \param spec a pointer to an SDL_AudioSpec that will be set to the WAVE
+ * data's format details on successful return.
+ * \param audio_buf a pointer filled with the audio data, allocated by the
+ * function.
+ * \param audio_len a pointer filled with the length of the audio data buffer
+ * in bytes.
+ * \returns 0 on success. `audio_buf` will be filled with a pointer to an
+ * allocated buffer containing the audio data, and `audio_len` is
+ * filled with the length of that audio buffer in bytes.
+ *
+ * This function returns -1 if the .WAV file cannot be opened, uses
+ * an unknown data format, or is corrupt; call SDL_GetError() for
+ * more information.
+ *
+ * When the application is done with the data returned in
+ * `audio_buf`, it should call SDL_free() to dispose of it.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_free
+ * \sa SDL_LoadWAV
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_LoadWAV_IO(SDL_IOStream * src, SDL_bool closeio,
+ SDL_AudioSpec * spec, Uint8 ** audio_buf,
+ Uint32 * audio_len);
+
+/**
+ * Loads a WAV from a file path.
+ *
+ * This is a convenience function that is effectively the same as:
+ *
+ * ```c
+ * SDL_LoadWAV_IO(SDL_IOFromFile(path, "rb"), 1, spec, audio_buf, audio_len);
+ * ```
+ *
+ * \param path the file path of the WAV file to open.
+ * \param spec a pointer to an SDL_AudioSpec that will be set to the WAVE
+ * data's format details on successful return.
+ * \param audio_buf a pointer filled with the audio data, allocated by the
+ * function.
+ * \param audio_len a pointer filled with the length of the audio data buffer
+ * in bytes.
+ * \returns 0 on success. `audio_buf` will be filled with a pointer to an
+ * allocated buffer containing the audio data, and `audio_len` is
+ * filled with the length of that audio buffer in bytes.
+ *
+ * This function returns -1 if the .WAV file cannot be opened, uses
+ * an unknown data format, or is corrupt; call SDL_GetError() for
+ * more information.
+ *
+ * When the application is done with the data returned in
+ * `audio_buf`, it should call SDL_free() to dispose of it.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_free
+ * \sa SDL_LoadWAV_IO
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_LoadWAV(const char *path, SDL_AudioSpec * spec,
+ Uint8 ** audio_buf, Uint32 * audio_len);
+
+/**
+ * Mix audio data in a specified format.
+ *
+ * This takes an audio buffer `src` of `len` bytes of `format` data and mixes
+ * it into `dst`, performing addition, volume adjustment, and overflow
+ * clipping. The buffer pointed to by `dst` must also be `len` bytes of
+ * `format` data.
+ *
+ * This is provided for convenience -- you can mix your own audio data.
+ *
+ * Do not use this function for mixing together more than two streams of
+ * sample data. The output from repeated application of this function may be
+ * distorted by clipping, because there is no accumulator with greater range
+ * than the input (not to mention this being an inefficient way of doing it).
+ *
+ * It is a common misconception that this function is required to write audio
+ * data to an output stream in an audio callback. While you can do that,
+ * SDL_MixAudio() is really only needed when you're mixing a single audio
+ * stream with a volume adjustment.
+ *
+ * \param dst the destination for the mixed audio.
+ * \param src the source audio buffer to be mixed.
+ * \param format the SDL_AudioFormat structure representing the desired audio
+ * format.
+ * \param len the length of the audio buffer in bytes.
+ * \param volume ranges from 0.0 - 1.0, and should be set to 1.0 for full
+ * audio volume.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_MixAudio(Uint8 * dst,
+ const Uint8 * src,
+ SDL_AudioFormat format,
+ Uint32 len, float volume);
+
+/**
+ * Convert some audio data of one format to another format.
+ *
+ * Please note that this function is for convenience, but should not be used
+ * to resample audio in blocks, as it will introduce audio artifacts on the
+ * boundaries. You should only use this function if you are converting audio
+ * data in its entirety in one call. If you want to convert audio in smaller
+ * chunks, use an SDL_AudioStream, which is designed for this situation.
+ *
+ * Internally, this function creates and destroys an SDL_AudioStream on each
+ * use, so it's also less efficient than using one directly, if you need to
+ * convert multiple times.
+ *
+ * \param src_spec the format details of the input audio.
+ * \param src_data the audio data to be converted.
+ * \param src_len the len of src_data.
+ * \param dst_spec the format details of the output audio.
+ * \param dst_data will be filled with a pointer to converted audio data,
+ * which should be freed with SDL_free(). On error, it will be
+ * NULL.
+ * \param dst_len will be filled with the len of dst_data.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_ConvertAudioSamples(const SDL_AudioSpec *src_spec,
+ const Uint8 *src_data,
+ int src_len,
+ const SDL_AudioSpec *dst_spec,
+ Uint8 **dst_data,
+ int *dst_len);
+
+
+/**
+ * Get the appropriate memset value for silencing an audio format.
+ *
+ * The value returned by this function can be used as the second argument to
+ * memset (or SDL_memset) to set an audio buffer in a specific format to
+ * silence.
+ *
+ * \param format the audio data format to query.
+ * \returns a byte value that can be passed to memset.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetSilenceValueForFormat(SDL_AudioFormat format);
+
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_audio_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_begin_code.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_begin_code.h
new file mode 100644
index 0000000..f418c61
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_begin_code.h
@@ -0,0 +1,227 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* WIKI CATEGORY: BeginCode */
+
+/**
+ * SDL_begin_code.h sets things up for C dynamic library function definitions,
+ * static inlined functions, and structures aligned at 4-byte alignment.
+ * If you don't like ugly C preprocessor code, don't look at this file. :)
+ */
+
+/* This shouldn't be nested -- included it around code only. */
+#ifdef SDL_begin_code_h
+#error Nested inclusion of SDL_begin_code.h
+#endif
+#define SDL_begin_code_h
+
+#ifndef SDL_DEPRECATED
+# if defined(__GNUC__) && (__GNUC__ >= 4) /* technically, this arrived in gcc 3.1, but oh well. */
+# define SDL_DEPRECATED __attribute__((deprecated))
+# elif defined(_MSC_VER)
+# define SDL_DEPRECATED __declspec(deprecated)
+# else
+# define SDL_DEPRECATED
+# endif
+#endif
+
+#ifndef SDL_UNUSED
+# ifdef __GNUC__
+# define SDL_UNUSED __attribute__((unused))
+# else
+# define SDL_UNUSED
+# endif
+#endif
+
+/* Some compilers use a special export keyword */
+#ifndef SDL_DECLSPEC
+# if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINRT) || defined(SDL_PLATFORM_CYGWIN) || defined(SDL_PLATFORM_GDK)
+# ifdef DLL_EXPORT
+# define SDL_DECLSPEC __declspec(dllexport)
+# else
+# define SDL_DECLSPEC
+# endif
+# else
+# if defined(__GNUC__) && __GNUC__ >= 4
+# define SDL_DECLSPEC __attribute__ ((visibility("default")))
+# else
+# define SDL_DECLSPEC
+# endif
+# endif
+#endif
+
+/* By default SDL uses the C calling convention */
+#ifndef SDLCALL
+#if (defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINRT) || defined(SDL_PLATFORM_GDK)) && !defined(__GNUC__)
+#define SDLCALL __cdecl
+#else
+#define SDLCALL
+#endif
+#endif /* SDLCALL */
+
+/* Force structure packing at 4 byte alignment.
+ This is necessary if the header is included in code which has structure
+ packing set to an alternate value, say for loading structures from disk.
+ The packing is reset to the previous value in SDL_close_code.h
+ */
+#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__)
+#ifdef _MSC_VER
+#pragma warning(disable: 4103)
+#endif
+#ifdef __clang__
+#pragma clang diagnostic ignored "-Wpragma-pack"
+#endif
+#ifdef __BORLANDC__
+#pragma nopackwarning
+#endif
+#ifdef _WIN64
+/* Use 8-byte alignment on 64-bit architectures, so pointers are aligned */
+#pragma pack(push,8)
+#else
+#pragma pack(push,4)
+#endif
+#endif /* Compiler needs structure packing set */
+
+#ifndef SDL_INLINE
+#ifdef __GNUC__
+#define SDL_INLINE __inline__
+#elif defined(_MSC_VER) || defined(__BORLANDC__) || \
+ defined(__DMC__) || defined(__SC__) || \
+ defined(__WATCOMC__) || defined(__LCC__) || \
+ defined(__DECC) || defined(__CC_ARM)
+#define SDL_INLINE __inline
+#ifndef __inline__
+#define __inline__ __inline
+#endif
+#else
+#define SDL_INLINE inline
+#ifndef __inline__
+#define __inline__ inline
+#endif
+#endif
+#endif /* SDL_INLINE not defined */
+
+#ifndef SDL_FORCE_INLINE
+#ifdef _MSC_VER
+#define SDL_FORCE_INLINE __forceinline
+#elif ( (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) )
+#define SDL_FORCE_INLINE __attribute__((always_inline)) static __inline__
+#else
+#define SDL_FORCE_INLINE static SDL_INLINE
+#endif
+#endif /* SDL_FORCE_INLINE not defined */
+
+#ifndef SDL_NORETURN
+#ifdef __GNUC__
+#define SDL_NORETURN __attribute__((noreturn))
+#elif defined(_MSC_VER)
+#define SDL_NORETURN __declspec(noreturn)
+#else
+#define SDL_NORETURN
+#endif
+#endif /* SDL_NORETURN not defined */
+
+#ifdef __clang__
+#if __has_feature(attribute_analyzer_noreturn)
+#define SDL_ANALYZER_NORETURN __attribute__((analyzer_noreturn))
+#endif
+#endif
+
+#ifndef SDL_ANALYZER_NORETURN
+#define SDL_ANALYZER_NORETURN
+#endif
+
+/* Apparently this is needed by several Windows compilers */
+#ifndef __MACH__
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif /* NULL */
+#endif /* ! macOS - breaks precompiled headers */
+
+#ifndef SDL_FALLTHROUGH
+#if (defined(__cplusplus) && __cplusplus >= 201703L) || \
+ (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202000L)
+#define SDL_FALLTHROUGH [[fallthrough]]
+#else
+#if defined(__has_attribute) && !defined(__SUNPRO_C) && !defined(__SUNPRO_CC)
+#define SDL_HAS_FALLTHROUGH __has_attribute(__fallthrough__)
+#else
+#define SDL_HAS_FALLTHROUGH 0
+#endif /* __has_attribute */
+#if SDL_HAS_FALLTHROUGH && \
+ ((defined(__GNUC__) && __GNUC__ >= 7) || \
+ (defined(__clang_major__) && __clang_major__ >= 10))
+#define SDL_FALLTHROUGH __attribute__((__fallthrough__))
+#else
+#define SDL_FALLTHROUGH do {} while (0) /* fallthrough */
+#endif /* SDL_HAS_FALLTHROUGH */
+#undef SDL_HAS_FALLTHROUGH
+#endif /* C++17 or C2x */
+#endif /* SDL_FALLTHROUGH not defined */
+
+#ifndef SDL_NODISCARD
+#if (defined(__cplusplus) && __cplusplus >= 201703L) || \
+ (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L)
+#define SDL_NODISCARD [[nodiscard]]
+#elif ( (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) )
+#define SDL_NODISCARD __attribute__((warn_unused_result))
+#elif defined(_MSC_VER) && (_MSC_VER >= 1700)
+#define SDL_NODISCARD _Check_return_
+#else
+#define SDL_NODISCARD
+#endif /* C++17 or C23 */
+#endif /* SDL_NODISCARD not defined */
+
+#ifndef SDL_MALLOC
+#if defined(__GNUC__) && (__GNUC__ >= 3)
+#define SDL_MALLOC __attribute__((malloc))
+/** FIXME
+#elif defined(_MSC_VER)
+#define SDL_MALLOC __declspec(allocator) __desclspec(restrict)
+**/
+#else
+#define SDL_MALLOC
+#endif
+#endif /* SDL_MALLOC not defined */
+
+#ifndef SDL_ALLOC_SIZE
+#if (defined(__clang__) && __clang_major__ >= 4) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
+#define SDL_ALLOC_SIZE(p) __attribute__((alloc_size(p)))
+#elif defined(_MSC_VER)
+#define SDL_ALLOC_SIZE(p)
+#else
+#define SDL_ALLOC_SIZE(p)
+#endif
+#endif /* SDL_ALLOC_SIZE not defined */
+
+#ifndef SDL_ALLOC_SIZE2
+#if (defined(__clang__) && __clang_major__ >= 4) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
+#define SDL_ALLOC_SIZE2(p1, p2) __attribute__((alloc_size(p1, p2)))
+#elif defined(_MSC_VER)
+#define SDL_ALLOC_SIZE2(p1, p2)
+#else
+#define SDL_ALLOC_SIZE2(p1, p2)
+#endif
+#endif /* SDL_ALLOC_SIZE2 not defined */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_bits.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_bits.h
new file mode 100644
index 0000000..72be082
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_bits.h
@@ -0,0 +1,152 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryBits
+ *
+ * Functions for fiddling with bits and bitmasks.
+ */
+
+#ifndef SDL_bits_h_
+#define SDL_bits_h_
+
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \file SDL_bits.h
+ */
+
+#if defined(__WATCOMC__) && defined(__386__)
+extern __inline int _SDL_bsr_watcom(Uint32);
+#pragma aux _SDL_bsr_watcom = \
+ "bsr eax, eax" \
+ parm [eax] nomemory \
+ value [eax] \
+ modify exact [eax] nomemory;
+#endif
+
+/**
+ * Get the index of the most significant (set) bit in a 32-bit number.
+ *
+ * Result is undefined when called with 0. This operation can also be stated
+ * as "count leading zeroes" and "log base 2".
+ *
+ * Note that this is a forced-inline function in a header, and not a public
+ * API function available in the SDL library (which is to say, the code is
+ * embedded in the calling program and the linker and dynamic loader will not
+ * be able to find this function inside SDL itself).
+ *
+ * \param x the 32-bit value to examine.
+ * \returns the index of the most significant bit, or -1 if the value is 0.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x)
+{
+#if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+ /* Count Leading Zeroes builtin in GCC.
+ * http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/Other-Builtins.html
+ */
+ if (x == 0) {
+ return -1;
+ }
+ return 31 - __builtin_clz(x);
+#elif defined(__WATCOMC__) && defined(__386__)
+ if (x == 0) {
+ return -1;
+ }
+ return _SDL_bsr_watcom(x);
+#elif defined(_MSC_VER)
+ unsigned long index;
+ if (_BitScanReverse(&index, x)) {
+ return index;
+ }
+ return -1;
+#else
+ /* Based off of Bit Twiddling Hacks by Sean Eron Anderson
+ * , released in the public domain.
+ * http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog
+ */
+ const Uint32 b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
+ const int S[] = {1, 2, 4, 8, 16};
+
+ int msbIndex = 0;
+ int i;
+
+ if (x == 0) {
+ return -1;
+ }
+
+ for (i = 4; i >= 0; i--)
+ {
+ if (x & b[i])
+ {
+ x >>= S[i];
+ msbIndex |= S[i];
+ }
+ }
+
+ return msbIndex;
+#endif
+}
+
+/**
+ * Determine if a unsigned 32-bit value has exactly one bit set.
+ *
+ * If there are no bits set (`x` is zero), or more than one bit set, this
+ * returns SDL_FALSE. If any one bit is exclusively set, this returns
+ * SDL_TRUE.
+ *
+ * Note that this is a forced-inline function in a header, and not a public
+ * API function available in the SDL library (which is to say, the code is
+ * embedded in the calling program and the linker and dynamic loader will not
+ * be able to find this function inside SDL itself).
+ *
+ * \param x the 32-bit value to examine.
+ * \returns SDL_TRUE if exactly one bit is set in `x`, SDL_FALSE otherwise.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+SDL_FORCE_INLINE SDL_bool SDL_HasExactlyOneBitSet32(Uint32 x)
+{
+ if (x && !(x & (x - 1))) {
+ return SDL_TRUE;
+ }
+ return SDL_FALSE;
+}
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_bits_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_blendmode.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_blendmode.h
new file mode 100644
index 0000000..76aa197
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_blendmode.h
@@ -0,0 +1,200 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryBlendmode
+ *
+ * Blend modes decide how two colors will mix together. There are both
+ * standard modes for basic needs and a means to create custom modes,
+ * dictating what sort of math to do what on what color components.
+ */
+
+#ifndef SDL_blendmode_h_
+#define SDL_blendmode_h_
+
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * A set of blend modes used in drawing operations.
+ *
+ * These predefined blend modes are supported everywhere.
+ *
+ * Additional values may be obtained from SDL_ComposeCustomBlendMode.
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ *
+ * \sa SDL_ComposeCustomBlendMode
+ */
+typedef Uint32 SDL_BlendMode;
+
+#define SDL_BLENDMODE_NONE 0x00000000u /**< no blending: dstRGBA = srcRGBA */
+#define SDL_BLENDMODE_BLEND 0x00000001u /**< alpha blending: dstRGB = (srcRGB * srcA) + (dstRGB * (1-srcA)), dstA = srcA + (dstA * (1-srcA)) */
+#define SDL_BLENDMODE_BLEND_PREMULTIPLIED 0x00000010u /**< pre-multiplied alpha blending: dstRGBA = srcRGBA + (dstRGBA * (1-srcA)) */
+#define SDL_BLENDMODE_ADD 0x00000002u /**< additive blending: dstRGB = (srcRGB * srcA) + dstRGB, dstA = dstA */
+#define SDL_BLENDMODE_ADD_PREMULTIPLIED 0x00000020u /**< pre-multiplied additive blending: dstRGB = srcRGB + dstRGB, dstA = dstA */
+#define SDL_BLENDMODE_MOD 0x00000004u /**< color modulate: dstRGB = srcRGB * dstRGB, dstA = dstA */
+#define SDL_BLENDMODE_MUL 0x00000008u /**< color multiply: dstRGB = (srcRGB * dstRGB) + (dstRGB * (1-srcA)), dstA = dstA */
+#define SDL_BLENDMODE_INVALID 0x7FFFFFFFu
+
+/**
+ * The blend operation used when combining source and destination pixel
+ * components.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ */
+typedef enum SDL_BlendOperation
+{
+ SDL_BLENDOPERATION_ADD = 0x1, /**< dst + src: supported by all renderers */
+ SDL_BLENDOPERATION_SUBTRACT = 0x2, /**< src - dst : supported by D3D, OpenGL, OpenGLES, and Vulkan */
+ SDL_BLENDOPERATION_REV_SUBTRACT = 0x3, /**< dst - src : supported by D3D, OpenGL, OpenGLES, and Vulkan */
+ SDL_BLENDOPERATION_MINIMUM = 0x4, /**< min(dst, src) : supported by D3D, OpenGL, OpenGLES, and Vulkan */
+ SDL_BLENDOPERATION_MAXIMUM = 0x5 /**< max(dst, src) : supported by D3D, OpenGL, OpenGLES, and Vulkan */
+} SDL_BlendOperation;
+
+/**
+ * The normalized factor used to multiply pixel components.
+ *
+ * The blend factors are multiplied with the pixels from a drawing operation
+ * (src) and the pixels from the render target (dst) before the blend
+ * operation. The comma-separated factors listed above are always applied in
+ * the component order red, green, blue, and alpha.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ */
+typedef enum SDL_BlendFactor
+{
+ SDL_BLENDFACTOR_ZERO = 0x1, /**< 0, 0, 0, 0 */
+ SDL_BLENDFACTOR_ONE = 0x2, /**< 1, 1, 1, 1 */
+ SDL_BLENDFACTOR_SRC_COLOR = 0x3, /**< srcR, srcG, srcB, srcA */
+ SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR = 0x4, /**< 1-srcR, 1-srcG, 1-srcB, 1-srcA */
+ SDL_BLENDFACTOR_SRC_ALPHA = 0x5, /**< srcA, srcA, srcA, srcA */
+ SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA = 0x6, /**< 1-srcA, 1-srcA, 1-srcA, 1-srcA */
+ SDL_BLENDFACTOR_DST_COLOR = 0x7, /**< dstR, dstG, dstB, dstA */
+ SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR = 0x8, /**< 1-dstR, 1-dstG, 1-dstB, 1-dstA */
+ SDL_BLENDFACTOR_DST_ALPHA = 0x9, /**< dstA, dstA, dstA, dstA */
+ SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA = 0xA /**< 1-dstA, 1-dstA, 1-dstA, 1-dstA */
+} SDL_BlendFactor;
+
+/**
+ * Compose a custom blend mode for renderers.
+ *
+ * The functions SDL_SetRenderDrawBlendMode and SDL_SetTextureBlendMode accept
+ * the SDL_BlendMode returned by this function if the renderer supports it.
+ *
+ * A blend mode controls how the pixels from a drawing operation (source) get
+ * combined with the pixels from the render target (destination). First, the
+ * components of the source and destination pixels get multiplied with their
+ * blend factors. Then, the blend operation takes the two products and
+ * calculates the result that will get stored in the render target.
+ *
+ * Expressed in pseudocode, it would look like this:
+ *
+ * ```c
+ * dstRGB = colorOperation(srcRGB * srcColorFactor, dstRGB * dstColorFactor);
+ * dstA = alphaOperation(srcA * srcAlphaFactor, dstA * dstAlphaFactor);
+ * ```
+ *
+ * Where the functions `colorOperation(src, dst)` and `alphaOperation(src,
+ * dst)` can return one of the following:
+ *
+ * - `src + dst`
+ * - `src - dst`
+ * - `dst - src`
+ * - `min(src, dst)`
+ * - `max(src, dst)`
+ *
+ * The red, green, and blue components are always multiplied with the first,
+ * second, and third components of the SDL_BlendFactor, respectively. The
+ * fourth component is not used.
+ *
+ * The alpha component is always multiplied with the fourth component of the
+ * SDL_BlendFactor. The other components are not used in the alpha
+ * calculation.
+ *
+ * Support for these blend modes varies for each renderer. To check if a
+ * specific SDL_BlendMode is supported, create a renderer and pass it to
+ * either SDL_SetRenderDrawBlendMode or SDL_SetTextureBlendMode. They will
+ * return with an error if the blend mode is not supported.
+ *
+ * This list describes the support of custom blend modes for each renderer.
+ * All renderers support the four blend modes listed in the SDL_BlendMode
+ * enumeration.
+ *
+ * - **direct3d**: Supports all operations with all factors. However, some
+ * factors produce unexpected results with `SDL_BLENDOPERATION_MINIMUM` and
+ * `SDL_BLENDOPERATION_MAXIMUM`.
+ * - **direct3d11**: Same as Direct3D 9.
+ * - **opengl**: Supports the `SDL_BLENDOPERATION_ADD` operation with all
+ * factors. OpenGL versions 1.1, 1.2, and 1.3 do not work correctly here.
+ * - **opengles2**: Supports the `SDL_BLENDOPERATION_ADD`,
+ * `SDL_BLENDOPERATION_SUBTRACT`, `SDL_BLENDOPERATION_REV_SUBTRACT`
+ * operations with all factors.
+ * - **psp**: No custom blend mode support.
+ * - **software**: No custom blend mode support.
+ *
+ * Some renderers do not provide an alpha component for the default render
+ * target. The `SDL_BLENDFACTOR_DST_ALPHA` and
+ * `SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA` factors do not have an effect in this
+ * case.
+ *
+ * \param srcColorFactor the SDL_BlendFactor applied to the red, green, and
+ * blue components of the source pixels.
+ * \param dstColorFactor the SDL_BlendFactor applied to the red, green, and
+ * blue components of the destination pixels.
+ * \param colorOperation the SDL_BlendOperation used to combine the red,
+ * green, and blue components of the source and
+ * destination pixels.
+ * \param srcAlphaFactor the SDL_BlendFactor applied to the alpha component of
+ * the source pixels.
+ * \param dstAlphaFactor the SDL_BlendFactor applied to the alpha component of
+ * the destination pixels.
+ * \param alphaOperation the SDL_BlendOperation used to combine the alpha
+ * component of the source and destination pixels.
+ * \returns an SDL_BlendMode that represents the chosen factors and
+ * operations.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetRenderDrawBlendMode
+ * \sa SDL_GetRenderDrawBlendMode
+ * \sa SDL_SetTextureBlendMode
+ * \sa SDL_GetTextureBlendMode
+ */
+extern SDL_DECLSPEC SDL_BlendMode SDLCALL SDL_ComposeCustomBlendMode(SDL_BlendFactor srcColorFactor,
+ SDL_BlendFactor dstColorFactor,
+ SDL_BlendOperation colorOperation,
+ SDL_BlendFactor srcAlphaFactor,
+ SDL_BlendFactor dstAlphaFactor,
+ SDL_BlendOperation alphaOperation);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_blendmode_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_camera.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_camera.h
new file mode 100644
index 0000000..46dcee1
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_camera.h
@@ -0,0 +1,483 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryCamera
+ *
+ * Video capture for the SDL library.
+ *
+ * This API lets apps read input from video sources, like webcams. Camera
+ * devices can be enumerated, queried, and opened. Once opened, it will
+ * provide SDL_Surface objects as new frames of video come in. These surfaces
+ * can be uploaded to an SDL_Texture or processed as pixels in memory.
+ */
+
+#ifndef SDL_camera_h_
+#define SDL_camera_h_
+
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * This is a unique ID for a camera device for the time it is connected to the
+ * system, and is never reused for the lifetime of the application.
+ *
+ * If the device is disconnected and reconnected, it will get a new ID.
+ *
+ * The ID value starts at 1 and increments from there. The value 0 is an
+ * invalid ID.
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetCameras
+ */
+typedef Uint32 SDL_CameraID;
+
+/**
+ * The opaque structure used to identify an opened SDL camera.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_Camera SDL_Camera;
+
+/**
+ * The details of an output format for a camera device.
+ *
+ * Cameras often support multiple formats; each one will be encapsulated in
+ * this struct.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetCameraSupportedFormats
+ * \sa SDL_GetCameraFormat
+ */
+typedef struct SDL_CameraSpec
+{
+ SDL_PixelFormat format; /**< Frame format */
+ SDL_Colorspace colorspace; /**< Frame colorspace */
+ int width; /**< Frame width */
+ int height; /**< Frame height */
+ int framerate_numerator; /**< Frame rate numerator ((num / denom) == FPS, (denom / num) == duration in seconds) */
+ int framerate_denominator; /**< Frame rate demoninator ((num / denom) == FPS, (denom / num) == duration in seconds) */
+} SDL_CameraSpec;
+
+/**
+ * The position of camera in relation to system device.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetCameraPosition
+ */
+typedef enum SDL_CameraPosition
+{
+ SDL_CAMERA_POSITION_UNKNOWN,
+ SDL_CAMERA_POSITION_FRONT_FACING,
+ SDL_CAMERA_POSITION_BACK_FACING
+} SDL_CameraPosition;
+
+
+/**
+ * Use this function to get the number of built-in camera drivers.
+ *
+ * This function returns a hardcoded number. This never returns a negative
+ * value; if there are no drivers compiled into this build of SDL, this
+ * function returns zero. The presence of a driver in this list does not mean
+ * it will function, it just means SDL is capable of interacting with that
+ * interface. For example, a build of SDL might have v4l2 support, but if
+ * there's no kernel support available, SDL's v4l2 driver would fail if used.
+ *
+ * By default, SDL tries all drivers, in its preferred order, until one is
+ * found to be usable.
+ *
+ * \returns the number of built-in camera drivers.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetCameraDriver
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetNumCameraDrivers(void);
+
+/**
+ * Use this function to get the name of a built in camera driver.
+ *
+ * The list of camera drivers is given in the order that they are normally
+ * initialized by default; the drivers that seem more reasonable to choose
+ * first (as far as the SDL developers believe) are earlier in the list.
+ *
+ * The names of drivers are all simple, low-ASCII identifiers, like "v4l2",
+ * "coremedia" or "android". These never have Unicode characters, and are not
+ * meant to be proper names.
+ *
+ * \param index the index of the camera driver; the value ranges from 0 to
+ * SDL_GetNumCameraDrivers() - 1.
+ * \returns the name of the camera driver at the requested index, or NULL if
+ * an invalid index was specified.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetNumCameraDrivers
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraDriver(int index);
+
+/**
+ * Get the name of the current camera driver.
+ *
+ * The names of drivers are all simple, low-ASCII identifiers, like "v4l2",
+ * "coremedia" or "android". These never have Unicode characters, and are not
+ * meant to be proper names.
+ *
+ * \returns the name of the current camera driver or NULL if no driver has
+ * been initialized.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentCameraDriver(void);
+
+/**
+ * Get a list of currently connected camera devices.
+ *
+ * \param count a pointer filled in with the number of cameras returned, may
+ * be NULL.
+ * \returns a 0 terminated array of camera instance IDs or NULL on failure;
+ * call SDL_GetError() for more information. This should be freed
+ * with SDL_free() when it is no longer needed.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenCamera
+ */
+extern SDL_DECLSPEC SDL_CameraID * SDLCALL SDL_GetCameras(int *count);
+
+/**
+ * Get the list of native formats/sizes a camera supports.
+ *
+ * This returns a list of all formats and frame sizes that a specific camera
+ * can offer. This is useful if your app can accept a variety of image formats
+ * and sizes and so want to find the optimal spec that doesn't require
+ * conversion.
+ *
+ * This function isn't strictly required; if you call SDL_OpenCamera with a
+ * NULL spec, SDL will choose a native format for you, and if you instead
+ * specify a desired format, it will transparently convert to the requested
+ * format on your behalf.
+ *
+ * If `count` is not NULL, it will be filled with the number of elements in
+ * the returned array.
+ *
+ * Note that it's legal for a camera to supply an empty list. This is what
+ * will happen on Emscripten builds, since that platform won't tell _anything_
+ * about available cameras until you've opened one, and won't even tell if
+ * there _is_ a camera until the user has given you permission to check
+ * through a scary warning popup.
+ *
+ * \param devid the camera device instance ID to query.
+ * \param count a pointer filled in with the number of elements in the list,
+ * may be NULL.
+ * \returns a NULL terminated array of pointers to SDL_CameraSpec or NULL on
+ * failure; call SDL_GetError() for more information. This is a
+ * single allocation that should be freed with SDL_free() when it is
+ * no longer needed.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetCameras
+ * \sa SDL_OpenCamera
+ */
+extern SDL_DECLSPEC SDL_CameraSpec ** SDLCALL SDL_GetCameraSupportedFormats(SDL_CameraID devid, int *count);
+
+/**
+ * Get the human-readable device name for a camera.
+ *
+ * \param instance_id the camera device instance ID.
+ * \returns a human-readable device name or NULL on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetCameras
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraName(SDL_CameraID instance_id);
+
+/**
+ * Get the position of the camera in relation to the system.
+ *
+ * Most platforms will report UNKNOWN, but mobile devices, like phones, can
+ * often make a distinction between cameras on the front of the device (that
+ * points towards the user, for taking "selfies") and cameras on the back (for
+ * filming in the direction the user is facing).
+ *
+ * \param instance_id the camera device instance ID.
+ * \returns the position of the camera on the system hardware.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetCameras
+ */
+extern SDL_DECLSPEC SDL_CameraPosition SDLCALL SDL_GetCameraPosition(SDL_CameraID instance_id);
+
+/**
+ * Open a video recording device (a "camera").
+ *
+ * You can open the device with any reasonable spec, and if the hardware can't
+ * directly support it, it will convert data seamlessly to the requested
+ * format. This might incur overhead, including scaling of image data.
+ *
+ * If you would rather accept whatever format the device offers, you can pass
+ * a NULL spec here and it will choose one for you (and you can use
+ * SDL_Surface's conversion/scaling functions directly if necessary).
+ *
+ * You can call SDL_GetCameraFormat() to get the actual data format if passing
+ * a NULL spec here. You can see the exact specs a device can support without
+ * conversion with SDL_GetCameraSupportedSpecs().
+ *
+ * SDL will not attempt to emulate framerate; it will try to set the hardware
+ * to the rate closest to the requested speed, but it won't attempt to limit
+ * or duplicate frames artificially; call SDL_GetCameraFormat() to see the
+ * actual framerate of the opened the device, and check your timestamps if
+ * this is crucial to your app!
+ *
+ * Note that the camera is not usable until the user approves its use! On some
+ * platforms, the operating system will prompt the user to permit access to
+ * the camera, and they can choose Yes or No at that point. Until they do, the
+ * camera will not be usable. The app should either wait for an
+ * SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event,
+ * or poll SDL_IsCameraApproved() occasionally until it returns non-zero. On
+ * platforms that don't require explicit user approval (and perhaps in places
+ * where the user previously permitted access), the approval event might come
+ * immediately, but it might come seconds, minutes, or hours later!
+ *
+ * \param instance_id the camera device instance ID.
+ * \param spec the desired format for data the device will provide. Can be
+ * NULL.
+ * \returns an SDL_Camera object or NULL on failure; call SDL_GetError() for
+ * more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetCameras
+ * \sa SDL_GetCameraFormat
+ */
+extern SDL_DECLSPEC SDL_Camera * SDLCALL SDL_OpenCamera(SDL_CameraID instance_id, const SDL_CameraSpec *spec);
+
+/**
+ * Query if camera access has been approved by the user.
+ *
+ * Cameras will not function between when the device is opened by the app and
+ * when the user permits access to the hardware. On some platforms, this
+ * presents as a popup dialog where the user has to explicitly approve access;
+ * on others the approval might be implicit and not alert the user at all.
+ *
+ * This function can be used to check the status of that approval. It will
+ * return 0 if still waiting for user response, 1 if the camera is approved
+ * for use, and -1 if the user denied access.
+ *
+ * Instead of polling with this function, you can wait for a
+ * SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event
+ * in the standard SDL event loop, which is guaranteed to be sent once when
+ * permission to use the camera is decided.
+ *
+ * If a camera is declined, there's nothing to be done but call
+ * SDL_CloseCamera() to dispose of it.
+ *
+ * \param camera the opened camera device to query.
+ * \returns -1 if user denied access to the camera, 1 if user approved access,
+ * 0 if no decision has been made yet.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenCamera
+ * \sa SDL_CloseCamera
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetCameraPermissionState(SDL_Camera *camera);
+
+/**
+ * Get the instance ID of an opened camera.
+ *
+ * \param camera an SDL_Camera to query.
+ * \returns the instance ID of the specified camera on success or 0 on
+ * failure; call SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenCamera
+ */
+extern SDL_DECLSPEC SDL_CameraID SDLCALL SDL_GetCameraID(SDL_Camera *camera);
+
+/**
+ * Get the properties associated with an opened camera.
+ *
+ * \param camera the SDL_Camera obtained from SDL_OpenCamera().
+ * \returns a valid property ID on success or 0 on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetCameraProperties(SDL_Camera *camera);
+
+/**
+ * Get the spec that a camera is using when generating images.
+ *
+ * Note that this might not be the native format of the hardware, as SDL might
+ * be converting to this format behind the scenes.
+ *
+ * If the system is waiting for the user to approve access to the camera, as
+ * some platforms require, this will return -1, but this isn't necessarily a
+ * fatal error; you should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED
+ * (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll SDL_IsCameraApproved()
+ * occasionally until it returns non-zero.
+ *
+ * \param camera opened camera device.
+ * \param spec the SDL_CameraSpec to be initialized by this function.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenCamera
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetCameraFormat(SDL_Camera *camera, SDL_CameraSpec *spec);
+
+/**
+ * Acquire a frame.
+ *
+ * The frame is a memory pointer to the image data, whose size and format are
+ * given by the spec requested when opening the device.
+ *
+ * This is a non blocking API. If there is a frame available, a non-NULL
+ * surface is returned, and timestampNS will be filled with a non-zero value.
+ *
+ * Note that an error case can also return NULL, but a NULL by itself is
+ * normal and just signifies that a new frame is not yet available. Note that
+ * even if a camera device fails outright (a USB camera is unplugged while in
+ * use, etc), SDL will send an event separately to notify the app, but
+ * continue to provide blank frames at ongoing intervals until
+ * SDL_CloseCamera() is called, so real failure here is almost always an out
+ * of memory condition.
+ *
+ * After use, the frame should be released with SDL_ReleaseCameraFrame(). If
+ * you don't do this, the system may stop providing more video!
+ *
+ * Do not call SDL_FreeSurface() on the returned surface! It must be given
+ * back to the camera subsystem with SDL_ReleaseCameraFrame!
+ *
+ * If the system is waiting for the user to approve access to the camera, as
+ * some platforms require, this will return NULL (no frames available); you
+ * should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or
+ * SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll SDL_IsCameraApproved()
+ * occasionally until it returns non-zero.
+ *
+ * \param camera opened camera device.
+ * \param timestampNS a pointer filled in with the frame's timestamp, or 0 on
+ * error. Can be NULL.
+ * \returns a new frame of video on success, NULL if none is currently
+ * available.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_ReleaseCameraFrame
+ */
+extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_AcquireCameraFrame(SDL_Camera *camera, Uint64 *timestampNS);
+
+/**
+ * Release a frame of video acquired from a camera.
+ *
+ * Let the back-end re-use the internal buffer for camera.
+ *
+ * This function _must_ be called only on surface objects returned by
+ * SDL_AcquireCameraFrame(). This function should be called as quickly as
+ * possible after acquisition, as SDL keeps a small FIFO queue of surfaces for
+ * video frames; if surfaces aren't released in a timely manner, SDL may drop
+ * upcoming video frames from the camera.
+ *
+ * If the app needs to keep the surface for a significant time, they should
+ * make a copy of it and release the original.
+ *
+ * The app should not use the surface again after calling this function;
+ * assume the surface is freed and the pointer is invalid.
+ *
+ * \param camera opened camera device.
+ * \param frame the video frame surface to release.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AcquireCameraFrame
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_ReleaseCameraFrame(SDL_Camera *camera, SDL_Surface *frame);
+
+/**
+ * Use this function to shut down camera processing and close the camera
+ * device.
+ *
+ * \param camera opened camera device.
+ *
+ * \threadsafety It is safe to call this function from any thread, but no
+ * thread may reference `device` once this function is called.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenCameraWithSpec
+ * \sa SDL_OpenCamera
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_CloseCamera(SDL_Camera *camera);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_camera_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_clipboard.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_clipboard.h
new file mode 100644
index 0000000..ccd3201
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_clipboard.h
@@ -0,0 +1,250 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryClipboard
+ *
+ * SDL provides access to the system clipboard, both for reading information
+ * from other processes and publishing information of its own.
+ *
+ * This is not just text! SDL apps can access and publish data by mimetype.
+ */
+
+#ifndef SDL_clipboard_h_
+#define SDL_clipboard_h_
+
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Function prototypes */
+
+/**
+ * Put UTF-8 text into the clipboard.
+ *
+ * \param text the text to store in the clipboard.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetClipboardText
+ * \sa SDL_HasClipboardText
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetClipboardText(const char *text);
+
+/**
+ * Get UTF-8 text from the clipboard.
+ *
+ * This functions returns empty string if there was not enough memory left for
+ * a copy of the clipboard's content.
+ *
+ * \returns the clipboard text on success or an empty string on failure; call
+ * SDL_GetError() for more information. This should be freed with
+ * SDL_free() when it is no longer needed.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasClipboardText
+ * \sa SDL_SetClipboardText
+ */
+extern SDL_DECLSPEC char * SDLCALL SDL_GetClipboardText(void);
+
+/**
+ * Query whether the clipboard exists and contains a non-empty text string.
+ *
+ * \returns SDL_TRUE if the clipboard has text, or SDL_FALSE if it does not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetClipboardText
+ * \sa SDL_SetClipboardText
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasClipboardText(void);
+
+/**
+ * Put UTF-8 text into the primary selection.
+ *
+ * \param text the text to store in the primary selection.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetPrimarySelectionText
+ * \sa SDL_HasPrimarySelectionText
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetPrimarySelectionText(const char *text);
+
+/**
+ * Get UTF-8 text from the primary selection.
+ *
+ * This functions returns empty string if there was not enough memory left for
+ * a copy of the primary selection's content.
+ *
+ * \returns the primary selection text on success or an empty string on
+ * failure; call SDL_GetError() for more information. This should be
+ * freed with SDL_free() when it is no longer needed.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasPrimarySelectionText
+ * \sa SDL_SetPrimarySelectionText
+ */
+extern SDL_DECLSPEC char * SDLCALL SDL_GetPrimarySelectionText(void);
+
+/**
+ * Query whether the primary selection exists and contains a non-empty text
+ * string.
+ *
+ * \returns SDL_TRUE if the primary selection has text, or SDL_FALSE if it
+ * does not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetPrimarySelectionText
+ * \sa SDL_SetPrimarySelectionText
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasPrimarySelectionText(void);
+
+/**
+ * Callback function that will be called when data for the specified mime-type
+ * is requested by the OS.
+ *
+ * The callback function is called with NULL as the mime_type when the
+ * clipboard is cleared or new data is set. The clipboard is automatically
+ * cleared in SDL_Quit().
+ *
+ * \param userdata a pointer to provided user data.
+ * \param mime_type the requested mime-type.
+ * \param size a pointer filled in with the length of the returned data.
+ * \returns a pointer to the data for the provided mime-type. Returning NULL
+ * or setting length to 0 will cause no data to be sent to the
+ * "receiver". It is up to the receiver to handle this. Essentially
+ * returning no data is more or less undefined behavior and may cause
+ * breakage in receiving applications. The returned data will not be
+ * freed so it needs to be retained and dealt with internally.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetClipboardData
+ */
+typedef const void *(SDLCALL *SDL_ClipboardDataCallback)(void *userdata, const char *mime_type, size_t *size);
+
+/**
+ * Callback function that will be called when the clipboard is cleared, or new
+ * data is set.
+ *
+ * \param userdata a pointer to provided user data.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetClipboardData
+ */
+typedef void (SDLCALL *SDL_ClipboardCleanupCallback)(void *userdata);
+
+/**
+ * Offer clipboard data to the OS.
+ *
+ * Tell the operating system that the application is offering clipboard data
+ * for each of the proivded mime-types. Once another application requests the
+ * data the callback function will be called allowing it to generate and
+ * respond with the data for the requested mime-type.
+ *
+ * The size of text data does not include any terminator, and the text does
+ * not need to be null terminated (e.g. you can directly copy a portion of a
+ * document)
+ *
+ * \param callback a function pointer to the function that provides the
+ * clipboard data.
+ * \param cleanup a function pointer to the function that cleans up the
+ * clipboard data.
+ * \param userdata an opaque pointer that will be forwarded to the callbacks.
+ * \param mime_types a list of mime-types that are being offered.
+ * \param num_mime_types the number of mime-types in the mime_types list.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_ClearClipboardData
+ * \sa SDL_GetClipboardData
+ * \sa SDL_HasClipboardData
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetClipboardData(SDL_ClipboardDataCallback callback, SDL_ClipboardCleanupCallback cleanup, void *userdata, const char **mime_types, size_t num_mime_types);
+
+/**
+ * Clear the clipboard data.
+ *
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetClipboardData
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_ClearClipboardData(void);
+
+/**
+ * Get the data from clipboard for a given mime type.
+ *
+ * The size of text data does not include the terminator, but the text is
+ * guaranteed to be null terminated.
+ *
+ * \param mime_type the mime type to read from the clipboard.
+ * \param size a pointer filled in with the length of the returned data.
+ * \returns the retrieved data buffer or NULL on failure; call SDL_GetError()
+ * for more information. This should be freed with SDL_free() when it
+ * is no longer needed.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasClipboardData
+ * \sa SDL_SetClipboardData
+ */
+extern SDL_DECLSPEC void * SDLCALL SDL_GetClipboardData(const char *mime_type, size_t *size);
+
+/**
+ * Query whether there is data in the clipboard for the provided mime type.
+ *
+ * \param mime_type the mime type to check for data for.
+ * \returns SDL_TRUE if there exists data in clipboard for the provided mime
+ * type, SDL_FALSE if it does not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetClipboardData
+ * \sa SDL_GetClipboardData
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasClipboardData(const char *mime_type);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_clipboard_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_close_code.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_close_code.h
new file mode 100644
index 0000000..fa4d3d1
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_close_code.h
@@ -0,0 +1,38 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/*
+ * This file reverses the effects of SDL_begin_code.h and should be included
+ * after you finish any function and structure declarations in your headers
+ */
+
+#ifndef SDL_begin_code_h
+#error SDL_close_code.h included without matching SDL_begin_code.h
+#endif
+#undef SDL_begin_code_h
+
+/* Reset structure packing at previous byte alignment */
+#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__)
+#ifdef __BORLANDC__
+#pragma nopackwarning
+#endif
+#pragma pack(pop)
+#endif /* Compiler needs structure packing set */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_copying.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_copying.h
new file mode 100644
index 0000000..dcbdcea
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_copying.h
@@ -0,0 +1,22 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* Header file containing SDL's license. */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_cpuinfo.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_cpuinfo.h
new file mode 100644
index 0000000..e7ced26
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_cpuinfo.h
@@ -0,0 +1,313 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* WIKI CATEGORY: CPUInfo */
+
+/**
+ * # CategoryCPUInfo
+ *
+ * CPU feature detection for SDL.
+ *
+ * These functions are largely concerned with reporting if the system has
+ * access to various SIMD instruction sets, but also has other important info
+ * to share, such as system RAM size and number of logical CPU cores.
+ */
+
+#ifndef SDL_cpuinfo_h_
+#define SDL_cpuinfo_h_
+
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * A guess for the cacheline size used for padding.
+ *
+ * Most x86 processors have a 64 byte cache line. The 64-bit PowerPC
+ * processors have a 128 byte cache line. We use the larger value to be
+ * generally safe.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_CACHELINE_SIZE 128
+
+/**
+ * Get the number of CPU cores available.
+ *
+ * \returns the total number of logical CPU cores. On CPUs that include
+ * technologies such as hyperthreading, the number of logical cores
+ * may be more than the number of physical cores.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetCPUCount(void);
+
+/**
+ * Determine the L1 cache line size of the CPU.
+ *
+ * This is useful for determining multi-threaded structure padding or SIMD
+ * prefetch sizes.
+ *
+ * \returns the L1 cache line size of the CPU, in bytes.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void);
+
+/**
+ * Determine whether the CPU has AltiVec features.
+ *
+ * This always returns false on CPUs that aren't using PowerPC instruction
+ * sets.
+ *
+ * \returns SDL_TRUE if the CPU has AltiVec features or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void);
+
+/**
+ * Determine whether the CPU has MMX features.
+ *
+ * This always returns false on CPUs that aren't using Intel instruction sets.
+ *
+ * \returns SDL_TRUE if the CPU has MMX features or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void);
+
+/**
+ * Determine whether the CPU has SSE features.
+ *
+ * This always returns false on CPUs that aren't using Intel instruction sets.
+ *
+ * \returns SDL_TRUE if the CPU has SSE features or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasSSE2
+ * \sa SDL_HasSSE3
+ * \sa SDL_HasSSE41
+ * \sa SDL_HasSSE42
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void);
+
+/**
+ * Determine whether the CPU has SSE2 features.
+ *
+ * This always returns false on CPUs that aren't using Intel instruction sets.
+ *
+ * \returns SDL_TRUE if the CPU has SSE2 features or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasSSE
+ * \sa SDL_HasSSE3
+ * \sa SDL_HasSSE41
+ * \sa SDL_HasSSE42
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void);
+
+/**
+ * Determine whether the CPU has SSE3 features.
+ *
+ * This always returns false on CPUs that aren't using Intel instruction sets.
+ *
+ * \returns SDL_TRUE if the CPU has SSE3 features or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasSSE
+ * \sa SDL_HasSSE2
+ * \sa SDL_HasSSE41
+ * \sa SDL_HasSSE42
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE3(void);
+
+/**
+ * Determine whether the CPU has SSE4.1 features.
+ *
+ * This always returns false on CPUs that aren't using Intel instruction sets.
+ *
+ * \returns SDL_TRUE if the CPU has SSE4.1 features or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasSSE
+ * \sa SDL_HasSSE2
+ * \sa SDL_HasSSE3
+ * \sa SDL_HasSSE42
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE41(void);
+
+/**
+ * Determine whether the CPU has SSE4.2 features.
+ *
+ * This always returns false on CPUs that aren't using Intel instruction sets.
+ *
+ * \returns SDL_TRUE if the CPU has SSE4.2 features or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasSSE
+ * \sa SDL_HasSSE2
+ * \sa SDL_HasSSE3
+ * \sa SDL_HasSSE41
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void);
+
+/**
+ * Determine whether the CPU has AVX features.
+ *
+ * This always returns false on CPUs that aren't using Intel instruction sets.
+ *
+ * \returns SDL_TRUE if the CPU has AVX features or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasAVX2
+ * \sa SDL_HasAVX512F
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasAVX(void);
+
+/**
+ * Determine whether the CPU has AVX2 features.
+ *
+ * This always returns false on CPUs that aren't using Intel instruction sets.
+ *
+ * \returns SDL_TRUE if the CPU has AVX2 features or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasAVX
+ * \sa SDL_HasAVX512F
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasAVX2(void);
+
+/**
+ * Determine whether the CPU has AVX-512F (foundation) features.
+ *
+ * This always returns false on CPUs that aren't using Intel instruction sets.
+ *
+ * \returns SDL_TRUE if the CPU has AVX-512F features or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasAVX
+ * \sa SDL_HasAVX2
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasAVX512F(void);
+
+/**
+ * Determine whether the CPU has ARM SIMD (ARMv6) features.
+ *
+ * This is different from ARM NEON, which is a different instruction set.
+ *
+ * This always returns false on CPUs that aren't using ARM instruction sets.
+ *
+ * \returns SDL_TRUE if the CPU has ARM SIMD features or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasNEON
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasARMSIMD(void);
+
+/**
+ * Determine whether the CPU has NEON (ARM SIMD) features.
+ *
+ * This always returns false on CPUs that aren't using ARM instruction sets.
+ *
+ * \returns SDL_TRUE if the CPU has ARM NEON features or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasNEON(void);
+
+/**
+ * Determine whether the CPU has LSX (LOONGARCH SIMD) features.
+ *
+ * This always returns false on CPUs that aren't using LOONGARCH instruction
+ * sets.
+ *
+ * \returns SDL_TRUE if the CPU has LOONGARCH LSX features or SDL_FALSE if
+ * not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasLSX(void);
+
+/**
+ * Determine whether the CPU has LASX (LOONGARCH SIMD) features.
+ *
+ * This always returns false on CPUs that aren't using LOONGARCH instruction
+ * sets.
+ *
+ * \returns SDL_TRUE if the CPU has LOONGARCH LASX features or SDL_FALSE if
+ * not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasLASX(void);
+
+/**
+ * Get the amount of RAM configured in the system.
+ *
+ * \returns the amount of RAM configured in the system in MiB.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetSystemRAM(void);
+
+/**
+ * Report the alignment this system needs for SIMD allocations.
+ *
+ * This will return the minimum number of bytes to which a pointer must be
+ * aligned to be compatible with SIMD instructions on the current machine. For
+ * example, if the machine supports SSE only, it will return 16, but if it
+ * supports AVX-512F, it'll return 64 (etc). This only reports values for
+ * instruction sets SDL knows about, so if your SDL build doesn't have
+ * SDL_HasAVX512F(), then it might return 16 for the SSE support it sees and
+ * not 64 for the AVX-512 instructions that exist but SDL doesn't know about.
+ * Plan accordingly.
+ *
+ * \returns the alignment in bytes needed for available, known SIMD
+ * instructions.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_aligned_alloc
+ * \sa SDL_aligned_free
+ */
+extern SDL_DECLSPEC size_t SDLCALL SDL_GetSIMDAlignment(void);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_cpuinfo_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_dialog.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_dialog.h
new file mode 100644
index 0000000..8a198a8
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_dialog.h
@@ -0,0 +1,264 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryDialog
+ *
+ * File dialog support.
+ */
+
+#ifndef SDL_dialog_h_
+#define SDL_dialog_h_
+
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * An entry for filters for file dialogs.
+ *
+ * `name` is a user-readable label for the filter (for example, "Office
+ * document").
+ *
+ * `pattern` is a semicolon-separated list of file extensions (for example,
+ * "doc;docx"). File extensions may only contain alphanumeric characters,
+ * hyphens, underscores and periods. Alternatively, the whole string can be a
+ * single asterisk ("*"), which serves as an "All files" filter.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_DialogFileCallback
+ * \sa SDL_ShowOpenFileDialog
+ * \sa SDL_ShowSaveFileDialog
+ * \sa SDL_ShowOpenFolderDialog
+ */
+typedef struct SDL_DialogFileFilter
+{
+ const char *name;
+ const char *pattern;
+} SDL_DialogFileFilter;
+
+/**
+ * Callback used by file dialog functions.
+ *
+ * The specific usage is described in each function.
+ *
+ * If `filelist` is:
+ *
+ * - NULL, an error occurred. Details can be obtained with SDL_GetError().
+ * - A pointer to NULL, the user either didn't choose any file or canceled the
+ * dialog.
+ * - A pointer to non-`NULL`, the user chose one or more files. The argument
+ * is a null-terminated list of pointers to C strings, each containing a
+ * path.
+ *
+ * The filelist argument does not need to be freed; it will automatically be
+ * freed when the callback returns.
+ *
+ * The filter argument is the index of the filter that was selected, or -1 if
+ * no filter was selected or if the platform or method doesn't support
+ * fetching the selected filter.
+ *
+ * \param userdata an app-provided pointer, for the callback's use.
+ * \param filelist the file(s) chosen by the user.
+ * \param filter index of the selected filter.
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ *
+ * \sa SDL_DialogFileFilter
+ * \sa SDL_ShowOpenFileDialog
+ * \sa SDL_ShowSaveFileDialog
+ * \sa SDL_ShowOpenFolderDialog
+ */
+typedef void (SDLCALL *SDL_DialogFileCallback)(void *userdata, const char * const *filelist, int filter);
+
+/**
+ * Displays a dialog that lets the user select a file on their filesystem.
+ *
+ * This function should only be invoked from the main thread.
+ *
+ * This is an asynchronous function; it will return immediately, and the
+ * result will be passed to the callback.
+ *
+ * The callback will be invoked with a null-terminated list of files the user
+ * chose. The list will be empty if the user canceled the dialog, and it will
+ * be NULL if an error occurred.
+ *
+ * Note that the callback may be called from a different thread than the one
+ * the function was invoked on.
+ *
+ * Depending on the platform, the user may be allowed to input paths that
+ * don't yet exist.
+ *
+ * On Linux, dialogs may require XDG Portals, which requires DBus, which
+ * requires an event-handling loop. Apps that do not use SDL to handle events
+ * should add a call to SDL_PumpEvents in their main loop.
+ *
+ * \param callback an SDL_DialogFileCallback to be invoked when the user
+ * selects a file and accepts, or cancels the dialog, or an
+ * error occurs. The first argument is a null-terminated list
+ * of C strings, representing the paths chosen by the user.
+ * The list will be empty if the user canceled the dialog, and
+ * it will be NULL if an error occurred. If an error occurred,
+ * it can be fetched with SDL_GetError(). The second argument
+ * is the userdata pointer passed to the function. The third
+ * argument is the index of the filter selected by the user,
+ * or one past the index of the last filter (therefore the
+ * index of the terminating NULL filter) if no filter was
+ * chosen, or -1 if the platform does not support detecting
+ * the selected filter.
+ * \param userdata an optional pointer to pass extra data to the callback when
+ * it will be invoked.
+ * \param window the window that the dialog should be modal for. May be NULL.
+ * Not all platforms support this option.
+ * \param filters a list of SDL_DialogFileFilter's. May be NULL. Not all
+ * platforms support this option, and platforms that do support
+ * it may allow the user to ignore the filters.
+ * \param nfilters the number of filters. Ignored if filters is NULL.
+ * \param default_location the default folder or file to start the dialog at.
+ * May be NULL. Not all platforms support this option.
+ * \param allow_many if non-zero, the user will be allowed to select multiple
+ * entries. Not all platforms support this option.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_DialogFileCallback
+ * \sa SDL_DialogFileFilter
+ * \sa SDL_ShowSaveFileDialog
+ * \sa SDL_ShowOpenFolderDialog
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFileDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const SDL_DialogFileFilter *filters, int nfilters, const char *default_location, SDL_bool allow_many);
+
+/**
+ * Displays a dialog that lets the user choose a new or existing file on their
+ * filesystem.
+ *
+ * This function should only be invoked from the main thread.
+ *
+ * This is an asynchronous function; it will return immediately, and the
+ * result will be passed to the callback.
+ *
+ * The callback will be invoked with a null-terminated list of files the user
+ * chose. The list will be empty if the user canceled the dialog, and it will
+ * be NULL if an error occurred.
+ *
+ * Note that the callback may be called from a different thread than the one
+ * the function was invoked on.
+ *
+ * The chosen file may or may not already exist.
+ *
+ * On Linux, dialogs may require XDG Portals, which requires DBus, which
+ * requires an event-handling loop. Apps that do not use SDL to handle events
+ * should add a call to SDL_PumpEvents in their main loop.
+ *
+ * \param callback an SDL_DialogFileCallback to be invoked when the user
+ * selects a file and accepts, or cancels the dialog, or an
+ * error occurs. The first argument is a null-terminated list
+ * of C strings, representing the paths chosen by the user.
+ * The list will be empty if the user canceled the dialog, and
+ * it will be NULL if an error occurred. If an error occurred,
+ * it can be fetched with SDL_GetError(). The second argument
+ * is the userdata pointer passed to the function. The third
+ * argument is the index of the filter selected by the user,
+ * or one past the index of the last filter (therefore the
+ * index of the terminating NULL filter) if no filter was
+ * chosen, or -1 if the platform does not support detecting
+ * the selected filter.
+ * \param userdata an optional pointer to pass extra data to the callback when
+ * it will be invoked.
+ * \param window the window that the dialog should be modal for. May be NULL.
+ * Not all platforms support this option.
+ * \param filters a list of SDL_DialogFileFilter's. May be NULL. Not all
+ * platforms support this option, and platforms that do support
+ * it may allow the user to ignore the filters.
+ * \param nfilters the number of filters. Ignored if filters is NULL.
+ * \param default_location the default folder or file to start the dialog at.
+ * May be NULL. Not all platforms support this option.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_DialogFileCallback
+ * \sa SDL_DialogFileFilter
+ * \sa SDL_ShowOpenFileDialog
+ * \sa SDL_ShowOpenFolderDialog
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_ShowSaveFileDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const SDL_DialogFileFilter *filters, int nfilters, const char *default_location);
+
+/**
+ * Displays a dialog that lets the user select a folder on their filesystem.
+ *
+ * This function should only be invoked from the main thread.
+ *
+ * This is an asynchronous function; it will return immediately, and the
+ * result will be passed to the callback.
+ *
+ * The callback will be invoked with a null-terminated list of files the user
+ * chose. The list will be empty if the user canceled the dialog, and it will
+ * be NULL if an error occurred.
+ *
+ * Note that the callback may be called from a different thread than the one
+ * the function was invoked on.
+ *
+ * Depending on the platform, the user may be allowed to input paths that
+ * don't yet exist.
+ *
+ * On Linux, dialogs may require XDG Portals, which requires DBus, which
+ * requires an event-handling loop. Apps that do not use SDL to handle events
+ * should add a call to SDL_PumpEvents in their main loop.
+ *
+ * \param callback an SDL_DialogFileCallback to be invoked when the user
+ * selects a file and accepts, or cancels the dialog, or an
+ * error occurs. The first argument is a null-terminated list
+ * of C strings, representing the paths chosen by the user.
+ * The list will be empty if the user canceled the dialog, and
+ * it will be NULL if an error occurred. If an error occurred,
+ * it can be fetched with SDL_GetError(). The second argument
+ * is the userdata pointer passed to the function. The third
+ * argument is always -1 for SDL_ShowOpenFolderDialog.
+ * \param userdata an optional pointer to pass extra data to the callback when
+ * it will be invoked.
+ * \param window the window that the dialog should be modal for. May be NULL.
+ * Not all platforms support this option.
+ * \param default_location the default folder or file to start the dialog at.
+ * May be NULL. Not all platforms support this option.
+ * \param allow_many if non-zero, the user will be allowed to select multiple
+ * entries. Not all platforms support this option.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_DialogFileCallback
+ * \sa SDL_ShowOpenFileDialog
+ * \sa SDL_ShowSaveFileDialog
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFolderDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const char *default_location, SDL_bool allow_many);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_joystick_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_egl.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_egl.h
new file mode 100644
index 0000000..cc557d6
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_egl.h
@@ -0,0 +1,2355 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/*
+ * This is a simple file to encapsulate the EGL API headers.
+ */
+
+#include
+
+#if !defined(_MSC_VER) && !defined(SDL_PLATFORM_ANDROID) && !defined(SDL_USE_BUILTIN_OPENGL_DEFINITIONS)
+
+#if defined(SDL_PLATFORM_VITA)
+#include
+#include
+#include
+#endif
+
+#include
+#include
+
+#else /* _MSC_VER */
+
+/* EGL headers for Visual Studio */
+
+#ifndef __khrplatform_h_
+#define __khrplatform_h_
+
+/*
+** Copyright (c) 2008-2018 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+/* Khronos platform-specific types and definitions.
+ *
+ * The master copy of khrplatform.h is maintained in the Khronos EGL
+ * Registry repository at https://github.com/KhronosGroup/EGL-Registry
+ * The last semantic modification to khrplatform.h was at commit ID:
+ * 67a3e0864c2d75ea5287b9f3d2eb74a745936692
+ *
+ * Adopters may modify this file to suit their platform. Adopters are
+ * encouraged to submit platform specific modifications to the Khronos
+ * group so that they can be included in future versions of this file.
+ * Please submit changes by filing pull requests or issues on
+ * the EGL Registry repository linked above.
+ *
+ *
+ * See the Implementer's Guidelines for information about where this file
+ * should be located on your system and for more details of its use:
+ * http://www.khronos.org/registry/implementers_guide.pdf
+ *
+ * This file should be included as
+ * #include
+ * by Khronos client API header files that use its types and defines.
+ *
+ * The types in khrplatform.h should only be used to define API-specific types.
+ *
+ * Types defined in khrplatform.h:
+ * khronos_int8_t signed 8 bit
+ * khronos_uint8_t unsigned 8 bit
+ * khronos_int16_t signed 16 bit
+ * khronos_uint16_t unsigned 16 bit
+ * khronos_int32_t signed 32 bit
+ * khronos_uint32_t unsigned 32 bit
+ * khronos_int64_t signed 64 bit
+ * khronos_uint64_t unsigned 64 bit
+ * khronos_intptr_t signed same number of bits as a pointer
+ * khronos_uintptr_t unsigned same number of bits as a pointer
+ * khronos_ssize_t signed size
+ * khronos_usize_t unsigned size
+ * khronos_float_t signed 32 bit floating point
+ * khronos_time_ns_t unsigned 64 bit time in nanoseconds
+ * khronos_utime_nanoseconds_t unsigned time interval or absolute time in
+ * nanoseconds
+ * khronos_stime_nanoseconds_t signed time interval in nanoseconds
+ * khronos_boolean_enum_t enumerated boolean type. This should
+ * only be used as a base type when a client API's boolean type is
+ * an enum. Client APIs which use an integer or other type for
+ * booleans cannot use this as the base type for their boolean.
+ *
+ * Tokens defined in khrplatform.h:
+ *
+ * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
+ *
+ * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
+ * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
+ *
+ * Calling convention macros defined in this file:
+ * KHRONOS_APICALL
+ * KHRONOS_APIENTRY
+ * KHRONOS_APIATTRIBUTES
+ *
+ * These may be used in function prototypes as:
+ *
+ * KHRONOS_APICALL void KHRONOS_APIENTRY funcname(
+ * int arg1,
+ * int arg2) KHRONOS_APIATTRIBUTES;
+ */
+
+#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC)
+# define KHRONOS_STATIC 1
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APICALL
+ *-------------------------------------------------------------------------
+ * This precedes the return type of the function in the function prototype.
+ */
+#if defined(KHRONOS_STATIC)
+ /* If the preprocessor constant KHRONOS_STATIC is defined, make the
+ * header compatible with static linking. */
+# define KHRONOS_APICALL
+#elif defined(_WIN32)
+# define KHRONOS_APICALL __declspec(dllimport)
+#elif defined (__SYMBIAN32__)
+# define KHRONOS_APICALL IMPORT_C
+#elif defined(__ANDROID__)
+# define KHRONOS_APICALL __attribute__((visibility("default")))
+#else
+# define KHRONOS_APICALL
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APIENTRY
+ *-------------------------------------------------------------------------
+ * This follows the return type of the function and precedes the function
+ * name in the function prototype.
+ */
+#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
+ /* Win32 but not WinCE */
+# define KHRONOS_APIENTRY __stdcall
+#else
+# define KHRONOS_APIENTRY
+#endif
+
+/*-------------------------------------------------------------------------
+ * Definition of KHRONOS_APIATTRIBUTES
+ *-------------------------------------------------------------------------
+ * This follows the closing parenthesis of the function prototype arguments.
+ */
+#if defined (__ARMCC_2__)
+#define KHRONOS_APIATTRIBUTES __softfp
+#else
+#define KHRONOS_APIATTRIBUTES
+#endif
+
+/*-------------------------------------------------------------------------
+ * basic type definitions
+ *-----------------------------------------------------------------------*/
+#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
+
+
+/*
+ * Using
+ */
+#include
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+/*
+ * To support platform where unsigned long cannot be used interchangeably with
+ * inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t.
+ * Ideally, we could just use (u)intptr_t everywhere, but this could result in
+ * ABI breakage if khronos_uintptr_t is changed from unsigned long to
+ * unsigned long long or similar (this results in different C++ name mangling).
+ * To avoid changes for existing platforms, we restrict usage of intptr_t to
+ * platforms where the size of a pointer is larger than the size of long.
+ */
+#if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__)
+#if __SIZEOF_POINTER__ > __SIZEOF_LONG__
+#define KHRONOS_USE_INTPTR_T
+#endif
+#endif
+
+#elif defined(__VMS ) || defined(__sgi)
+
+/*
+ * Using
+ */
+#include
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
+
+/*
+ * Win32
+ */
+typedef __int32 khronos_int32_t;
+typedef unsigned __int32 khronos_uint32_t;
+typedef __int64 khronos_int64_t;
+typedef unsigned __int64 khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif defined(__sun__) || defined(__digital__)
+
+/*
+ * Sun or Digital
+ */
+typedef int khronos_int32_t;
+typedef unsigned int khronos_uint32_t;
+#if defined(__arch64__) || defined(_LP64)
+typedef long int khronos_int64_t;
+typedef unsigned long int khronos_uint64_t;
+#else
+typedef long long int khronos_int64_t;
+typedef unsigned long long int khronos_uint64_t;
+#endif /* __arch64__ */
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#elif 0
+
+/*
+ * Hypothetical platform with no float or int64 support
+ */
+typedef int khronos_int32_t;
+typedef unsigned int khronos_uint32_t;
+#define KHRONOS_SUPPORT_INT64 0
+#define KHRONOS_SUPPORT_FLOAT 0
+
+#else
+
+/*
+ * Generic fallback
+ */
+#include
+typedef int32_t khronos_int32_t;
+typedef uint32_t khronos_uint32_t;
+typedef int64_t khronos_int64_t;
+typedef uint64_t khronos_uint64_t;
+#define KHRONOS_SUPPORT_INT64 1
+#define KHRONOS_SUPPORT_FLOAT 1
+
+#endif
+
+
+/*
+ * Types that are (so far) the same on all platforms
+ */
+typedef signed char khronos_int8_t;
+typedef unsigned char khronos_uint8_t;
+typedef signed short int khronos_int16_t;
+typedef unsigned short int khronos_uint16_t;
+
+/*
+ * Types that differ between LLP64 and LP64 architectures - in LLP64,
+ * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears
+ * to be the only LLP64 architecture in current use.
+ */
+#ifdef KHRONOS_USE_INTPTR_T
+typedef intptr_t khronos_intptr_t;
+typedef uintptr_t khronos_uintptr_t;
+#elif defined(_WIN64)
+typedef signed long long int khronos_intptr_t;
+typedef unsigned long long int khronos_uintptr_t;
+#else
+typedef signed long int khronos_intptr_t;
+typedef unsigned long int khronos_uintptr_t;
+#endif
+
+#if defined(_WIN64)
+typedef signed long long int khronos_ssize_t;
+typedef unsigned long long int khronos_usize_t;
+#else
+typedef signed long int khronos_ssize_t;
+typedef unsigned long int khronos_usize_t;
+#endif
+
+#if KHRONOS_SUPPORT_FLOAT
+/*
+ * Float type
+ */
+typedef float khronos_float_t;
+#endif
+
+#if KHRONOS_SUPPORT_INT64
+/* Time types
+ *
+ * These types can be used to represent a time interval in nanoseconds or
+ * an absolute Unadjusted System Time. Unadjusted System Time is the number
+ * of nanoseconds since some arbitrary system event (e.g. since the last
+ * time the system booted). The Unadjusted System Time is an unsigned
+ * 64 bit value that wraps back to 0 every 584 years. Time intervals
+ * may be either signed or unsigned.
+ */
+typedef khronos_uint64_t khronos_utime_nanoseconds_t;
+typedef khronos_int64_t khronos_stime_nanoseconds_t;
+#endif
+
+/*
+ * Dummy value used to pad enum types to 32 bits.
+ */
+#ifndef KHRONOS_MAX_ENUM
+#define KHRONOS_MAX_ENUM 0x7FFFFFFF
+#endif
+
+/*
+ * Enumerated boolean type
+ *
+ * Values other than zero should be considered to be true. Therefore
+ * comparisons should not be made against KHRONOS_TRUE.
+ */
+typedef enum {
+ KHRONOS_FALSE = 0,
+ KHRONOS_TRUE = 1,
+ KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
+} khronos_boolean_enum_t;
+
+#endif /* __khrplatform_h_ */
+
+
+#ifndef __eglplatform_h_
+#define __eglplatform_h_
+
+/*
+** Copyright 2007-2020 The Khronos Group Inc.
+** SPDX-License-Identifier: Apache-2.0
+*/
+
+/* Platform-specific types and definitions for egl.h
+ *
+ * Adopters may modify khrplatform.h and this file to suit their platform.
+ * You are encouraged to submit all modifications to the Khronos group so that
+ * they can be included in future versions of this file. Please submit changes
+ * by filing an issue or pull request on the public Khronos EGL Registry, at
+ * https://www.github.com/KhronosGroup/EGL-Registry/
+ */
+
+/*#include */
+
+/* Macros used in EGL function prototype declarations.
+ *
+ * EGL functions should be prototyped as:
+ *
+ * EGLAPI return-type EGLAPIENTRY eglFunction(arguments);
+ * typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments);
+ *
+ * KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h
+ */
+
+#ifndef EGLAPI
+#define EGLAPI KHRONOS_APICALL
+#endif
+
+#ifndef EGLAPIENTRY
+#define EGLAPIENTRY KHRONOS_APIENTRY
+#endif
+#define EGLAPIENTRYP EGLAPIENTRY*
+
+/* The types NativeDisplayType, NativeWindowType, and NativePixmapType
+ * are aliases of window-system-dependent types, such as X Display * or
+ * Windows Device Context. They must be defined in platform-specific
+ * code below. The EGL-prefixed versions of Native*Type are the same
+ * types, renamed in EGL 1.3 so all types in the API start with "EGL".
+ *
+ * Khronos STRONGLY RECOMMENDS that you use the default definitions
+ * provided below, since these changes affect both binary and source
+ * portability of applications using EGL running on different EGL
+ * implementations.
+ */
+
+#if defined(EGL_NO_PLATFORM_SPECIFIC_TYPES)
+
+typedef void *EGLNativeDisplayType;
+typedef void *EGLNativePixmapType;
+typedef void *EGLNativeWindowType;
+
+#elif defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN 1
+#endif
+#include
+
+typedef HDC EGLNativeDisplayType;
+typedef HBITMAP EGLNativePixmapType;
+typedef HWND EGLNativeWindowType;
+
+#elif defined(SDL_PLATFORM_EMSCRIPTEN)
+
+typedef int EGLNativeDisplayType;
+typedef int EGLNativePixmapType;
+typedef int EGLNativeWindowType;
+
+#elif defined(__WINSCW__) || defined(__SYMBIAN32__) /* Symbian */
+
+typedef int EGLNativeDisplayType;
+typedef void *EGLNativePixmapType;
+typedef void *EGLNativeWindowType;
+
+#elif defined(WL_EGL_PLATFORM)
+
+typedef struct wl_display *EGLNativeDisplayType;
+typedef struct wl_egl_pixmap *EGLNativePixmapType;
+typedef struct wl_egl_window *EGLNativeWindowType;
+
+#elif defined(__GBM__)
+
+typedef struct gbm_device *EGLNativeDisplayType;
+typedef struct gbm_bo *EGLNativePixmapType;
+typedef void *EGLNativeWindowType;
+
+#elif defined(__ANDROID__) || defined(ANDROID)
+
+struct ANativeWindow;
+struct egl_native_pixmap_t;
+
+typedef void* EGLNativeDisplayType;
+typedef struct egl_native_pixmap_t* EGLNativePixmapType;
+typedef struct ANativeWindow* EGLNativeWindowType;
+
+#elif defined(USE_OZONE)
+
+typedef intptr_t EGLNativeDisplayType;
+typedef intptr_t EGLNativePixmapType;
+typedef intptr_t EGLNativeWindowType;
+
+#elif defined(USE_X11)
+
+/* X11 (tentative) */
+#include
+#include
+
+typedef Display *EGLNativeDisplayType;
+typedef Pixmap EGLNativePixmapType;
+typedef Window EGLNativeWindowType;
+
+#elif defined(__unix__)
+
+typedef void *EGLNativeDisplayType;
+typedef khronos_uintptr_t EGLNativePixmapType;
+typedef khronos_uintptr_t EGLNativeWindowType;
+
+#elif defined(__APPLE__)
+
+typedef int EGLNativeDisplayType;
+typedef void *EGLNativePixmapType;
+typedef void *EGLNativeWindowType;
+
+#elif defined(__HAIKU__)
+
+#include
+
+typedef void *EGLNativeDisplayType;
+typedef khronos_uintptr_t EGLNativePixmapType;
+typedef khronos_uintptr_t EGLNativeWindowType;
+
+#elif defined(__Fuchsia__)
+
+typedef void *EGLNativeDisplayType;
+typedef khronos_uintptr_t EGLNativePixmapType;
+typedef khronos_uintptr_t EGLNativeWindowType;
+
+#else
+#error "Platform not recognized"
+#endif
+
+/* EGL 1.2 types, renamed for consistency in EGL 1.3 */
+typedef EGLNativeDisplayType NativeDisplayType;
+typedef EGLNativePixmapType NativePixmapType;
+typedef EGLNativeWindowType NativeWindowType;
+
+
+/* Define EGLint. This must be a signed integral type large enough to contain
+ * all legal attribute names and values passed into and out of EGL, whether
+ * their type is boolean, bitmask, enumerant (symbolic constant), integer,
+ * handle, or other. While in general a 32-bit integer will suffice, if
+ * handles are 64 bit types, then EGLint should be defined as a signed 64-bit
+ * integer type.
+ */
+typedef khronos_int32_t EGLint;
+
+
+/* C++ / C typecast macros for special EGL handle values */
+#if defined(__cplusplus)
+#define EGL_CAST(type, value) (static_cast(value))
+#else
+#define EGL_CAST(type, value) ((type) (value))
+#endif
+
+#endif /* __eglplatform_h */
+
+
+#ifndef __egl_h_
+#define __egl_h_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright 2013-2020 The Khronos Group Inc.
+** SPDX-License-Identifier: Apache-2.0
+**
+** This header is generated from the Khronos EGL XML API Registry.
+** The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+** http://www.khronos.org/registry/egl
+**
+** Khronos $Git commit SHA1: 6fb1daea15 $ on $Git commit date: 2022-05-25 09:41:13 -0600 $
+*/
+
+/*#include */
+
+#ifndef EGL_EGL_PROTOTYPES
+#define EGL_EGL_PROTOTYPES 1
+#endif
+
+/* Generated on date 20220525 */
+
+/* Generated C header for:
+ * API: egl
+ * Versions considered: .*
+ * Versions emitted: .*
+ * Default extensions included: None
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
+
+#ifndef EGL_VERSION_1_0
+#define EGL_VERSION_1_0 1
+typedef unsigned int EGLBoolean;
+typedef void *EGLDisplay;
+/*#include */
+/*#include */
+typedef void *EGLConfig;
+typedef void *EGLSurface;
+typedef void *EGLContext;
+typedef void (*__eglMustCastToProperFunctionPointerType)(void);
+#define EGL_ALPHA_SIZE 0x3021
+#define EGL_BAD_ACCESS 0x3002
+#define EGL_BAD_ALLOC 0x3003
+#define EGL_BAD_ATTRIBUTE 0x3004
+#define EGL_BAD_CONFIG 0x3005
+#define EGL_BAD_CONTEXT 0x3006
+#define EGL_BAD_CURRENT_SURFACE 0x3007
+#define EGL_BAD_DISPLAY 0x3008
+#define EGL_BAD_MATCH 0x3009
+#define EGL_BAD_NATIVE_PIXMAP 0x300A
+#define EGL_BAD_NATIVE_WINDOW 0x300B
+#define EGL_BAD_PARAMETER 0x300C
+#define EGL_BAD_SURFACE 0x300D
+#define EGL_BLUE_SIZE 0x3022
+#define EGL_BUFFER_SIZE 0x3020
+#define EGL_CONFIG_CAVEAT 0x3027
+#define EGL_CONFIG_ID 0x3028
+#define EGL_CORE_NATIVE_ENGINE 0x305B
+#define EGL_DEPTH_SIZE 0x3025
+#define EGL_DONT_CARE EGL_CAST(EGLint,-1)
+#define EGL_DRAW 0x3059
+#define EGL_EXTENSIONS 0x3055
+#define EGL_FALSE 0
+#define EGL_GREEN_SIZE 0x3023
+#define EGL_HEIGHT 0x3056
+#define EGL_LARGEST_PBUFFER 0x3058
+#define EGL_LEVEL 0x3029
+#define EGL_MAX_PBUFFER_HEIGHT 0x302A
+#define EGL_MAX_PBUFFER_PIXELS 0x302B
+#define EGL_MAX_PBUFFER_WIDTH 0x302C
+#define EGL_NATIVE_RENDERABLE 0x302D
+#define EGL_NATIVE_VISUAL_ID 0x302E
+#define EGL_NATIVE_VISUAL_TYPE 0x302F
+#define EGL_NONE 0x3038
+#define EGL_NON_CONFORMANT_CONFIG 0x3051
+#define EGL_NOT_INITIALIZED 0x3001
+#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0)
+#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0)
+#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0)
+#define EGL_PBUFFER_BIT 0x0001
+#define EGL_PIXMAP_BIT 0x0002
+#define EGL_READ 0x305A
+#define EGL_RED_SIZE 0x3024
+#define EGL_SAMPLES 0x3031
+#define EGL_SAMPLE_BUFFERS 0x3032
+#define EGL_SLOW_CONFIG 0x3050
+#define EGL_STENCIL_SIZE 0x3026
+#define EGL_SUCCESS 0x3000
+#define EGL_SURFACE_TYPE 0x3033
+#define EGL_TRANSPARENT_BLUE_VALUE 0x3035
+#define EGL_TRANSPARENT_GREEN_VALUE 0x3036
+#define EGL_TRANSPARENT_RED_VALUE 0x3037
+#define EGL_TRANSPARENT_RGB 0x3052
+#define EGL_TRANSPARENT_TYPE 0x3034
+#define EGL_TRUE 1
+#define EGL_VENDOR 0x3053
+#define EGL_VERSION 0x3054
+#define EGL_WIDTH 0x3057
+#define EGL_WINDOW_BIT 0x0004
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLCHOOSECONFIGPROC) (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOPYBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
+typedef EGLContext (EGLAPIENTRYP PFNEGLCREATECONTEXTPROC) (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERSURFACEPROC) (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);
+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGATTRIBPROC) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGSPROC) (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
+typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETCURRENTDISPLAYPROC) (void);
+typedef EGLSurface (EGLAPIENTRYP PFNEGLGETCURRENTSURFACEPROC) (EGLint readdraw);
+typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETDISPLAYPROC) (EGLNativeDisplayType display_id);
+typedef EGLint (EGLAPIENTRYP PFNEGLGETERRORPROC) (void);
+typedef __eglMustCastToProperFunctionPointerType (EGLAPIENTRYP PFNEGLGETPROCADDRESSPROC) (const char *procname);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLINITIALIZEPROC) (EGLDisplay dpy, EGLint *major, EGLint *minor);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLMAKECURRENTPROC) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
+typedef const char *(EGLAPIENTRYP PFNEGLQUERYSTRINGPROC) (EGLDisplay dpy, EGLint name);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLTERMINATEPROC) (EGLDisplay dpy);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITGLPROC) (void);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITNATIVEPROC) (EGLint engine);
+#if EGL_EGL_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
+EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
+EGLAPI EGLContext EGLAPIENTRY eglCreateContext (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);
+EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext (EGLDisplay dpy, EGLContext ctx);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface (EGLDisplay dpy, EGLSurface surface);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
+EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay (void);
+EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface (EGLint readdraw);
+EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay (EGLNativeDisplayType display_id);
+EGLAPI EGLint EGLAPIENTRY eglGetError (void);
+EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress (const char *procname);
+EGLAPI EGLBoolean EGLAPIENTRY eglInitialize (EGLDisplay dpy, EGLint *major, EGLint *minor);
+EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
+EGLAPI const char *EGLAPIENTRY eglQueryString (EGLDisplay dpy, EGLint name);
+EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers (EGLDisplay dpy, EGLSurface surface);
+EGLAPI EGLBoolean EGLAPIENTRY eglTerminate (EGLDisplay dpy);
+EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL (void);
+EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative (EGLint engine);
+#endif
+#endif /* EGL_VERSION_1_0 */
+
+#ifndef EGL_VERSION_1_1
+#define EGL_VERSION_1_1 1
+#define EGL_BACK_BUFFER 0x3084
+#define EGL_BIND_TO_TEXTURE_RGB 0x3039
+#define EGL_BIND_TO_TEXTURE_RGBA 0x303A
+#define EGL_CONTEXT_LOST 0x300E
+#define EGL_MIN_SWAP_INTERVAL 0x303B
+#define EGL_MAX_SWAP_INTERVAL 0x303C
+#define EGL_MIPMAP_TEXTURE 0x3082
+#define EGL_MIPMAP_LEVEL 0x3083
+#define EGL_NO_TEXTURE 0x305C
+#define EGL_TEXTURE_2D 0x305F
+#define EGL_TEXTURE_FORMAT 0x3080
+#define EGL_TEXTURE_RGB 0x305D
+#define EGL_TEXTURE_RGBA 0x305E
+#define EGL_TEXTURE_TARGET 0x3081
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDTEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASETEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSURFACEATTRIBPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPINTERVALPROC) (EGLDisplay dpy, EGLint interval);
+#if EGL_EGL_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer);
+EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer);
+EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval (EGLDisplay dpy, EGLint interval);
+#endif
+#endif /* EGL_VERSION_1_1 */
+
+#ifndef EGL_VERSION_1_2
+#define EGL_VERSION_1_2 1
+typedef unsigned int EGLenum;
+typedef void *EGLClientBuffer;
+#define EGL_ALPHA_FORMAT 0x3088
+#define EGL_ALPHA_FORMAT_NONPRE 0x308B
+#define EGL_ALPHA_FORMAT_PRE 0x308C
+#define EGL_ALPHA_MASK_SIZE 0x303E
+#define EGL_BUFFER_PRESERVED 0x3094
+#define EGL_BUFFER_DESTROYED 0x3095
+#define EGL_CLIENT_APIS 0x308D
+#define EGL_COLORSPACE 0x3087
+#define EGL_COLORSPACE_sRGB 0x3089
+#define EGL_COLORSPACE_LINEAR 0x308A
+#define EGL_COLOR_BUFFER_TYPE 0x303F
+#define EGL_CONTEXT_CLIENT_TYPE 0x3097
+#define EGL_DISPLAY_SCALING 10000
+#define EGL_HORIZONTAL_RESOLUTION 0x3090
+#define EGL_LUMINANCE_BUFFER 0x308F
+#define EGL_LUMINANCE_SIZE 0x303D
+#define EGL_OPENGL_ES_BIT 0x0001
+#define EGL_OPENVG_BIT 0x0002
+#define EGL_OPENGL_ES_API 0x30A0
+#define EGL_OPENVG_API 0x30A1
+#define EGL_OPENVG_IMAGE 0x3096
+#define EGL_PIXEL_ASPECT_RATIO 0x3092
+#define EGL_RENDERABLE_TYPE 0x3040
+#define EGL_RENDER_BUFFER 0x3086
+#define EGL_RGB_BUFFER 0x308E
+#define EGL_SINGLE_BUFFER 0x3085
+#define EGL_SWAP_BEHAVIOR 0x3093
+#define EGL_UNKNOWN EGL_CAST(EGLint,-1)
+#define EGL_VERTICAL_RESOLUTION 0x3091
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDAPIPROC) (EGLenum api);
+typedef EGLenum (EGLAPIENTRYP PFNEGLQUERYAPIPROC) (void);
+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASETHREADPROC) (void);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITCLIENTPROC) (void);
+#if EGL_EGL_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI (EGLenum api);
+EGLAPI EGLenum EGLAPIENTRY eglQueryAPI (void);
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread (void);
+EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient (void);
+#endif
+#endif /* EGL_VERSION_1_2 */
+
+#ifndef EGL_VERSION_1_3
+#define EGL_VERSION_1_3 1
+#define EGL_CONFORMANT 0x3042
+#define EGL_CONTEXT_CLIENT_VERSION 0x3098
+#define EGL_MATCH_NATIVE_PIXMAP 0x3041
+#define EGL_OPENGL_ES2_BIT 0x0004
+#define EGL_VG_ALPHA_FORMAT 0x3088
+#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B
+#define EGL_VG_ALPHA_FORMAT_PRE 0x308C
+#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040
+#define EGL_VG_COLORSPACE 0x3087
+#define EGL_VG_COLORSPACE_sRGB 0x3089
+#define EGL_VG_COLORSPACE_LINEAR 0x308A
+#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020
+#endif /* EGL_VERSION_1_3 */
+
+#ifndef EGL_VERSION_1_4
+#define EGL_VERSION_1_4 1
+#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0)
+#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200
+#define EGL_MULTISAMPLE_RESOLVE 0x3099
+#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A
+#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B
+#define EGL_OPENGL_API 0x30A2
+#define EGL_OPENGL_BIT 0x0008
+#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400
+typedef EGLContext (EGLAPIENTRYP PFNEGLGETCURRENTCONTEXTPROC) (void);
+#if EGL_EGL_PROTOTYPES
+EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext (void);
+#endif
+#endif /* EGL_VERSION_1_4 */
+
+#ifndef EGL_VERSION_1_5
+#define EGL_VERSION_1_5 1
+typedef void *EGLSync;
+typedef intptr_t EGLAttrib;
+typedef khronos_utime_nanoseconds_t EGLTime;
+typedef void *EGLImage;
+#define EGL_CONTEXT_MAJOR_VERSION 0x3098
+#define EGL_CONTEXT_MINOR_VERSION 0x30FB
+#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD
+#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD
+#define EGL_NO_RESET_NOTIFICATION 0x31BE
+#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF
+#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001
+#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002
+#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0
+#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1
+#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2
+#define EGL_OPENGL_ES3_BIT 0x00000040
+#define EGL_CL_EVENT_HANDLE 0x309C
+#define EGL_SYNC_CL_EVENT 0x30FE
+#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF
+#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0
+#define EGL_SYNC_TYPE 0x30F7
+#define EGL_SYNC_STATUS 0x30F1
+#define EGL_SYNC_CONDITION 0x30F8
+#define EGL_SIGNALED 0x30F2
+#define EGL_UNSIGNALED 0x30F3
+#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001
+#define EGL_FOREVER 0xFFFFFFFFFFFFFFFFull
+#define EGL_TIMEOUT_EXPIRED 0x30F5
+#define EGL_CONDITION_SATISFIED 0x30F6
+#define EGL_NO_SYNC EGL_CAST(EGLSync,0)
+#define EGL_SYNC_FENCE 0x30F9
+#define EGL_GL_COLORSPACE 0x309D
+#define EGL_GL_COLORSPACE_SRGB 0x3089
+#define EGL_GL_COLORSPACE_LINEAR 0x308A
+#define EGL_GL_RENDERBUFFER 0x30B9
+#define EGL_GL_TEXTURE_2D 0x30B1
+#define EGL_GL_TEXTURE_LEVEL 0x30BC
+#define EGL_GL_TEXTURE_3D 0x30B2
+#define EGL_GL_TEXTURE_ZOFFSET 0x30BD
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8
+#define EGL_IMAGE_PRESERVED 0x30D2
+#define EGL_NO_IMAGE EGL_CAST(EGLImage,0)
+typedef EGLSync (EGLAPIENTRYP PFNEGLCREATESYNCPROC) (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCPROC) (EGLDisplay dpy, EGLSync sync);
+typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBPROC) (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value);
+typedef EGLImage (EGLAPIENTRYP PFNEGLCREATEIMAGEPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEPROC) (EGLDisplay dpy, EGLImage image);
+typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYPROC) (EGLenum platform, void *native_display, const EGLAttrib *attrib_list);
+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list);
+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags);
+#if EGL_EGL_PROTOTYPES
+EGLAPI EGLSync EGLAPIENTRY eglCreateSync (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroySync (EGLDisplay dpy, EGLSync sync);
+EGLAPI EGLint EGLAPIENTRY eglClientWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttrib (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value);
+EGLAPI EGLImage EGLAPIENTRY eglCreateImage (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImage (EGLDisplay dpy, EGLImage image);
+EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplay (EGLenum platform, void *native_display, const EGLAttrib *attrib_list);
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurface (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list);
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurface (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags);
+#endif
+#endif /* EGL_VERSION_1_5 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __egl_h_ */
+
+
+#ifndef __eglext_h_
+#define __eglext_h_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright 2013-2020 The Khronos Group Inc.
+** SPDX-License-Identifier: Apache-2.0
+**
+** This header is generated from the Khronos EGL XML API Registry.
+** The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+** http://www.khronos.org/registry/egl
+**
+** Khronos $Git commit SHA1: 6fb1daea15 $ on $Git commit date: 2022-05-25 09:41:13 -0600 $
+*/
+
+/*#include */
+
+#define EGL_EGLEXT_VERSION 20220525
+
+/* Generated C header for:
+ * API: egl
+ * Versions considered: .*
+ * Versions emitted: _nomatch_^
+ * Default extensions included: egl
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
+
+#ifndef EGL_KHR_cl_event
+#define EGL_KHR_cl_event 1
+#define EGL_CL_EVENT_HANDLE_KHR 0x309C
+#define EGL_SYNC_CL_EVENT_KHR 0x30FE
+#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF
+#endif /* EGL_KHR_cl_event */
+
+#ifndef EGL_KHR_cl_event2
+#define EGL_KHR_cl_event2 1
+typedef void *EGLSyncKHR;
+typedef intptr_t EGLAttribKHR;
+typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNC64KHRPROC) (EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSync64KHR (EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list);
+#endif
+#endif /* EGL_KHR_cl_event2 */
+
+#ifndef EGL_KHR_client_get_all_proc_addresses
+#define EGL_KHR_client_get_all_proc_addresses 1
+#endif /* EGL_KHR_client_get_all_proc_addresses */
+
+#ifndef EGL_KHR_config_attribs
+#define EGL_KHR_config_attribs 1
+#define EGL_CONFORMANT_KHR 0x3042
+#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020
+#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040
+#endif /* EGL_KHR_config_attribs */
+
+#ifndef EGL_KHR_context_flush_control
+#define EGL_KHR_context_flush_control 1
+#define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0
+#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097
+#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098
+#endif /* EGL_KHR_context_flush_control */
+
+#ifndef EGL_KHR_create_context
+#define EGL_KHR_create_context 1
+#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098
+#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB
+#define EGL_CONTEXT_FLAGS_KHR 0x30FC
+#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD
+#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD
+#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE
+#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF
+#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001
+#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002
+#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004
+#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001
+#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002
+#define EGL_OPENGL_ES3_BIT_KHR 0x00000040
+#endif /* EGL_KHR_create_context */
+
+#ifndef EGL_KHR_create_context_no_error
+#define EGL_KHR_create_context_no_error 1
+#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31B3
+#endif /* EGL_KHR_create_context_no_error */
+
+#ifndef EGL_KHR_debug
+#define EGL_KHR_debug 1
+typedef void *EGLLabelKHR;
+typedef void *EGLObjectKHR;
+typedef void (EGLAPIENTRY *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message);
+#define EGL_OBJECT_THREAD_KHR 0x33B0
+#define EGL_OBJECT_DISPLAY_KHR 0x33B1
+#define EGL_OBJECT_CONTEXT_KHR 0x33B2
+#define EGL_OBJECT_SURFACE_KHR 0x33B3
+#define EGL_OBJECT_IMAGE_KHR 0x33B4
+#define EGL_OBJECT_SYNC_KHR 0x33B5
+#define EGL_OBJECT_STREAM_KHR 0x33B6
+#define EGL_DEBUG_MSG_CRITICAL_KHR 0x33B9
+#define EGL_DEBUG_MSG_ERROR_KHR 0x33BA
+#define EGL_DEBUG_MSG_WARN_KHR 0x33BB
+#define EGL_DEBUG_MSG_INFO_KHR 0x33BC
+#define EGL_DEBUG_CALLBACK_KHR 0x33B8
+typedef EGLint (EGLAPIENTRYP PFNEGLDEBUGMESSAGECONTROLKHRPROC) (EGLDEBUGPROCKHR callback, const EGLAttrib *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEBUGKHRPROC) (EGLint attribute, EGLAttrib *value);
+typedef EGLint (EGLAPIENTRYP PFNEGLLABELOBJECTKHRPROC) (EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLint EGLAPIENTRY eglDebugMessageControlKHR (EGLDEBUGPROCKHR callback, const EGLAttrib *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryDebugKHR (EGLint attribute, EGLAttrib *value);
+EGLAPI EGLint EGLAPIENTRY eglLabelObjectKHR (EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label);
+#endif
+#endif /* EGL_KHR_debug */
+
+#ifndef EGL_KHR_display_reference
+#define EGL_KHR_display_reference 1
+#define EGL_TRACK_REFERENCES_KHR 0x3352
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBKHRPROC) (EGLDisplay dpy, EGLint name, EGLAttrib *value);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribKHR (EGLDisplay dpy, EGLint name, EGLAttrib *value);
+#endif
+#endif /* EGL_KHR_display_reference */
+
+#ifndef EGL_KHR_fence_sync
+#define EGL_KHR_fence_sync 1
+typedef khronos_utime_nanoseconds_t EGLTimeKHR;
+#ifdef KHRONOS_SUPPORT_INT64
+#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0
+#define EGL_SYNC_CONDITION_KHR 0x30F8
+#define EGL_SYNC_FENCE_KHR 0x30F9
+typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync);
+typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR (EGLDisplay dpy, EGLSyncKHR sync);
+EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
+#endif
+#endif /* KHRONOS_SUPPORT_INT64 */
+#endif /* EGL_KHR_fence_sync */
+
+#ifndef EGL_KHR_get_all_proc_addresses
+#define EGL_KHR_get_all_proc_addresses 1
+#endif /* EGL_KHR_get_all_proc_addresses */
+
+#ifndef EGL_KHR_gl_colorspace
+#define EGL_KHR_gl_colorspace 1
+#define EGL_GL_COLORSPACE_KHR 0x309D
+#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089
+#define EGL_GL_COLORSPACE_LINEAR_KHR 0x308A
+#endif /* EGL_KHR_gl_colorspace */
+
+#ifndef EGL_KHR_gl_renderbuffer_image
+#define EGL_KHR_gl_renderbuffer_image 1
+#define EGL_GL_RENDERBUFFER_KHR 0x30B9
+#endif /* EGL_KHR_gl_renderbuffer_image */
+
+#ifndef EGL_KHR_gl_texture_2D_image
+#define EGL_KHR_gl_texture_2D_image 1
+#define EGL_GL_TEXTURE_2D_KHR 0x30B1
+#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC
+#endif /* EGL_KHR_gl_texture_2D_image */
+
+#ifndef EGL_KHR_gl_texture_3D_image
+#define EGL_KHR_gl_texture_3D_image 1
+#define EGL_GL_TEXTURE_3D_KHR 0x30B2
+#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD
+#endif /* EGL_KHR_gl_texture_3D_image */
+
+#ifndef EGL_KHR_gl_texture_cubemap_image
+#define EGL_KHR_gl_texture_cubemap_image 1
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8
+#endif /* EGL_KHR_gl_texture_cubemap_image */
+
+#ifndef EGL_KHR_image
+#define EGL_KHR_image 1
+typedef void *EGLImageKHR;
+#define EGL_NATIVE_PIXMAP_KHR 0x30B0
+#define EGL_NO_IMAGE_KHR EGL_CAST(EGLImageKHR,0)
+typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR (EGLDisplay dpy, EGLImageKHR image);
+#endif
+#endif /* EGL_KHR_image */
+
+#ifndef EGL_KHR_image_base
+#define EGL_KHR_image_base 1
+#define EGL_IMAGE_PRESERVED_KHR 0x30D2
+#endif /* EGL_KHR_image_base */
+
+#ifndef EGL_KHR_image_pixmap
+#define EGL_KHR_image_pixmap 1
+#endif /* EGL_KHR_image_pixmap */
+
+#ifndef EGL_KHR_lock_surface
+#define EGL_KHR_lock_surface 1
+#define EGL_READ_SURFACE_BIT_KHR 0x0001
+#define EGL_WRITE_SURFACE_BIT_KHR 0x0002
+#define EGL_LOCK_SURFACE_BIT_KHR 0x0080
+#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100
+#define EGL_MATCH_FORMAT_KHR 0x3043
+#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0
+#define EGL_FORMAT_RGB_565_KHR 0x30C1
+#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2
+#define EGL_FORMAT_RGBA_8888_KHR 0x30C3
+#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4
+#define EGL_LOCK_USAGE_HINT_KHR 0x30C5
+#define EGL_BITMAP_POINTER_KHR 0x30C6
+#define EGL_BITMAP_PITCH_KHR 0x30C7
+#define EGL_BITMAP_ORIGIN_KHR 0x30C8
+#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9
+#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA
+#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB
+#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC
+#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD
+#define EGL_LOWER_LEFT_KHR 0x30CE
+#define EGL_UPPER_LEFT_KHR 0x30CF
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglLockSurfaceKHR (EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglUnlockSurfaceKHR (EGLDisplay dpy, EGLSurface surface);
+#endif
+#endif /* EGL_KHR_lock_surface */
+
+#ifndef EGL_KHR_lock_surface2
+#define EGL_KHR_lock_surface2 1
+#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110
+#endif /* EGL_KHR_lock_surface2 */
+
+#ifndef EGL_KHR_lock_surface3
+#define EGL_KHR_lock_surface3 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACE64KHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface64KHR (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value);
+#endif
+#endif /* EGL_KHR_lock_surface3 */
+
+#ifndef EGL_KHR_mutable_render_buffer
+#define EGL_KHR_mutable_render_buffer 1
+#define EGL_MUTABLE_RENDER_BUFFER_BIT_KHR 0x1000
+#endif /* EGL_KHR_mutable_render_buffer */
+
+#ifndef EGL_KHR_no_config_context
+#define EGL_KHR_no_config_context 1
+#define EGL_NO_CONFIG_KHR EGL_CAST(EGLConfig,0)
+#endif /* EGL_KHR_no_config_context */
+
+#ifndef EGL_KHR_partial_update
+#define EGL_KHR_partial_update 1
+#define EGL_BUFFER_AGE_KHR 0x313D
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETDAMAGEREGIONKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglSetDamageRegionKHR (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
+#endif
+#endif /* EGL_KHR_partial_update */
+
+#ifndef EGL_KHR_platform_android
+#define EGL_KHR_platform_android 1
+#define EGL_PLATFORM_ANDROID_KHR 0x3141
+#endif /* EGL_KHR_platform_android */
+
+#ifndef EGL_KHR_platform_gbm
+#define EGL_KHR_platform_gbm 1
+#define EGL_PLATFORM_GBM_KHR 0x31D7
+#endif /* EGL_KHR_platform_gbm */
+
+#ifndef EGL_KHR_platform_wayland
+#define EGL_KHR_platform_wayland 1
+#define EGL_PLATFORM_WAYLAND_KHR 0x31D8
+#endif /* EGL_KHR_platform_wayland */
+
+#ifndef EGL_KHR_platform_x11
+#define EGL_KHR_platform_x11 1
+#define EGL_PLATFORM_X11_KHR 0x31D5
+#define EGL_PLATFORM_X11_SCREEN_KHR 0x31D6
+#endif /* EGL_KHR_platform_x11 */
+
+#ifndef EGL_KHR_reusable_sync
+#define EGL_KHR_reusable_sync 1
+#ifdef KHRONOS_SUPPORT_INT64
+#define EGL_SYNC_STATUS_KHR 0x30F1
+#define EGL_SIGNALED_KHR 0x30F2
+#define EGL_UNSIGNALED_KHR 0x30F3
+#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5
+#define EGL_CONDITION_SATISFIED_KHR 0x30F6
+#define EGL_SYNC_TYPE_KHR 0x30F7
+#define EGL_SYNC_REUSABLE_KHR 0x30FA
+#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001
+#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFFull
+#define EGL_NO_SYNC_KHR EGL_CAST(EGLSyncKHR,0)
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);
+#endif
+#endif /* KHRONOS_SUPPORT_INT64 */
+#endif /* EGL_KHR_reusable_sync */
+
+#ifndef EGL_KHR_stream
+#define EGL_KHR_stream 1
+typedef void *EGLStreamKHR;
+typedef khronos_uint64_t EGLuint64KHR;
+#ifdef KHRONOS_SUPPORT_INT64
+#define EGL_NO_STREAM_KHR EGL_CAST(EGLStreamKHR,0)
+#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210
+#define EGL_PRODUCER_FRAME_KHR 0x3212
+#define EGL_CONSUMER_FRAME_KHR 0x3213
+#define EGL_STREAM_STATE_KHR 0x3214
+#define EGL_STREAM_STATE_CREATED_KHR 0x3215
+#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216
+#define EGL_STREAM_STATE_EMPTY_KHR 0x3217
+#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR 0x3218
+#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR 0x3219
+#define EGL_STREAM_STATE_DISCONNECTED_KHR 0x321A
+#define EGL_BAD_STREAM_KHR 0x321B
+#define EGL_BAD_STATE_KHR 0x321C
+typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMKHRPROC) (EGLDisplay dpy, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMU64KHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamKHR (EGLDisplay dpy, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroyStreamKHR (EGLDisplay dpy, EGLStreamKHR stream);
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value);
+#endif
+#endif /* KHRONOS_SUPPORT_INT64 */
+#endif /* EGL_KHR_stream */
+
+#ifndef EGL_KHR_stream_attrib
+#define EGL_KHR_stream_attrib 1
+#ifdef KHRONOS_SUPPORT_INT64
+typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMATTRIBKHRPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib *value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamAttribKHR (EGLDisplay dpy, const EGLAttrib *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglSetStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib value);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib *value);
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
+#endif
+#endif /* KHRONOS_SUPPORT_INT64 */
+#endif /* EGL_KHR_stream_attrib */
+
+#ifndef EGL_KHR_stream_consumer_gltexture
+#define EGL_KHR_stream_consumer_gltexture 1
+#ifdef EGL_KHR_stream
+#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR 0x321E
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalKHR (EGLDisplay dpy, EGLStreamKHR stream);
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireKHR (EGLDisplay dpy, EGLStreamKHR stream);
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseKHR (EGLDisplay dpy, EGLStreamKHR stream);
+#endif
+#endif /* EGL_KHR_stream */
+#endif /* EGL_KHR_stream_consumer_gltexture */
+
+#ifndef EGL_KHR_stream_cross_process_fd
+#define EGL_KHR_stream_cross_process_fd 1
+typedef int EGLNativeFileDescriptorKHR;
+#ifdef EGL_KHR_stream
+#define EGL_NO_FILE_DESCRIPTOR_KHR EGL_CAST(EGLNativeFileDescriptorKHR,-1)
+typedef EGLNativeFileDescriptorKHR (EGLAPIENTRYP PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);
+typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLNativeFileDescriptorKHR EGLAPIENTRY eglGetStreamFileDescriptorKHR (EGLDisplay dpy, EGLStreamKHR stream);
+EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamFromFileDescriptorKHR (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor);
+#endif
+#endif /* EGL_KHR_stream */
+#endif /* EGL_KHR_stream_cross_process_fd */
+
+#ifndef EGL_KHR_stream_fifo
+#define EGL_KHR_stream_fifo 1
+#ifdef EGL_KHR_stream
+#define EGL_STREAM_FIFO_LENGTH_KHR 0x31FC
+#define EGL_STREAM_TIME_NOW_KHR 0x31FD
+#define EGL_STREAM_TIME_CONSUMER_KHR 0x31FE
+#define EGL_STREAM_TIME_PRODUCER_KHR 0x31FF
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMTIMEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamTimeKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value);
+#endif
+#endif /* EGL_KHR_stream */
+#endif /* EGL_KHR_stream_fifo */
+
+#ifndef EGL_KHR_stream_producer_aldatalocator
+#define EGL_KHR_stream_producer_aldatalocator 1
+#ifdef EGL_KHR_stream
+#endif /* EGL_KHR_stream */
+#endif /* EGL_KHR_stream_producer_aldatalocator */
+
+#ifndef EGL_KHR_stream_producer_eglsurface
+#define EGL_KHR_stream_producer_eglsurface 1
+#ifdef EGL_KHR_stream
+#define EGL_STREAM_BIT_KHR 0x0800
+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC) (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLSurface EGLAPIENTRY eglCreateStreamProducerSurfaceKHR (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list);
+#endif
+#endif /* EGL_KHR_stream */
+#endif /* EGL_KHR_stream_producer_eglsurface */
+
+#ifndef EGL_KHR_surfaceless_context
+#define EGL_KHR_surfaceless_context 1
+#endif /* EGL_KHR_surfaceless_context */
+
+#ifndef EGL_KHR_swap_buffers_with_damage
+#define EGL_KHR_swap_buffers_with_damage 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageKHR (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects);
+#endif
+#endif /* EGL_KHR_swap_buffers_with_damage */
+
+#ifndef EGL_KHR_vg_parent_image
+#define EGL_KHR_vg_parent_image 1
+#define EGL_VG_PARENT_IMAGE_KHR 0x30BA
+#endif /* EGL_KHR_vg_parent_image */
+
+#ifndef EGL_KHR_wait_sync
+#define EGL_KHR_wait_sync 1
+typedef EGLint (EGLAPIENTRYP PFNEGLWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLint EGLAPIENTRY eglWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags);
+#endif
+#endif /* EGL_KHR_wait_sync */
+
+#ifndef EGL_ANDROID_GLES_layers
+#define EGL_ANDROID_GLES_layers 1
+#endif /* EGL_ANDROID_GLES_layers */
+
+#ifndef EGL_ANDROID_blob_cache
+#define EGL_ANDROID_blob_cache 1
+typedef khronos_ssize_t EGLsizeiANDROID;
+typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize);
+typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize);
+typedef void (EGLAPIENTRYP PFNEGLSETBLOBCACHEFUNCSANDROIDPROC) (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI void EGLAPIENTRY eglSetBlobCacheFuncsANDROID (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get);
+#endif
+#endif /* EGL_ANDROID_blob_cache */
+
+#ifndef EGL_ANDROID_create_native_client_buffer
+#define EGL_ANDROID_create_native_client_buffer 1
+#define EGL_NATIVE_BUFFER_USAGE_ANDROID 0x3143
+#define EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID 0x00000001
+#define EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID 0x00000002
+#define EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID 0x00000004
+typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC) (const EGLint *attrib_list);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLClientBuffer EGLAPIENTRY eglCreateNativeClientBufferANDROID (const EGLint *attrib_list);
+#endif
+#endif /* EGL_ANDROID_create_native_client_buffer */
+
+#ifndef EGL_ANDROID_framebuffer_target
+#define EGL_ANDROID_framebuffer_target 1
+#define EGL_FRAMEBUFFER_TARGET_ANDROID 0x3147
+#endif /* EGL_ANDROID_framebuffer_target */
+
+#ifndef EGL_ANDROID_front_buffer_auto_refresh
+#define EGL_ANDROID_front_buffer_auto_refresh 1
+#define EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID 0x314C
+#endif /* EGL_ANDROID_front_buffer_auto_refresh */
+
+#ifndef EGL_ANDROID_get_frame_timestamps
+#define EGL_ANDROID_get_frame_timestamps 1
+typedef khronos_stime_nanoseconds_t EGLnsecsANDROID;
+#define EGL_TIMESTAMP_PENDING_ANDROID EGL_CAST(EGLnsecsANDROID,-2)
+#define EGL_TIMESTAMP_INVALID_ANDROID EGL_CAST(EGLnsecsANDROID,-1)
+#define EGL_TIMESTAMPS_ANDROID 0x3430
+#define EGL_COMPOSITE_DEADLINE_ANDROID 0x3431
+#define EGL_COMPOSITE_INTERVAL_ANDROID 0x3432
+#define EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID 0x3433
+#define EGL_REQUESTED_PRESENT_TIME_ANDROID 0x3434
+#define EGL_RENDERING_COMPLETE_TIME_ANDROID 0x3435
+#define EGL_COMPOSITION_LATCH_TIME_ANDROID 0x3436
+#define EGL_FIRST_COMPOSITION_START_TIME_ANDROID 0x3437
+#define EGL_LAST_COMPOSITION_START_TIME_ANDROID 0x3438
+#define EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID 0x3439
+#define EGL_DISPLAY_PRESENT_TIME_ANDROID 0x343A
+#define EGL_DEQUEUE_READY_TIME_ANDROID 0x343B
+#define EGL_READS_DONE_TIME_ANDROID 0x343C
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCOMPOSITORTIMINGSUPPORTEDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint name);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCOMPOSITORTIMINGANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numTimestamps, const EGLint *names, EGLnsecsANDROID *values);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETNEXTFRAMEIDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR *frameId);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETFRAMETIMESTAMPSUPPORTEDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint timestamp);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETFRAMETIMESTAMPSANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR frameId, EGLint numTimestamps, const EGLint *timestamps, EGLnsecsANDROID *values);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglGetCompositorTimingSupportedANDROID (EGLDisplay dpy, EGLSurface surface, EGLint name);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetCompositorTimingANDROID (EGLDisplay dpy, EGLSurface surface, EGLint numTimestamps, const EGLint *names, EGLnsecsANDROID *values);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetNextFrameIdANDROID (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR *frameId);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetFrameTimestampSupportedANDROID (EGLDisplay dpy, EGLSurface surface, EGLint timestamp);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetFrameTimestampsANDROID (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR frameId, EGLint numTimestamps, const EGLint *timestamps, EGLnsecsANDROID *values);
+#endif
+#endif /* EGL_ANDROID_get_frame_timestamps */
+
+#ifndef EGL_ANDROID_get_native_client_buffer
+#define EGL_ANDROID_get_native_client_buffer 1
+struct AHardwareBuffer;
+typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLGETNATIVECLIENTBUFFERANDROIDPROC) (const struct AHardwareBuffer *buffer);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLClientBuffer EGLAPIENTRY eglGetNativeClientBufferANDROID (const struct AHardwareBuffer *buffer);
+#endif
+#endif /* EGL_ANDROID_get_native_client_buffer */
+
+#ifndef EGL_ANDROID_image_native_buffer
+#define EGL_ANDROID_image_native_buffer 1
+#define EGL_NATIVE_BUFFER_ANDROID 0x3140
+#endif /* EGL_ANDROID_image_native_buffer */
+
+#ifndef EGL_ANDROID_native_fence_sync
+#define EGL_ANDROID_native_fence_sync 1
+#define EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144
+#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID 0x3145
+#define EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID 0x3146
+#define EGL_NO_NATIVE_FENCE_FD_ANDROID -1
+typedef EGLint (EGLAPIENTRYP PFNEGLDUPNATIVEFENCEFDANDROIDPROC) (EGLDisplay dpy, EGLSyncKHR sync);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLint EGLAPIENTRY eglDupNativeFenceFDANDROID (EGLDisplay dpy, EGLSyncKHR sync);
+#endif
+#endif /* EGL_ANDROID_native_fence_sync */
+
+#ifndef EGL_ANDROID_presentation_time
+#define EGL_ANDROID_presentation_time 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLPRESENTATIONTIMEANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglPresentationTimeANDROID (EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time);
+#endif
+#endif /* EGL_ANDROID_presentation_time */
+
+#ifndef EGL_ANDROID_recordable
+#define EGL_ANDROID_recordable 1
+#define EGL_RECORDABLE_ANDROID 0x3142
+#endif /* EGL_ANDROID_recordable */
+
+#ifndef EGL_ANGLE_d3d_share_handle_client_buffer
+#define EGL_ANGLE_d3d_share_handle_client_buffer 1
+#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200
+#endif /* EGL_ANGLE_d3d_share_handle_client_buffer */
+
+#ifndef EGL_ANGLE_device_d3d
+#define EGL_ANGLE_device_d3d 1
+#define EGL_D3D9_DEVICE_ANGLE 0x33A0
+#define EGL_D3D11_DEVICE_ANGLE 0x33A1
+#endif /* EGL_ANGLE_device_d3d */
+
+#ifndef EGL_ANGLE_query_surface_pointer
+#define EGL_ANGLE_query_surface_pointer 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value);
+#endif
+#endif /* EGL_ANGLE_query_surface_pointer */
+
+#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle
+#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1
+#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */
+
+#ifndef EGL_ANGLE_sync_control_rate
+#define EGL_ANGLE_sync_control_rate 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETMSCRATEANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *numerator, EGLint *denominator);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglGetMscRateANGLE (EGLDisplay dpy, EGLSurface surface, EGLint *numerator, EGLint *denominator);
+#endif
+#endif /* EGL_ANGLE_sync_control_rate */
+
+#ifndef EGL_ANGLE_window_fixed_size
+#define EGL_ANGLE_window_fixed_size 1
+#define EGL_FIXED_SIZE_ANGLE 0x3201
+#endif /* EGL_ANGLE_window_fixed_size */
+
+#ifndef EGL_ARM_image_format
+#define EGL_ARM_image_format 1
+#define EGL_COLOR_COMPONENT_TYPE_UNSIGNED_INTEGER_ARM 0x3287
+#define EGL_COLOR_COMPONENT_TYPE_INTEGER_ARM 0x3288
+#endif /* EGL_ARM_image_format */
+
+#ifndef EGL_ARM_implicit_external_sync
+#define EGL_ARM_implicit_external_sync 1
+#define EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM 0x328A
+#endif /* EGL_ARM_implicit_external_sync */
+
+#ifndef EGL_ARM_pixmap_multisample_discard
+#define EGL_ARM_pixmap_multisample_discard 1
+#define EGL_DISCARD_SAMPLES_ARM 0x3286
+#endif /* EGL_ARM_pixmap_multisample_discard */
+
+#ifndef EGL_EXT_bind_to_front
+#define EGL_EXT_bind_to_front 1
+#define EGL_FRONT_BUFFER_EXT 0x3464
+#endif /* EGL_EXT_bind_to_front */
+
+#ifndef EGL_EXT_buffer_age
+#define EGL_EXT_buffer_age 1
+#define EGL_BUFFER_AGE_EXT 0x313D
+#endif /* EGL_EXT_buffer_age */
+
+#ifndef EGL_EXT_client_extensions
+#define EGL_EXT_client_extensions 1
+#endif /* EGL_EXT_client_extensions */
+
+#ifndef EGL_EXT_client_sync
+#define EGL_EXT_client_sync 1
+#define EGL_SYNC_CLIENT_EXT 0x3364
+#define EGL_SYNC_CLIENT_SIGNAL_EXT 0x3365
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLCLIENTSIGNALSYNCEXTPROC) (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglClientSignalSyncEXT (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list);
+#endif
+#endif /* EGL_EXT_client_sync */
+
+#ifndef EGL_EXT_compositor
+#define EGL_EXT_compositor 1
+#define EGL_PRIMARY_COMPOSITOR_CONTEXT_EXT 0x3460
+#define EGL_EXTERNAL_REF_ID_EXT 0x3461
+#define EGL_COMPOSITOR_DROP_NEWEST_FRAME_EXT 0x3462
+#define EGL_COMPOSITOR_KEEP_NEWEST_FRAME_EXT 0x3463
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETCONTEXTLISTEXTPROC) (const EGLint *external_ref_ids, EGLint num_entries);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETCONTEXTATTRIBUTESEXTPROC) (EGLint external_ref_id, const EGLint *context_attributes, EGLint num_entries);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETWINDOWLISTEXTPROC) (EGLint external_ref_id, const EGLint *external_win_ids, EGLint num_entries);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETWINDOWATTRIBUTESEXTPROC) (EGLint external_win_id, const EGLint *window_attributes, EGLint num_entries);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORBINDTEXWINDOWEXTPROC) (EGLint external_win_id);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETSIZEEXTPROC) (EGLint external_win_id, EGLint width, EGLint height);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSWAPPOLICYEXTPROC) (EGLint external_win_id, EGLint policy);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetContextListEXT (const EGLint *external_ref_ids, EGLint num_entries);
+EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetContextAttributesEXT (EGLint external_ref_id, const EGLint *context_attributes, EGLint num_entries);
+EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetWindowListEXT (EGLint external_ref_id, const EGLint *external_win_ids, EGLint num_entries);
+EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetWindowAttributesEXT (EGLint external_win_id, const EGLint *window_attributes, EGLint num_entries);
+EGLAPI EGLBoolean EGLAPIENTRY eglCompositorBindTexWindowEXT (EGLint external_win_id);
+EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetSizeEXT (EGLint external_win_id, EGLint width, EGLint height);
+EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSwapPolicyEXT (EGLint external_win_id, EGLint policy);
+#endif
+#endif /* EGL_EXT_compositor */
+
+#ifndef EGL_EXT_config_select_group
+#define EGL_EXT_config_select_group 1
+#define EGL_CONFIG_SELECT_GROUP_EXT 0x34C0
+#endif /* EGL_EXT_config_select_group */
+
+#ifndef EGL_EXT_create_context_robustness
+#define EGL_EXT_create_context_robustness 1
+#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT 0x30BF
+#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138
+#define EGL_NO_RESET_NOTIFICATION_EXT 0x31BE
+#define EGL_LOSE_CONTEXT_ON_RESET_EXT 0x31BF
+#endif /* EGL_EXT_create_context_robustness */
+
+#ifndef EGL_EXT_device_base
+#define EGL_EXT_device_base 1
+typedef void *EGLDeviceEXT;
+#define EGL_NO_DEVICE_EXT EGL_CAST(EGLDeviceEXT,0)
+#define EGL_BAD_DEVICE_EXT 0x322B
+#define EGL_DEVICE_EXT 0x322C
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICEATTRIBEXTPROC) (EGLDeviceEXT device, EGLint attribute, EGLAttrib *value);
+typedef const char *(EGLAPIENTRYP PFNEGLQUERYDEVICESTRINGEXTPROC) (EGLDeviceEXT device, EGLint name);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICESEXTPROC) (EGLint max_devices, EGLDeviceEXT *devices, EGLint *num_devices);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBEXTPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib *value);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryDeviceAttribEXT (EGLDeviceEXT device, EGLint attribute, EGLAttrib *value);
+EGLAPI const char *EGLAPIENTRY eglQueryDeviceStringEXT (EGLDeviceEXT device, EGLint name);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryDevicesEXT (EGLint max_devices, EGLDeviceEXT *devices, EGLint *num_devices);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribEXT (EGLDisplay dpy, EGLint attribute, EGLAttrib *value);
+#endif
+#endif /* EGL_EXT_device_base */
+
+#ifndef EGL_EXT_device_drm
+#define EGL_EXT_device_drm 1
+#define EGL_DRM_DEVICE_FILE_EXT 0x3233
+#define EGL_DRM_MASTER_FD_EXT 0x333C
+#endif /* EGL_EXT_device_drm */
+
+#ifndef EGL_EXT_device_drm_render_node
+#define EGL_EXT_device_drm_render_node 1
+#define EGL_DRM_RENDER_NODE_FILE_EXT 0x3377
+#endif /* EGL_EXT_device_drm_render_node */
+
+#ifndef EGL_EXT_device_enumeration
+#define EGL_EXT_device_enumeration 1
+#endif /* EGL_EXT_device_enumeration */
+
+#ifndef EGL_EXT_device_openwf
+#define EGL_EXT_device_openwf 1
+#define EGL_OPENWF_DEVICE_ID_EXT 0x3237
+#define EGL_OPENWF_DEVICE_EXT 0x333D
+#endif /* EGL_EXT_device_openwf */
+
+#ifndef EGL_EXT_device_persistent_id
+#define EGL_EXT_device_persistent_id 1
+#define EGL_DEVICE_UUID_EXT 0x335C
+#define EGL_DRIVER_UUID_EXT 0x335D
+#define EGL_DRIVER_NAME_EXT 0x335E
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICEBINARYEXTPROC) (EGLDeviceEXT device, EGLint name, EGLint max_size, void *value, EGLint *size);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryDeviceBinaryEXT (EGLDeviceEXT device, EGLint name, EGLint max_size, void *value, EGLint *size);
+#endif
+#endif /* EGL_EXT_device_persistent_id */
+
+#ifndef EGL_EXT_device_query
+#define EGL_EXT_device_query 1
+#endif /* EGL_EXT_device_query */
+
+#ifndef EGL_EXT_device_query_name
+#define EGL_EXT_device_query_name 1
+#define EGL_RENDERER_EXT 0x335F
+#endif /* EGL_EXT_device_query_name */
+
+#ifndef EGL_EXT_explicit_device
+#define EGL_EXT_explicit_device 1
+#endif /* EGL_EXT_explicit_device */
+
+#ifndef EGL_EXT_gl_colorspace_bt2020_linear
+#define EGL_EXT_gl_colorspace_bt2020_linear 1
+#define EGL_GL_COLORSPACE_BT2020_LINEAR_EXT 0x333F
+#endif /* EGL_EXT_gl_colorspace_bt2020_linear */
+
+#ifndef EGL_EXT_gl_colorspace_bt2020_pq
+#define EGL_EXT_gl_colorspace_bt2020_pq 1
+#define EGL_GL_COLORSPACE_BT2020_PQ_EXT 0x3340
+#endif /* EGL_EXT_gl_colorspace_bt2020_pq */
+
+#ifndef EGL_EXT_gl_colorspace_display_p3
+#define EGL_EXT_gl_colorspace_display_p3 1
+#define EGL_GL_COLORSPACE_DISPLAY_P3_EXT 0x3363
+#endif /* EGL_EXT_gl_colorspace_display_p3 */
+
+#ifndef EGL_EXT_gl_colorspace_display_p3_linear
+#define EGL_EXT_gl_colorspace_display_p3_linear 1
+#define EGL_GL_COLORSPACE_DISPLAY_P3_LINEAR_EXT 0x3362
+#endif /* EGL_EXT_gl_colorspace_display_p3_linear */
+
+#ifndef EGL_EXT_gl_colorspace_display_p3_passthrough
+#define EGL_EXT_gl_colorspace_display_p3_passthrough 1
+#define EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT 0x3490
+#endif /* EGL_EXT_gl_colorspace_display_p3_passthrough */
+
+#ifndef EGL_EXT_gl_colorspace_scrgb
+#define EGL_EXT_gl_colorspace_scrgb 1
+#define EGL_GL_COLORSPACE_SCRGB_EXT 0x3351
+#endif /* EGL_EXT_gl_colorspace_scrgb */
+
+#ifndef EGL_EXT_gl_colorspace_scrgb_linear
+#define EGL_EXT_gl_colorspace_scrgb_linear 1
+#define EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT 0x3350
+#endif /* EGL_EXT_gl_colorspace_scrgb_linear */
+
+#ifndef EGL_EXT_image_dma_buf_import
+#define EGL_EXT_image_dma_buf_import 1
+#define EGL_LINUX_DMA_BUF_EXT 0x3270
+#define EGL_LINUX_DRM_FOURCC_EXT 0x3271
+#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272
+#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273
+#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274
+#define EGL_DMA_BUF_PLANE1_FD_EXT 0x3275
+#define EGL_DMA_BUF_PLANE1_OFFSET_EXT 0x3276
+#define EGL_DMA_BUF_PLANE1_PITCH_EXT 0x3277
+#define EGL_DMA_BUF_PLANE2_FD_EXT 0x3278
+#define EGL_DMA_BUF_PLANE2_OFFSET_EXT 0x3279
+#define EGL_DMA_BUF_PLANE2_PITCH_EXT 0x327A
+#define EGL_YUV_COLOR_SPACE_HINT_EXT 0x327B
+#define EGL_SAMPLE_RANGE_HINT_EXT 0x327C
+#define EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT 0x327D
+#define EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT 0x327E
+#define EGL_ITU_REC601_EXT 0x327F
+#define EGL_ITU_REC709_EXT 0x3280
+#define EGL_ITU_REC2020_EXT 0x3281
+#define EGL_YUV_FULL_RANGE_EXT 0x3282
+#define EGL_YUV_NARROW_RANGE_EXT 0x3283
+#define EGL_YUV_CHROMA_SITING_0_EXT 0x3284
+#define EGL_YUV_CHROMA_SITING_0_5_EXT 0x3285
+#endif /* EGL_EXT_image_dma_buf_import */
+
+#ifndef EGL_EXT_image_dma_buf_import_modifiers
+#define EGL_EXT_image_dma_buf_import_modifiers 1
+#define EGL_DMA_BUF_PLANE3_FD_EXT 0x3440
+#define EGL_DMA_BUF_PLANE3_OFFSET_EXT 0x3441
+#define EGL_DMA_BUF_PLANE3_PITCH_EXT 0x3442
+#define EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT 0x3443
+#define EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT 0x3444
+#define EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT 0x3445
+#define EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT 0x3446
+#define EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT 0x3447
+#define EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT 0x3448
+#define EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT 0x3449
+#define EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT 0x344A
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDMABUFFORMATSEXTPROC) (EGLDisplay dpy, EGLint max_formats, EGLint *formats, EGLint *num_formats);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDMABUFMODIFIERSEXTPROC) (EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR *modifiers, EGLBoolean *external_only, EGLint *num_modifiers);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryDmaBufFormatsEXT (EGLDisplay dpy, EGLint max_formats, EGLint *formats, EGLint *num_formats);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryDmaBufModifiersEXT (EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR *modifiers, EGLBoolean *external_only, EGLint *num_modifiers);
+#endif
+#endif /* EGL_EXT_image_dma_buf_import_modifiers */
+
+#ifndef EGL_EXT_image_gl_colorspace
+#define EGL_EXT_image_gl_colorspace 1
+#define EGL_GL_COLORSPACE_DEFAULT_EXT 0x314D
+#endif /* EGL_EXT_image_gl_colorspace */
+
+#ifndef EGL_EXT_image_implicit_sync_control
+#define EGL_EXT_image_implicit_sync_control 1
+#define EGL_IMPORT_SYNC_TYPE_EXT 0x3470
+#define EGL_IMPORT_IMPLICIT_SYNC_EXT 0x3471
+#define EGL_IMPORT_EXPLICIT_SYNC_EXT 0x3472
+#endif /* EGL_EXT_image_implicit_sync_control */
+
+#ifndef EGL_EXT_multiview_window
+#define EGL_EXT_multiview_window 1
+#define EGL_MULTIVIEW_VIEW_COUNT_EXT 0x3134
+#endif /* EGL_EXT_multiview_window */
+
+#ifndef EGL_EXT_output_base
+#define EGL_EXT_output_base 1
+typedef void *EGLOutputLayerEXT;
+typedef void *EGLOutputPortEXT;
+#define EGL_NO_OUTPUT_LAYER_EXT EGL_CAST(EGLOutputLayerEXT,0)
+#define EGL_NO_OUTPUT_PORT_EXT EGL_CAST(EGLOutputPortEXT,0)
+#define EGL_BAD_OUTPUT_LAYER_EXT 0x322D
+#define EGL_BAD_OUTPUT_PORT_EXT 0x322E
+#define EGL_SWAP_INTERVAL_EXT 0x322F
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTLAYERSEXTPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTPORTSEXTPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value);
+typedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value);
+typedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglGetOutputLayersEXT (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetOutputPortsEXT (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports);
+EGLAPI EGLBoolean EGLAPIENTRY eglOutputLayerAttribEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryOutputLayerAttribEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value);
+EGLAPI const char *EGLAPIENTRY eglQueryOutputLayerStringEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name);
+EGLAPI EGLBoolean EGLAPIENTRY eglOutputPortAttribEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryOutputPortAttribEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value);
+EGLAPI const char *EGLAPIENTRY eglQueryOutputPortStringEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name);
+#endif
+#endif /* EGL_EXT_output_base */
+
+#ifndef EGL_EXT_output_drm
+#define EGL_EXT_output_drm 1
+#define EGL_DRM_CRTC_EXT 0x3234
+#define EGL_DRM_PLANE_EXT 0x3235
+#define EGL_DRM_CONNECTOR_EXT 0x3236
+#endif /* EGL_EXT_output_drm */
+
+#ifndef EGL_EXT_output_openwf
+#define EGL_EXT_output_openwf 1
+#define EGL_OPENWF_PIPELINE_ID_EXT 0x3238
+#define EGL_OPENWF_PORT_ID_EXT 0x3239
+#endif /* EGL_EXT_output_openwf */
+
+#ifndef EGL_EXT_pixel_format_float
+#define EGL_EXT_pixel_format_float 1
+#define EGL_COLOR_COMPONENT_TYPE_EXT 0x3339
+#define EGL_COLOR_COMPONENT_TYPE_FIXED_EXT 0x333A
+#define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT 0x333B
+#endif /* EGL_EXT_pixel_format_float */
+
+#ifndef EGL_EXT_platform_base
+#define EGL_EXT_platform_base 1
+typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platform, void *native_display, const EGLint *attrib_list);
+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);
+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT (EGLenum platform, void *native_display, const EGLint *attrib_list);
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);
+#endif
+#endif /* EGL_EXT_platform_base */
+
+#ifndef EGL_EXT_platform_device
+#define EGL_EXT_platform_device 1
+#define EGL_PLATFORM_DEVICE_EXT 0x313F
+#endif /* EGL_EXT_platform_device */
+
+#ifndef EGL_EXT_platform_wayland
+#define EGL_EXT_platform_wayland 1
+#define EGL_PLATFORM_WAYLAND_EXT 0x31D8
+#endif /* EGL_EXT_platform_wayland */
+
+#ifndef EGL_EXT_platform_x11
+#define EGL_EXT_platform_x11 1
+#define EGL_PLATFORM_X11_EXT 0x31D5
+#define EGL_PLATFORM_X11_SCREEN_EXT 0x31D6
+#endif /* EGL_EXT_platform_x11 */
+
+#ifndef EGL_EXT_platform_xcb
+#define EGL_EXT_platform_xcb 1
+#define EGL_PLATFORM_XCB_EXT 0x31DC
+#define EGL_PLATFORM_XCB_SCREEN_EXT 0x31DE
+#endif /* EGL_EXT_platform_xcb */
+
+#ifndef EGL_EXT_present_opaque
+#define EGL_EXT_present_opaque 1
+#define EGL_PRESENT_OPAQUE_EXT 0x31DF
+#endif /* EGL_EXT_present_opaque */
+
+#ifndef EGL_EXT_protected_content
+#define EGL_EXT_protected_content 1
+#define EGL_PROTECTED_CONTENT_EXT 0x32C0
+#endif /* EGL_EXT_protected_content */
+
+#ifndef EGL_EXT_protected_surface
+#define EGL_EXT_protected_surface 1
+#endif /* EGL_EXT_protected_surface */
+
+#ifndef EGL_EXT_stream_consumer_egloutput
+#define EGL_EXT_stream_consumer_egloutput 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMEROUTPUTEXTPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerOutputEXT (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer);
+#endif
+#endif /* EGL_EXT_stream_consumer_egloutput */
+
+#ifndef EGL_EXT_surface_CTA861_3_metadata
+#define EGL_EXT_surface_CTA861_3_metadata 1
+#define EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT 0x3360
+#define EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT 0x3361
+#endif /* EGL_EXT_surface_CTA861_3_metadata */
+
+#ifndef EGL_EXT_surface_SMPTE2086_metadata
+#define EGL_EXT_surface_SMPTE2086_metadata 1
+#define EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT 0x3341
+#define EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT 0x3342
+#define EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT 0x3343
+#define EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT 0x3344
+#define EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT 0x3345
+#define EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT 0x3346
+#define EGL_SMPTE2086_WHITE_POINT_X_EXT 0x3347
+#define EGL_SMPTE2086_WHITE_POINT_Y_EXT 0x3348
+#define EGL_SMPTE2086_MAX_LUMINANCE_EXT 0x3349
+#define EGL_SMPTE2086_MIN_LUMINANCE_EXT 0x334A
+#define EGL_METADATA_SCALING_EXT 50000
+#endif /* EGL_EXT_surface_SMPTE2086_metadata */
+
+#ifndef EGL_EXT_surface_compression
+#define EGL_EXT_surface_compression 1
+#define EGL_SURFACE_COMPRESSION_EXT 0x34B0
+#define EGL_SURFACE_COMPRESSION_PLANE1_EXT 0x328E
+#define EGL_SURFACE_COMPRESSION_PLANE2_EXT 0x328F
+#define EGL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT 0x34B1
+#define EGL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT 0x34B2
+#define EGL_SURFACE_COMPRESSION_FIXED_RATE_1BPC_EXT 0x34B4
+#define EGL_SURFACE_COMPRESSION_FIXED_RATE_2BPC_EXT 0x34B5
+#define EGL_SURFACE_COMPRESSION_FIXED_RATE_3BPC_EXT 0x34B6
+#define EGL_SURFACE_COMPRESSION_FIXED_RATE_4BPC_EXT 0x34B7
+#define EGL_SURFACE_COMPRESSION_FIXED_RATE_5BPC_EXT 0x34B8
+#define EGL_SURFACE_COMPRESSION_FIXED_RATE_6BPC_EXT 0x34B9
+#define EGL_SURFACE_COMPRESSION_FIXED_RATE_7BPC_EXT 0x34BA
+#define EGL_SURFACE_COMPRESSION_FIXED_RATE_8BPC_EXT 0x34BB
+#define EGL_SURFACE_COMPRESSION_FIXED_RATE_9BPC_EXT 0x34BC
+#define EGL_SURFACE_COMPRESSION_FIXED_RATE_10BPC_EXT 0x34BD
+#define EGL_SURFACE_COMPRESSION_FIXED_RATE_11BPC_EXT 0x34BE
+#define EGL_SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT 0x34BF
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSUPPORTEDCOMPRESSIONRATESEXTPROC) (EGLDisplay dpy, EGLConfig config, const EGLAttrib *attrib_list, EGLint *rates, EGLint rate_size, EGLint *num_rates);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglQuerySupportedCompressionRatesEXT (EGLDisplay dpy, EGLConfig config, const EGLAttrib *attrib_list, EGLint *rates, EGLint rate_size, EGLint *num_rates);
+#endif
+#endif /* EGL_EXT_surface_compression */
+
+#ifndef EGL_EXT_swap_buffers_with_damage
+#define EGL_EXT_swap_buffers_with_damage 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageEXT (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects);
+#endif
+#endif /* EGL_EXT_swap_buffers_with_damage */
+
+#ifndef EGL_EXT_sync_reuse
+#define EGL_EXT_sync_reuse 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNSIGNALSYNCEXTPROC) (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglUnsignalSyncEXT (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list);
+#endif
+#endif /* EGL_EXT_sync_reuse */
+
+#ifndef EGL_EXT_yuv_surface
+#define EGL_EXT_yuv_surface 1
+#define EGL_YUV_ORDER_EXT 0x3301
+#define EGL_YUV_NUMBER_OF_PLANES_EXT 0x3311
+#define EGL_YUV_SUBSAMPLE_EXT 0x3312
+#define EGL_YUV_DEPTH_RANGE_EXT 0x3317
+#define EGL_YUV_CSC_STANDARD_EXT 0x330A
+#define EGL_YUV_PLANE_BPP_EXT 0x331A
+#define EGL_YUV_BUFFER_EXT 0x3300
+#define EGL_YUV_ORDER_YUV_EXT 0x3302
+#define EGL_YUV_ORDER_YVU_EXT 0x3303
+#define EGL_YUV_ORDER_YUYV_EXT 0x3304
+#define EGL_YUV_ORDER_UYVY_EXT 0x3305
+#define EGL_YUV_ORDER_YVYU_EXT 0x3306
+#define EGL_YUV_ORDER_VYUY_EXT 0x3307
+#define EGL_YUV_ORDER_AYUV_EXT 0x3308
+#define EGL_YUV_SUBSAMPLE_4_2_0_EXT 0x3313
+#define EGL_YUV_SUBSAMPLE_4_2_2_EXT 0x3314
+#define EGL_YUV_SUBSAMPLE_4_4_4_EXT 0x3315
+#define EGL_YUV_DEPTH_RANGE_LIMITED_EXT 0x3318
+#define EGL_YUV_DEPTH_RANGE_FULL_EXT 0x3319
+#define EGL_YUV_CSC_STANDARD_601_EXT 0x330B
+#define EGL_YUV_CSC_STANDARD_709_EXT 0x330C
+#define EGL_YUV_CSC_STANDARD_2020_EXT 0x330D
+#define EGL_YUV_PLANE_BPP_0_EXT 0x331B
+#define EGL_YUV_PLANE_BPP_8_EXT 0x331C
+#define EGL_YUV_PLANE_BPP_10_EXT 0x331D
+#endif /* EGL_EXT_yuv_surface */
+
+#ifndef EGL_HI_clientpixmap
+#define EGL_HI_clientpixmap 1
+struct EGLClientPixmapHI {
+ void *pData;
+ EGLint iWidth;
+ EGLint iHeight;
+ EGLint iStride;
+};
+#define EGL_CLIENT_PIXMAP_POINTER_HI 0x8F74
+typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurfaceHI (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap);
+#endif
+#endif /* EGL_HI_clientpixmap */
+
+#ifndef EGL_HI_colorformats
+#define EGL_HI_colorformats 1
+#define EGL_COLOR_FORMAT_HI 0x8F70
+#define EGL_COLOR_RGB_HI 0x8F71
+#define EGL_COLOR_RGBA_HI 0x8F72
+#define EGL_COLOR_ARGB_HI 0x8F73
+#endif /* EGL_HI_colorformats */
+
+#ifndef EGL_IMG_context_priority
+#define EGL_IMG_context_priority 1
+#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3100
+#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101
+#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102
+#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103
+#endif /* EGL_IMG_context_priority */
+
+#ifndef EGL_IMG_image_plane_attribs
+#define EGL_IMG_image_plane_attribs 1
+#define EGL_NATIVE_BUFFER_MULTIPLANE_SEPARATE_IMG 0x3105
+#define EGL_NATIVE_BUFFER_PLANE_OFFSET_IMG 0x3106
+#endif /* EGL_IMG_image_plane_attribs */
+
+#ifndef EGL_MESA_drm_image
+#define EGL_MESA_drm_image 1
+#define EGL_DRM_BUFFER_FORMAT_MESA 0x31D0
+#define EGL_DRM_BUFFER_USE_MESA 0x31D1
+#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2
+#define EGL_DRM_BUFFER_MESA 0x31D3
+#define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4
+#define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001
+#define EGL_DRM_BUFFER_USE_SHARE_MESA 0x00000002
+#define EGL_DRM_BUFFER_USE_CURSOR_MESA 0x00000004
+typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLImageKHR EGLAPIENTRY eglCreateDRMImageMESA (EGLDisplay dpy, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglExportDRMImageMESA (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride);
+#endif
+#endif /* EGL_MESA_drm_image */
+
+#ifndef EGL_MESA_image_dma_buf_export
+#define EGL_MESA_image_dma_buf_export 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglExportDMABUFImageQueryMESA (EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers);
+EGLAPI EGLBoolean EGLAPIENTRY eglExportDMABUFImageMESA (EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets);
+#endif
+#endif /* EGL_MESA_image_dma_buf_export */
+
+#ifndef EGL_MESA_platform_gbm
+#define EGL_MESA_platform_gbm 1
+#define EGL_PLATFORM_GBM_MESA 0x31D7
+#endif /* EGL_MESA_platform_gbm */
+
+#ifndef EGL_MESA_platform_surfaceless
+#define EGL_MESA_platform_surfaceless 1
+#define EGL_PLATFORM_SURFACELESS_MESA 0x31DD
+#endif /* EGL_MESA_platform_surfaceless */
+
+#ifndef EGL_MESA_query_driver
+#define EGL_MESA_query_driver 1
+typedef char *(EGLAPIENTRYP PFNEGLGETDISPLAYDRIVERCONFIGPROC) (EGLDisplay dpy);
+typedef const char *(EGLAPIENTRYP PFNEGLGETDISPLAYDRIVERNAMEPROC) (EGLDisplay dpy);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI char *EGLAPIENTRY eglGetDisplayDriverConfig (EGLDisplay dpy);
+EGLAPI const char *EGLAPIENTRY eglGetDisplayDriverName (EGLDisplay dpy);
+#endif
+#endif /* EGL_MESA_query_driver */
+
+#ifndef EGL_NOK_swap_region
+#define EGL_NOK_swap_region 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGIONNOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegionNOK (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects);
+#endif
+#endif /* EGL_NOK_swap_region */
+
+#ifndef EGL_NOK_swap_region2
+#define EGL_NOK_swap_region2 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGION2NOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegion2NOK (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects);
+#endif
+#endif /* EGL_NOK_swap_region2 */
+
+#ifndef EGL_NOK_texture_from_pixmap
+#define EGL_NOK_texture_from_pixmap 1
+#define EGL_Y_INVERTED_NOK 0x307F
+#endif /* EGL_NOK_texture_from_pixmap */
+
+#ifndef EGL_NV_3dvision_surface
+#define EGL_NV_3dvision_surface 1
+#define EGL_AUTO_STEREO_NV 0x3136
+#endif /* EGL_NV_3dvision_surface */
+
+#ifndef EGL_NV_context_priority_realtime
+#define EGL_NV_context_priority_realtime 1
+#define EGL_CONTEXT_PRIORITY_REALTIME_NV 0x3357
+#endif /* EGL_NV_context_priority_realtime */
+
+#ifndef EGL_NV_coverage_sample
+#define EGL_NV_coverage_sample 1
+#define EGL_COVERAGE_BUFFERS_NV 0x30E0
+#define EGL_COVERAGE_SAMPLES_NV 0x30E1
+#endif /* EGL_NV_coverage_sample */
+
+#ifndef EGL_NV_coverage_sample_resolve
+#define EGL_NV_coverage_sample_resolve 1
+#define EGL_COVERAGE_SAMPLE_RESOLVE_NV 0x3131
+#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV 0x3132
+#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133
+#endif /* EGL_NV_coverage_sample_resolve */
+
+#ifndef EGL_NV_cuda_event
+#define EGL_NV_cuda_event 1
+#define EGL_CUDA_EVENT_HANDLE_NV 0x323B
+#define EGL_SYNC_CUDA_EVENT_NV 0x323C
+#define EGL_SYNC_CUDA_EVENT_COMPLETE_NV 0x323D
+#endif /* EGL_NV_cuda_event */
+
+#ifndef EGL_NV_depth_nonlinear
+#define EGL_NV_depth_nonlinear 1
+#define EGL_DEPTH_ENCODING_NV 0x30E2
+#define EGL_DEPTH_ENCODING_NONE_NV 0
+#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3
+#endif /* EGL_NV_depth_nonlinear */
+
+#ifndef EGL_NV_device_cuda
+#define EGL_NV_device_cuda 1
+#define EGL_CUDA_DEVICE_NV 0x323A
+#endif /* EGL_NV_device_cuda */
+
+#ifndef EGL_NV_native_query
+#define EGL_NV_native_query 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEDISPLAYNVPROC) (EGLDisplay dpy, EGLNativeDisplayType *display_id);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEWINDOWNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEPIXMAPNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeDisplayNV (EGLDisplay dpy, EGLNativeDisplayType *display_id);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeWindowNV (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativePixmapNV (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap);
+#endif
+#endif /* EGL_NV_native_query */
+
+#ifndef EGL_NV_post_convert_rounding
+#define EGL_NV_post_convert_rounding 1
+#endif /* EGL_NV_post_convert_rounding */
+
+#ifndef EGL_NV_post_sub_buffer
+#define EGL_NV_post_sub_buffer 1
+#define EGL_POST_SUB_BUFFER_SUPPORTED_NV 0x30BE
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLPOSTSUBBUFFERNVPROC) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglPostSubBufferNV (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height);
+#endif
+#endif /* EGL_NV_post_sub_buffer */
+
+#ifndef EGL_NV_quadruple_buffer
+#define EGL_NV_quadruple_buffer 1
+#define EGL_QUADRUPLE_BUFFER_NV 0x3231
+#endif /* EGL_NV_quadruple_buffer */
+
+#ifndef EGL_NV_robustness_video_memory_purge
+#define EGL_NV_robustness_video_memory_purge 1
+#define EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C
+#endif /* EGL_NV_robustness_video_memory_purge */
+
+#ifndef EGL_NV_stream_consumer_eglimage
+#define EGL_NV_stream_consumer_eglimage 1
+#define EGL_STREAM_CONSUMER_IMAGE_NV 0x3373
+#define EGL_STREAM_IMAGE_ADD_NV 0x3374
+#define EGL_STREAM_IMAGE_REMOVE_NV 0x3375
+#define EGL_STREAM_IMAGE_AVAILABLE_NV 0x3376
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMIMAGECONSUMERCONNECTNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLint num_modifiers, const EGLuint64KHR *modifiers, const EGLAttrib *attrib_list);
+typedef EGLint (EGLAPIENTRYP PFNEGLQUERYSTREAMCONSUMEREVENTNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLTime timeout, EGLenum *event, EGLAttrib *aux);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMACQUIREIMAGENVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLImage *pImage, EGLSync sync);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMRELEASEIMAGENVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLImage image, EGLSync sync);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamImageConsumerConnectNV (EGLDisplay dpy, EGLStreamKHR stream, EGLint num_modifiers, const EGLuint64KHR *modifiers, const EGLAttrib *attrib_list);
+EGLAPI EGLint EGLAPIENTRY eglQueryStreamConsumerEventNV (EGLDisplay dpy, EGLStreamKHR stream, EGLTime timeout, EGLenum *event, EGLAttrib *aux);
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamAcquireImageNV (EGLDisplay dpy, EGLStreamKHR stream, EGLImage *pImage, EGLSync sync);
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamReleaseImageNV (EGLDisplay dpy, EGLStreamKHR stream, EGLImage image, EGLSync sync);
+#endif
+#endif /* EGL_NV_stream_consumer_eglimage */
+
+#ifndef EGL_NV_stream_consumer_gltexture_yuv
+#define EGL_NV_stream_consumer_gltexture_yuv 1
+#define EGL_YUV_PLANE0_TEXTURE_UNIT_NV 0x332C
+#define EGL_YUV_PLANE1_TEXTURE_UNIT_NV 0x332D
+#define EGL_YUV_PLANE2_TEXTURE_UNIT_NV 0x332E
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalAttribsNV (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
+#endif
+#endif /* EGL_NV_stream_consumer_gltexture_yuv */
+
+#ifndef EGL_NV_stream_cross_display
+#define EGL_NV_stream_cross_display 1
+#define EGL_STREAM_CROSS_DISPLAY_NV 0x334E
+#endif /* EGL_NV_stream_cross_display */
+
+#ifndef EGL_NV_stream_cross_object
+#define EGL_NV_stream_cross_object 1
+#define EGL_STREAM_CROSS_OBJECT_NV 0x334D
+#endif /* EGL_NV_stream_cross_object */
+
+#ifndef EGL_NV_stream_cross_partition
+#define EGL_NV_stream_cross_partition 1
+#define EGL_STREAM_CROSS_PARTITION_NV 0x323F
+#endif /* EGL_NV_stream_cross_partition */
+
+#ifndef EGL_NV_stream_cross_process
+#define EGL_NV_stream_cross_process 1
+#define EGL_STREAM_CROSS_PROCESS_NV 0x3245
+#endif /* EGL_NV_stream_cross_process */
+
+#ifndef EGL_NV_stream_cross_system
+#define EGL_NV_stream_cross_system 1
+#define EGL_STREAM_CROSS_SYSTEM_NV 0x334F
+#endif /* EGL_NV_stream_cross_system */
+
+#ifndef EGL_NV_stream_dma
+#define EGL_NV_stream_dma 1
+#define EGL_STREAM_DMA_NV 0x3371
+#define EGL_STREAM_DMA_SERVER_NV 0x3372
+#endif /* EGL_NV_stream_dma */
+
+#ifndef EGL_NV_stream_fifo_next
+#define EGL_NV_stream_fifo_next 1
+#define EGL_PENDING_FRAME_NV 0x3329
+#define EGL_STREAM_TIME_PENDING_NV 0x332A
+#endif /* EGL_NV_stream_fifo_next */
+
+#ifndef EGL_NV_stream_fifo_synchronous
+#define EGL_NV_stream_fifo_synchronous 1
+#define EGL_STREAM_FIFO_SYNCHRONOUS_NV 0x3336
+#endif /* EGL_NV_stream_fifo_synchronous */
+
+#ifndef EGL_NV_stream_flush
+#define EGL_NV_stream_flush 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMFLUSHNVPROC) (EGLDisplay dpy, EGLStreamKHR stream);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamFlushNV (EGLDisplay dpy, EGLStreamKHR stream);
+#endif
+#endif /* EGL_NV_stream_flush */
+
+#ifndef EGL_NV_stream_frame_limits
+#define EGL_NV_stream_frame_limits 1
+#define EGL_PRODUCER_MAX_FRAME_HINT_NV 0x3337
+#define EGL_CONSUMER_MAX_FRAME_HINT_NV 0x3338
+#endif /* EGL_NV_stream_frame_limits */
+
+#ifndef EGL_NV_stream_metadata
+#define EGL_NV_stream_metadata 1
+#define EGL_MAX_STREAM_METADATA_BLOCKS_NV 0x3250
+#define EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV 0x3251
+#define EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV 0x3252
+#define EGL_PRODUCER_METADATA_NV 0x3253
+#define EGL_CONSUMER_METADATA_NV 0x3254
+#define EGL_PENDING_METADATA_NV 0x3328
+#define EGL_METADATA0_SIZE_NV 0x3255
+#define EGL_METADATA1_SIZE_NV 0x3256
+#define EGL_METADATA2_SIZE_NV 0x3257
+#define EGL_METADATA3_SIZE_NV 0x3258
+#define EGL_METADATA0_TYPE_NV 0x3259
+#define EGL_METADATA1_TYPE_NV 0x325A
+#define EGL_METADATA2_TYPE_NV 0x325B
+#define EGL_METADATA3_TYPE_NV 0x325C
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBNVPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib *value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLint n, EGLint offset, EGLint size, const void *data);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum name, EGLint n, EGLint offset, EGLint size, void *data);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribNV (EGLDisplay dpy, EGLint attribute, EGLAttrib *value);
+EGLAPI EGLBoolean EGLAPIENTRY eglSetStreamMetadataNV (EGLDisplay dpy, EGLStreamKHR stream, EGLint n, EGLint offset, EGLint size, const void *data);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamMetadataNV (EGLDisplay dpy, EGLStreamKHR stream, EGLenum name, EGLint n, EGLint offset, EGLint size, void *data);
+#endif
+#endif /* EGL_NV_stream_metadata */
+
+#ifndef EGL_NV_stream_origin
+#define EGL_NV_stream_origin 1
+#define EGL_STREAM_FRAME_ORIGIN_X_NV 0x3366
+#define EGL_STREAM_FRAME_ORIGIN_Y_NV 0x3367
+#define EGL_STREAM_FRAME_MAJOR_AXIS_NV 0x3368
+#define EGL_CONSUMER_AUTO_ORIENTATION_NV 0x3369
+#define EGL_PRODUCER_AUTO_ORIENTATION_NV 0x336A
+#define EGL_LEFT_NV 0x336B
+#define EGL_RIGHT_NV 0x336C
+#define EGL_TOP_NV 0x336D
+#define EGL_BOTTOM_NV 0x336E
+#define EGL_X_AXIS_NV 0x336F
+#define EGL_Y_AXIS_NV 0x3370
+#endif /* EGL_NV_stream_origin */
+
+#ifndef EGL_NV_stream_remote
+#define EGL_NV_stream_remote 1
+#define EGL_STREAM_STATE_INITIALIZING_NV 0x3240
+#define EGL_STREAM_TYPE_NV 0x3241
+#define EGL_STREAM_PROTOCOL_NV 0x3242
+#define EGL_STREAM_ENDPOINT_NV 0x3243
+#define EGL_STREAM_LOCAL_NV 0x3244
+#define EGL_STREAM_PRODUCER_NV 0x3247
+#define EGL_STREAM_CONSUMER_NV 0x3248
+#define EGL_STREAM_PROTOCOL_FD_NV 0x3246
+#endif /* EGL_NV_stream_remote */
+
+#ifndef EGL_NV_stream_reset
+#define EGL_NV_stream_reset 1
+#define EGL_SUPPORT_RESET_NV 0x3334
+#define EGL_SUPPORT_REUSE_NV 0x3335
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLRESETSTREAMNVPROC) (EGLDisplay dpy, EGLStreamKHR stream);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglResetStreamNV (EGLDisplay dpy, EGLStreamKHR stream);
+#endif
+#endif /* EGL_NV_stream_reset */
+
+#ifndef EGL_NV_stream_socket
+#define EGL_NV_stream_socket 1
+#define EGL_STREAM_PROTOCOL_SOCKET_NV 0x324B
+#define EGL_SOCKET_HANDLE_NV 0x324C
+#define EGL_SOCKET_TYPE_NV 0x324D
+#endif /* EGL_NV_stream_socket */
+
+#ifndef EGL_NV_stream_socket_inet
+#define EGL_NV_stream_socket_inet 1
+#define EGL_SOCKET_TYPE_INET_NV 0x324F
+#endif /* EGL_NV_stream_socket_inet */
+
+#ifndef EGL_NV_stream_socket_unix
+#define EGL_NV_stream_socket_unix 1
+#define EGL_SOCKET_TYPE_UNIX_NV 0x324E
+#endif /* EGL_NV_stream_socket_unix */
+
+#ifndef EGL_NV_stream_sync
+#define EGL_NV_stream_sync 1
+#define EGL_SYNC_NEW_FRAME_NV 0x321F
+typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESTREAMSYNCNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateStreamSyncNV (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list);
+#endif
+#endif /* EGL_NV_stream_sync */
+
+#ifndef EGL_NV_sync
+#define EGL_NV_sync 1
+typedef void *EGLSyncNV;
+typedef khronos_utime_nanoseconds_t EGLTimeNV;
+#ifdef KHRONOS_SUPPORT_INT64
+#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV 0x30E6
+#define EGL_SYNC_STATUS_NV 0x30E7
+#define EGL_SIGNALED_NV 0x30E8
+#define EGL_UNSIGNALED_NV 0x30E9
+#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV 0x0001
+#define EGL_FOREVER_NV 0xFFFFFFFFFFFFFFFFull
+#define EGL_ALREADY_SIGNALED_NV 0x30EA
+#define EGL_TIMEOUT_EXPIRED_NV 0x30EB
+#define EGL_CONDITION_SATISFIED_NV 0x30EC
+#define EGL_SYNC_TYPE_NV 0x30ED
+#define EGL_SYNC_CONDITION_NV 0x30EE
+#define EGL_SYNC_FENCE_NV 0x30EF
+#define EGL_NO_SYNC_NV EGL_CAST(EGLSyncNV,0)
+typedef EGLSyncNV (EGLAPIENTRYP PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLFENCENVPROC) (EGLSyncNV sync);
+typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint *value);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLSyncNV EGLAPIENTRY eglCreateFenceSyncNV (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncNV (EGLSyncNV sync);
+EGLAPI EGLBoolean EGLAPIENTRY eglFenceNV (EGLSyncNV sync);
+EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncNV (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout);
+EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncNV (EGLSyncNV sync, EGLenum mode);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribNV (EGLSyncNV sync, EGLint attribute, EGLint *value);
+#endif
+#endif /* KHRONOS_SUPPORT_INT64 */
+#endif /* EGL_NV_sync */
+
+#ifndef EGL_NV_system_time
+#define EGL_NV_system_time 1
+typedef khronos_utime_nanoseconds_t EGLuint64NV;
+#ifdef KHRONOS_SUPPORT_INT64
+typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC) (void);
+typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC) (void);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeFrequencyNV (void);
+EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeNV (void);
+#endif
+#endif /* KHRONOS_SUPPORT_INT64 */
+#endif /* EGL_NV_system_time */
+
+#ifndef EGL_NV_triple_buffer
+#define EGL_NV_triple_buffer 1
+#define EGL_TRIPLE_BUFFER_NV 0x3230
+#endif /* EGL_NV_triple_buffer */
+
+#ifndef EGL_TIZEN_image_native_buffer
+#define EGL_TIZEN_image_native_buffer 1
+#define EGL_NATIVE_BUFFER_TIZEN 0x32A0
+#endif /* EGL_TIZEN_image_native_buffer */
+
+#ifndef EGL_TIZEN_image_native_surface
+#define EGL_TIZEN_image_native_surface 1
+#define EGL_NATIVE_SURFACE_TIZEN 0x32A1
+#endif /* EGL_TIZEN_image_native_surface */
+
+#ifndef EGL_WL_bind_wayland_display
+#define EGL_WL_bind_wayland_display 1
+#define PFNEGLBINDWAYLANDDISPLAYWL PFNEGLBINDWAYLANDDISPLAYWLPROC
+#define PFNEGLUNBINDWAYLANDDISPLAYWL PFNEGLUNBINDWAYLANDDISPLAYWLPROC
+#define PFNEGLQUERYWAYLANDBUFFERWL PFNEGLQUERYWAYLANDBUFFERWLPROC
+struct wl_display;
+struct wl_resource;
+#define EGL_WAYLAND_BUFFER_WL 0x31D5
+#define EGL_WAYLAND_PLANE_WL 0x31D6
+#define EGL_TEXTURE_Y_U_V_WL 0x31D7
+#define EGL_TEXTURE_Y_UV_WL 0x31D8
+#define EGL_TEXTURE_Y_XUXV_WL 0x31D9
+#define EGL_TEXTURE_EXTERNAL_WL 0x31DA
+#define EGL_WAYLAND_Y_INVERTED_WL 0x31DB
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDWAYLANDDISPLAYWLPROC) (EGLDisplay dpy, struct wl_display *display);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNBINDWAYLANDDISPLAYWLPROC) (EGLDisplay dpy, struct wl_display *display);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWLPROC) (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglBindWaylandDisplayWL (EGLDisplay dpy, struct wl_display *display);
+EGLAPI EGLBoolean EGLAPIENTRY eglUnbindWaylandDisplayWL (EGLDisplay dpy, struct wl_display *display);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryWaylandBufferWL (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value);
+#endif
+#endif /* EGL_WL_bind_wayland_display */
+
+#ifndef EGL_WL_create_wayland_buffer_from_image
+#define EGL_WL_create_wayland_buffer_from_image 1
+#define PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC
+struct wl_buffer;
+typedef struct wl_buffer *(EGLAPIENTRYP PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC) (EGLDisplay dpy, EGLImageKHR image);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI struct wl_buffer *EGLAPIENTRY eglCreateWaylandBufferFromImageWL (EGLDisplay dpy, EGLImageKHR image);
+#endif
+#endif /* EGL_WL_create_wayland_buffer_from_image */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __eglext_h_ */
+
+#endif /* _MSC_VER */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_endian.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_endian.h
new file mode 100644
index 0000000..cb3d7f3
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_endian.h
@@ -0,0 +1,535 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryEndian
+ *
+ * Functions for reading and writing endian-specific values.
+ */
+
+#ifndef SDL_endian_h_
+#define SDL_endian_h_
+
+#include
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+/* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version,
+ so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */
+#ifdef __clang__
+#ifndef __PRFCHWINTRIN_H
+#define __PRFCHWINTRIN_H
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_m_prefetch(void *__P)
+{
+ __builtin_prefetch(__P, 0, 3 /* _MM_HINT_T0 */);
+}
+#endif /* __PRFCHWINTRIN_H */
+#endif /* __clang__ */
+
+#include
+#endif
+
+/**
+ * \name The two types of endianness
+ */
+/* @{ */
+#define SDL_LIL_ENDIAN 1234
+#define SDL_BIG_ENDIAN 4321
+/* @} */
+
+#ifndef SDL_BYTEORDER
+#ifdef SDL_PLATFORM_LINUX
+#include
+#define SDL_BYTEORDER __BYTE_ORDER
+#elif defined(SDL_PLATFORM_SOLARIS)
+#include
+#if defined(_LITTLE_ENDIAN)
+#define SDL_BYTEORDER SDL_LIL_ENDIAN
+#elif defined(_BIG_ENDIAN)
+#define SDL_BYTEORDER SDL_BIG_ENDIAN
+#else
+#error Unsupported endianness
+#endif
+#elif defined(SDL_PLATFORM_OPENBSD) || defined(__DragonFly__)
+#include
+#define SDL_BYTEORDER BYTE_ORDER
+#elif defined(SDL_PLATFORM_FREEBSD) || defined(SDL_PLATFORM_NETBSD)
+#include
+#define SDL_BYTEORDER BYTE_ORDER
+/* predefs from newer gcc and clang versions: */
+#elif defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__BYTE_ORDER__)
+#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+#define SDL_BYTEORDER SDL_LIL_ENDIAN
+#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+#define SDL_BYTEORDER SDL_BIG_ENDIAN
+#else
+#error Unsupported endianness
+#endif /**/
+#else
+#if defined(__hppa__) || \
+ defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
+ (defined(__MIPS__) && defined(__MIPSEB__)) || \
+ defined(__ppc__) || defined(__POWERPC__) || defined(__powerpc__) || defined(__PPC__) || \
+ defined(__sparc__) || defined(__sparc)
+#define SDL_BYTEORDER SDL_BIG_ENDIAN
+#else
+#define SDL_BYTEORDER SDL_LIL_ENDIAN
+#endif
+#endif /* SDL_PLATFORM_LINUX */
+#endif /* !SDL_BYTEORDER */
+
+#ifndef SDL_FLOATWORDORDER
+/* predefs from newer gcc versions: */
+#if defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__FLOAT_WORD_ORDER__)
+#if (__FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+#define SDL_FLOATWORDORDER SDL_LIL_ENDIAN
+#elif (__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__)
+#define SDL_FLOATWORDORDER SDL_BIG_ENDIAN
+#else
+#error Unsupported endianness
+#endif /**/
+#elif defined(__MAVERICK__)
+/* For Maverick, float words are always little-endian. */
+#define SDL_FLOATWORDORDER SDL_LIL_ENDIAN
+#elif (defined(__arm__) || defined(__thumb__)) && !defined(__VFP_FP__) && !defined(__ARM_EABI__)
+/* For FPA, float words are always big-endian. */
+#define SDL_FLOATWORDORDER SDL_BIG_ENDIAN
+#else
+/* By default, assume that floats words follow the memory system mode. */
+#define SDL_FLOATWORDORDER SDL_BYTEORDER
+#endif /* __FLOAT_WORD_ORDER__ */
+#endif /* !SDL_FLOATWORDORDER */
+
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \file SDL_endian.h
+ */
+
+/* various modern compilers may have builtin swap */
+#if defined(__GNUC__) || defined(__clang__)
+# define HAS_BUILTIN_BSWAP16 (SDL_HAS_BUILTIN(__builtin_bswap16)) || \
+ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))
+# define HAS_BUILTIN_BSWAP32 (SDL_HAS_BUILTIN(__builtin_bswap32)) || \
+ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
+# define HAS_BUILTIN_BSWAP64 (SDL_HAS_BUILTIN(__builtin_bswap64)) || \
+ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
+
+ /* this one is broken */
+# define HAS_BROKEN_BSWAP (__GNUC__ == 2 && __GNUC_MINOR__ <= 95)
+#else
+# define HAS_BUILTIN_BSWAP16 0
+# define HAS_BUILTIN_BSWAP32 0
+# define HAS_BUILTIN_BSWAP64 0
+# define HAS_BROKEN_BSWAP 0
+#endif
+
+/* Byte swap 16-bit integer. */
+#if HAS_BUILTIN_BSWAP16
+#define SDL_Swap16(x) __builtin_bswap16(x)
+#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL)
+#pragma intrinsic(_byteswap_ushort)
+#define SDL_Swap16(x) _byteswap_ushort(x)
+#elif defined(__i386__) && !HAS_BROKEN_BSWAP
+SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
+{
+ __asm__("xchgb %b0,%h0": "=q"(x):"0"(x));
+ return x;
+}
+#elif defined(__x86_64__)
+SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
+{
+ __asm__("xchgb %b0,%h0": "=Q"(x):"0"(x));
+ return x;
+}
+#elif (defined(__powerpc__) || defined(__ppc__))
+SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
+{
+ int result;
+
+ __asm__("rlwimi %0,%2,8,16,23": "=&r"(result):"0"(x >> 8), "r"(x));
+ return (Uint16)result;
+}
+#elif (defined(__m68k__) && !defined(__mcoldfire__))
+SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
+{
+ __asm__("rorw #8,%0": "=d"(x): "0"(x):"cc");
+ return x;
+}
+#elif defined(__WATCOMC__) && defined(__386__)
+extern __inline Uint16 SDL_Swap16(Uint16);
+#pragma aux SDL_Swap16 = \
+ "xchg al, ah" \
+ parm [ax] \
+ modify [ax];
+#else
+SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
+{
+ return SDL_static_cast(Uint16, ((x << 8) | (x >> 8)));
+}
+#endif
+
+/* Byte swap 32-bit integer. */
+#if HAS_BUILTIN_BSWAP32
+#define SDL_Swap32(x) __builtin_bswap32(x)
+#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL)
+#pragma intrinsic(_byteswap_ulong)
+#define SDL_Swap32(x) _byteswap_ulong(x)
+#elif defined(__i386__) && !HAS_BROKEN_BSWAP
+SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
+{
+ __asm__("bswap %0": "=r"(x):"0"(x));
+ return x;
+}
+#elif defined(__x86_64__)
+SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
+{
+ __asm__("bswapl %0": "=r"(x):"0"(x));
+ return x;
+}
+#elif (defined(__powerpc__) || defined(__ppc__))
+SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
+{
+ Uint32 result;
+
+ __asm__("rlwimi %0,%2,24,16,23": "=&r"(result): "0" (x>>24), "r"(x));
+ __asm__("rlwimi %0,%2,8,8,15" : "=&r"(result): "0" (result), "r"(x));
+ __asm__("rlwimi %0,%2,24,0,7" : "=&r"(result): "0" (result), "r"(x));
+ return result;
+}
+#elif (defined(__m68k__) && !defined(__mcoldfire__))
+SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
+{
+ __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0": "=d"(x): "0"(x):"cc");
+ return x;
+}
+#elif defined(__WATCOMC__) && defined(__386__)
+extern __inline Uint32 SDL_Swap32(Uint32);
+#pragma aux SDL_Swap32 = \
+ "bswap eax" \
+ parm [eax] \
+ modify [eax];
+#else
+SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
+{
+ return SDL_static_cast(Uint32, ((x << 24) | ((x << 8) & 0x00FF0000) |
+ ((x >> 8) & 0x0000FF00) | (x >> 24)));
+}
+#endif
+
+/* Byte swap 64-bit integer. */
+#if HAS_BUILTIN_BSWAP64
+#define SDL_Swap64(x) __builtin_bswap64(x)
+#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL)
+#pragma intrinsic(_byteswap_uint64)
+#define SDL_Swap64(x) _byteswap_uint64(x)
+#elif defined(__i386__) && !HAS_BROKEN_BSWAP
+SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x)
+{
+ union {
+ struct {
+ Uint32 a, b;
+ } s;
+ Uint64 u;
+ } v;
+ v.u = x;
+ __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1"
+ : "=r"(v.s.a), "=r"(v.s.b)
+ : "0" (v.s.a), "1"(v.s.b));
+ return v.u;
+}
+#elif defined(__x86_64__)
+SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x)
+{
+ __asm__("bswapq %0": "=r"(x):"0"(x));
+ return x;
+}
+#elif defined(__WATCOMC__) && defined(__386__)
+extern __inline Uint64 SDL_Swap64(Uint64);
+#pragma aux SDL_Swap64 = \
+ "bswap eax" \
+ "bswap edx" \
+ "xchg eax,edx" \
+ parm [eax edx] \
+ modify [eax edx];
+#else
+SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x)
+{
+ Uint32 hi, lo;
+
+ /* Separate into high and low 32-bit values and swap them */
+ lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF);
+ x >>= 32;
+ hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF);
+ x = SDL_Swap32(lo);
+ x <<= 32;
+ x |= SDL_Swap32(hi);
+ return (x);
+}
+#endif
+
+
+/**
+ * Byte-swap a floating point number.
+ *
+ * This will always byte-swap the value, whether it's currently in the native
+ * byteorder of the system or not. You should use SDL_SwapFloatLE or
+ * SDL_SwapFloatBE instead, in most cases.
+ *
+ * Note that this is a forced-inline function in a header, and not a public
+ * API function available in the SDL library (which is to say, the code is
+ * embedded in the calling program and the linker and dynamic loader will not
+ * be able to find this function inside SDL itself).
+ *
+ * \param x the value to byte-swap.
+ * \returns x, with its bytes in the opposite endian order.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+SDL_FORCE_INLINE float SDL_SwapFloat(float x)
+{
+ union {
+ float f;
+ Uint32 ui32;
+ } swapper;
+ swapper.f = x;
+ swapper.ui32 = SDL_Swap32(swapper.ui32);
+ return swapper.f;
+}
+
+/* remove extra macros */
+#undef HAS_BROKEN_BSWAP
+#undef HAS_BUILTIN_BSWAP16
+#undef HAS_BUILTIN_BSWAP32
+#undef HAS_BUILTIN_BSWAP64
+
+
+#ifdef SDL_WIKI_DOCUMENTATION_SECTION
+
+/**
+ * Byte-swap an unsigned 16-bit number.
+ *
+ * This will always byte-swap the value, whether it's currently in the native
+ * byteorder of the system or not. You should use SDL_Swap16LE or SDL_Swap16BE
+ * instead, in most cases.
+ *
+ * Note that this is a forced-inline function in a header, and not a public
+ * API function available in the SDL library (which is to say, the code is
+ * embedded in the calling program and the linker and dynamic loader will not
+ * be able to find this function inside SDL itself).
+ *
+ * \param x the value to byte-swap.
+ * \returns `x`, with its bytes in the opposite endian order.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { return x_but_byteswapped; }
+
+/**
+ * Byte-swap an unsigned 32-bit number.
+ *
+ * This will always byte-swap the value, whether it's currently in the native
+ * byteorder of the system or not. You should use SDL_Swap32LE or SDL_Swap32BE
+ * instead, in most cases.
+ *
+ * Note that this is a forced-inline function in a header, and not a public
+ * API function available in the SDL library (which is to say, the code is
+ * embedded in the calling program and the linker and dynamic loader will not
+ * be able to find this function inside SDL itself).
+ *
+ * \param x the value to byte-swap.
+ * \returns `x`, with its bytes in the opposite endian order.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { return x_but_byteswapped; }
+
+/**
+ * Byte-swap an unsigned 64-bit number.
+ *
+ * This will always byte-swap the value, whether it's currently in the native
+ * byteorder of the system or not. You should use SDL_Swap64LE or SDL_Swap64BE
+ * instead, in most cases.
+ *
+ * Note that this is a forced-inline function in a header, and not a public
+ * API function available in the SDL library (which is to say, the code is
+ * embedded in the calling program and the linker and dynamic loader will not
+ * be able to find this function inside SDL itself).
+ *
+ * \param x the value to byte-swap.
+ * \returns `x`, with its bytes in the opposite endian order.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; }
+
+/**
+ * Swap a 16-bit value from littleendian to native byte order.
+ *
+ * If this is running on a littleendian system, `x` is returned unchanged.
+ *
+ * This macro never references `x` more than once, avoiding side effects.
+ *
+ * \param x the value to swap, in littleendian byte order.
+ * \returns `x` in native byte order.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_Swap16LE(x) SwapOnlyIfNecessary(x)
+
+/**
+ * Swap a 32-bit value from littleendian to native byte order.
+ *
+ * If this is running on a littleendian system, `x` is returned unchanged.
+ *
+ * This macro never references `x` more than once, avoiding side effects.
+ *
+ * \param x the value to swap, in littleendian byte order.
+ * \returns `x` in native byte order.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_Swap32LE(x) SwapOnlyIfNecessary(x)
+
+/**
+ * Swap a 64-bit value from littleendian to native byte order.
+ *
+ * If this is running on a littleendian system, `x` is returned unchanged.
+ *
+ * This macro never references `x` more than once, avoiding side effects.
+ *
+ * \param x the value to swap, in littleendian byte order.
+ * \returns `x` in native byte order.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_Swap64LE(x) SwapOnlyIfNecessary(x)
+
+/**
+ * Swap a floating point value from littleendian to native byte order.
+ *
+ * If this is running on a littleendian system, `x` is returned unchanged.
+ *
+ * This macro never references `x` more than once, avoiding side effects.
+ *
+ * \param x the value to swap, in littleendian byte order.
+ * \returns `x` in native byte order.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_SwapFloatLE(x) SwapOnlyIfNecessary(x)
+
+/**
+ * Swap a 16-bit value from bigendian to native byte order.
+ *
+ * If this is running on a bigendian system, `x` is returned unchanged.
+ *
+ * This macro never references `x` more than once, avoiding side effects.
+ *
+ * \param x the value to swap, in bigendian byte order.
+ * \returns `x` in native byte order.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_Swap16BE(x) SwapOnlyIfNecessary(x)
+
+/**
+ * Swap a 32-bit value from bigendian to native byte order.
+ *
+ * If this is running on a bigendian system, `x` is returned unchanged.
+ *
+ * This macro never references `x` more than once, avoiding side effects.
+ *
+ * \param x the value to swap, in bigendian byte order.
+ * \returns `x` in native byte order.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_Swap32BE(x) SwapOnlyIfNecessary(x)
+
+/**
+ * Swap a 64-bit value from bigendian to native byte order.
+ *
+ * If this is running on a bigendian system, `x` is returned unchanged.
+ *
+ * This macro never references `x` more than once, avoiding side effects.
+ *
+ * \param x the value to swap, in bigendian byte order.
+ * \returns `x` in native byte order.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_Swap64BE(x) SwapOnlyIfNecessary(x)
+
+/**
+ * Swap a floating point value from bigendian to native byte order.
+ *
+ * If this is running on a bigendian system, `x` is returned unchanged.
+ *
+ * This macro never references `x` more than once, avoiding side effects.
+ *
+ * \param x the value to swap, in bigendian byte order.
+ * \returns `x` in native byte order.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_SwapFloatBE(x) SwapOnlyIfNecessary(x)
+
+#elif SDL_BYTEORDER == SDL_LIL_ENDIAN
+#define SDL_Swap16LE(x) (x)
+#define SDL_Swap32LE(x) (x)
+#define SDL_Swap64LE(x) (x)
+#define SDL_SwapFloatLE(x) (x)
+#define SDL_Swap16BE(x) SDL_Swap16(x)
+#define SDL_Swap32BE(x) SDL_Swap32(x)
+#define SDL_Swap64BE(x) SDL_Swap64(x)
+#define SDL_SwapFloatBE(x) SDL_SwapFloat(x)
+#else
+#define SDL_Swap16LE(x) SDL_Swap16(x)
+#define SDL_Swap32LE(x) SDL_Swap32(x)
+#define SDL_Swap64LE(x) SDL_Swap64(x)
+#define SDL_SwapFloatLE(x) SDL_SwapFloat(x)
+#define SDL_Swap16BE(x) (x)
+#define SDL_Swap32BE(x) (x)
+#define SDL_Swap64BE(x) (x)
+#define SDL_SwapFloatBE(x) (x)
+#endif
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_endian_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_error.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_error.h
new file mode 100644
index 0000000..75e8370
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_error.h
@@ -0,0 +1,143 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryError
+ *
+ * Simple error message routines for SDL.
+ */
+
+#ifndef SDL_error_h_
+#define SDL_error_h_
+
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Public functions */
+
+
+/**
+ * Set the SDL error message for the current thread.
+ *
+ * Calling this function will replace any previous error message that was set.
+ *
+ * This function always returns -1, since SDL frequently uses -1 to signify an
+ * failing result, leading to this idiom:
+ *
+ * ```c
+ * if (error_code) {
+ * return SDL_SetError("This operation has failed: %d", error_code);
+ * }
+ * ```
+ *
+ * \param fmt a printf()-style message format string.
+ * \param ... additional parameters matching % tokens in the `fmt` string, if
+ * any.
+ * \returns -1.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_ClearError
+ * \sa SDL_GetError
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1);
+
+/**
+ * Set an error indicating that memory allocation failed.
+ *
+ * This function does not do any memory allocation.
+ *
+ * \returns -1.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_OutOfMemory(void);
+
+/**
+ * Retrieve a message about the last error that occurred on the current
+ * thread.
+ *
+ * It is possible for multiple errors to occur before calling SDL_GetError().
+ * Only the last error is returned.
+ *
+ * The message is only applicable when an SDL function has signaled an error.
+ * You must check the return values of SDL function calls to determine when to
+ * appropriately call SDL_GetError(). You should *not* use the results of
+ * SDL_GetError() to decide if an error has occurred! Sometimes SDL will set
+ * an error string even when reporting success.
+ *
+ * SDL will *not* clear the error string for successful API calls. You *must*
+ * check return values for failure cases before you can assume the error
+ * string applies.
+ *
+ * Error strings are set per-thread, so an error set in a different thread
+ * will not interfere with the current thread's operation.
+ *
+ * The returned value is a thread-local string which will remain valid until
+ * the current thread's error string is changed. The caller should make a copy
+ * if the value is needed after the next SDL API call.
+ *
+ * \returns a message with information about the specific error that occurred,
+ * or an empty string if there hasn't been an error message set since
+ * the last call to SDL_ClearError().
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_ClearError
+ * \sa SDL_SetError
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetError(void);
+
+/**
+ * Clear any previous error message for this thread.
+ *
+ * \returns 0.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetError
+ * \sa SDL_SetError
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_ClearError(void);
+
+/**
+ * \name Internal error functions
+ *
+ * \internal
+ * Private error reporting function - used internally.
+ */
+/* @{ */
+#define SDL_Unsupported() SDL_SetError("That operation is not supported")
+#define SDL_InvalidParamError(param) SDL_SetError("Parameter '%s' is invalid", (param))
+/* @} *//* Internal error functions */
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_error_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_events.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_events.h
new file mode 100644
index 0000000..4c113f9
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_events.h
@@ -0,0 +1,1423 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryEvents
+ *
+ * Event queue management.
+ */
+
+#ifndef SDL_events_h_
+#define SDL_events_h_
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* General keyboard/mouse/pen state definitions */
+
+/**
+ * A value that signifies a button is no longer pressed.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_PRESSED
+ */
+#define SDL_RELEASED 0
+
+/**
+ * A value that signifies a button has been pressed down.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_RELEASED
+ */
+#define SDL_PRESSED 1
+
+
+/**
+ * The types of events that can be delivered.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ */
+typedef enum SDL_EventType
+{
+ SDL_EVENT_FIRST = 0, /**< Unused (do not remove) */
+
+ /* Application events */
+ SDL_EVENT_QUIT = 0x100, /**< User-requested quit */
+
+ /* These application events have special meaning on iOS and Android, see README-ios.md and README-android.md for details */
+ SDL_EVENT_TERMINATING, /**< The application is being terminated by the OS. This event must be handled in a callback set with SDL_AddEventWatch().
+ Called on iOS in applicationWillTerminate()
+ Called on Android in onDestroy()
+ */
+ SDL_EVENT_LOW_MEMORY, /**< The application is low on memory, free memory if possible. This event must be handled in a callback set with SDL_AddEventWatch().
+ Called on iOS in applicationDidReceiveMemoryWarning()
+ Called on Android in onTrimMemory()
+ */
+ SDL_EVENT_WILL_ENTER_BACKGROUND, /**< The application is about to enter the background. This event must be handled in a callback set with SDL_AddEventWatch().
+ Called on iOS in applicationWillResignActive()
+ Called on Android in onPause()
+ */
+ SDL_EVENT_DID_ENTER_BACKGROUND, /**< The application did enter the background and may not get CPU for some time. This event must be handled in a callback set with SDL_AddEventWatch().
+ Called on iOS in applicationDidEnterBackground()
+ Called on Android in onPause()
+ */
+ SDL_EVENT_WILL_ENTER_FOREGROUND, /**< The application is about to enter the foreground. This event must be handled in a callback set with SDL_AddEventWatch().
+ Called on iOS in applicationWillEnterForeground()
+ Called on Android in onResume()
+ */
+ SDL_EVENT_DID_ENTER_FOREGROUND, /**< The application is now interactive. This event must be handled in a callback set with SDL_AddEventWatch().
+ Called on iOS in applicationDidBecomeActive()
+ Called on Android in onResume()
+ */
+
+ SDL_EVENT_LOCALE_CHANGED, /**< The user's locale preferences have changed. */
+
+ SDL_EVENT_SYSTEM_THEME_CHANGED, /**< The system theme changed */
+
+ /* Display events */
+ /* 0x150 was SDL_DISPLAYEVENT, reserve the number for sdl2-compat */
+ SDL_EVENT_DISPLAY_ORIENTATION = 0x151, /**< Display orientation has changed to data1 */
+ SDL_EVENT_DISPLAY_ADDED, /**< Display has been added to the system */
+ SDL_EVENT_DISPLAY_REMOVED, /**< Display has been removed from the system */
+ SDL_EVENT_DISPLAY_MOVED, /**< Display has changed position */
+ SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED, /**< Display has changed desktop mode */
+ SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED, /**< Display has changed current mode */
+ SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED, /**< Display has changed content scale */
+ SDL_EVENT_DISPLAY_FIRST = SDL_EVENT_DISPLAY_ORIENTATION,
+ SDL_EVENT_DISPLAY_LAST = SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED,
+
+ /* Window events */
+ /* 0x200 was SDL_WINDOWEVENT, reserve the number for sdl2-compat */
+ /* 0x201 was SDL_EVENT_SYSWM, reserve the number for sdl2-compat */
+ SDL_EVENT_WINDOW_SHOWN = 0x202, /**< Window has been shown */
+ SDL_EVENT_WINDOW_HIDDEN, /**< Window has been hidden */
+ SDL_EVENT_WINDOW_EXPOSED, /**< Window has been exposed and should be redrawn, and can be redrawn directly from event watchers for this event */
+ SDL_EVENT_WINDOW_MOVED, /**< Window has been moved to data1, data2 */
+ SDL_EVENT_WINDOW_RESIZED, /**< Window has been resized to data1xdata2 */
+ SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED,/**< The pixel size of the window has changed to data1xdata2 */
+ SDL_EVENT_WINDOW_METAL_VIEW_RESIZED,/**< The pixel size of a Metal view associated with the window has changed */
+ SDL_EVENT_WINDOW_MINIMIZED, /**< Window has been minimized */
+ SDL_EVENT_WINDOW_MAXIMIZED, /**< Window has been maximized */
+ SDL_EVENT_WINDOW_RESTORED, /**< Window has been restored to normal size and position */
+ SDL_EVENT_WINDOW_MOUSE_ENTER, /**< Window has gained mouse focus */
+ SDL_EVENT_WINDOW_MOUSE_LEAVE, /**< Window has lost mouse focus */
+ SDL_EVENT_WINDOW_FOCUS_GAINED, /**< Window has gained keyboard focus */
+ SDL_EVENT_WINDOW_FOCUS_LOST, /**< Window has lost keyboard focus */
+ SDL_EVENT_WINDOW_CLOSE_REQUESTED, /**< The window manager requests that the window be closed */
+ SDL_EVENT_WINDOW_HIT_TEST, /**< Window had a hit test that wasn't SDL_HITTEST_NORMAL */
+ SDL_EVENT_WINDOW_ICCPROF_CHANGED, /**< The ICC profile of the window's display has changed */
+ SDL_EVENT_WINDOW_DISPLAY_CHANGED, /**< Window has been moved to display data1 */
+ SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED, /**< Window display scale has been changed */
+ SDL_EVENT_WINDOW_SAFE_AREA_CHANGED, /**< The window safe area has been changed */
+ SDL_EVENT_WINDOW_OCCLUDED, /**< The window has been occluded */
+ SDL_EVENT_WINDOW_ENTER_FULLSCREEN, /**< The window has entered fullscreen mode */
+ SDL_EVENT_WINDOW_LEAVE_FULLSCREEN, /**< The window has left fullscreen mode */
+ SDL_EVENT_WINDOW_DESTROYED, /**< The window with the associated ID is being or has been destroyed. If this message is being handled
+ in an event watcher, the window handle is still valid and can still be used to retrieve any userdata
+ associated with the window. Otherwise, the handle has already been destroyed and all resources
+ associated with it are invalid */
+ SDL_EVENT_WINDOW_PEN_ENTER, /**< Window has gained focus of the pressure-sensitive pen with ID "data1" */
+ SDL_EVENT_WINDOW_PEN_LEAVE, /**< Window has lost focus of the pressure-sensitive pen with ID "data1" */
+ SDL_EVENT_WINDOW_HDR_STATE_CHANGED, /**< Window HDR properties have changed */
+ SDL_EVENT_WINDOW_FIRST = SDL_EVENT_WINDOW_SHOWN,
+ SDL_EVENT_WINDOW_LAST = SDL_EVENT_WINDOW_HDR_STATE_CHANGED,
+
+ /* Keyboard events */
+ SDL_EVENT_KEY_DOWN = 0x300, /**< Key pressed */
+ SDL_EVENT_KEY_UP, /**< Key released */
+ SDL_EVENT_TEXT_EDITING, /**< Keyboard text editing (composition) */
+ SDL_EVENT_TEXT_INPUT, /**< Keyboard text input */
+ SDL_EVENT_KEYMAP_CHANGED, /**< Keymap changed due to a system event such as an
+ input language or keyboard layout change. */
+ SDL_EVENT_KEYBOARD_ADDED, /**< A new keyboard has been inserted into the system */
+ SDL_EVENT_KEYBOARD_REMOVED, /**< A keyboard has been removed */
+ SDL_EVENT_TEXT_EDITING_CANDIDATES, /**< Keyboard text editing candidates */
+
+ /* Mouse events */
+ SDL_EVENT_MOUSE_MOTION = 0x400, /**< Mouse moved */
+ SDL_EVENT_MOUSE_BUTTON_DOWN, /**< Mouse button pressed */
+ SDL_EVENT_MOUSE_BUTTON_UP, /**< Mouse button released */
+ SDL_EVENT_MOUSE_WHEEL, /**< Mouse wheel motion */
+ SDL_EVENT_MOUSE_ADDED, /**< A new mouse has been inserted into the system */
+ SDL_EVENT_MOUSE_REMOVED, /**< A mouse has been removed */
+
+ /* Joystick events */
+ SDL_EVENT_JOYSTICK_AXIS_MOTION = 0x600, /**< Joystick axis motion */
+ SDL_EVENT_JOYSTICK_BALL_MOTION, /**< Joystick trackball motion */
+ SDL_EVENT_JOYSTICK_HAT_MOTION, /**< Joystick hat position change */
+ SDL_EVENT_JOYSTICK_BUTTON_DOWN, /**< Joystick button pressed */
+ SDL_EVENT_JOYSTICK_BUTTON_UP, /**< Joystick button released */
+ SDL_EVENT_JOYSTICK_ADDED, /**< A new joystick has been inserted into the system */
+ SDL_EVENT_JOYSTICK_REMOVED, /**< An opened joystick has been removed */
+ SDL_EVENT_JOYSTICK_BATTERY_UPDATED, /**< Joystick battery level change */
+ SDL_EVENT_JOYSTICK_UPDATE_COMPLETE, /**< Joystick update is complete */
+
+ /* Gamepad events */
+ SDL_EVENT_GAMEPAD_AXIS_MOTION = 0x650, /**< Gamepad axis motion */
+ SDL_EVENT_GAMEPAD_BUTTON_DOWN, /**< Gamepad button pressed */
+ SDL_EVENT_GAMEPAD_BUTTON_UP, /**< Gamepad button released */
+ SDL_EVENT_GAMEPAD_ADDED, /**< A new gamepad has been inserted into the system */
+ SDL_EVENT_GAMEPAD_REMOVED, /**< A gamepad has been removed */
+ SDL_EVENT_GAMEPAD_REMAPPED, /**< The gamepad mapping was updated */
+ SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN, /**< Gamepad touchpad was touched */
+ SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION, /**< Gamepad touchpad finger was moved */
+ SDL_EVENT_GAMEPAD_TOUCHPAD_UP, /**< Gamepad touchpad finger was lifted */
+ SDL_EVENT_GAMEPAD_SENSOR_UPDATE, /**< Gamepad sensor was updated */
+ SDL_EVENT_GAMEPAD_UPDATE_COMPLETE, /**< Gamepad update is complete */
+ SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED, /**< Gamepad Steam handle has changed */
+
+ /* Touch events */
+ SDL_EVENT_FINGER_DOWN = 0x700,
+ SDL_EVENT_FINGER_UP,
+ SDL_EVENT_FINGER_MOTION,
+
+ /* 0x800, 0x801, and 0x802 were the Gesture events from SDL2. Do not reuse these values! sdl2-compat needs them! */
+
+ /* Clipboard events */
+ SDL_EVENT_CLIPBOARD_UPDATE = 0x900, /**< The clipboard or primary selection changed */
+
+ /* Drag and drop events */
+ SDL_EVENT_DROP_FILE = 0x1000, /**< The system requests a file open */
+ SDL_EVENT_DROP_TEXT, /**< text/plain drag-and-drop event */
+ SDL_EVENT_DROP_BEGIN, /**< A new set of drops is beginning (NULL filename) */
+ SDL_EVENT_DROP_COMPLETE, /**< Current set of drops is now complete (NULL filename) */
+ SDL_EVENT_DROP_POSITION, /**< Position while moving over the window */
+
+ /* Audio hotplug events */
+ SDL_EVENT_AUDIO_DEVICE_ADDED = 0x1100, /**< A new audio device is available */
+ SDL_EVENT_AUDIO_DEVICE_REMOVED, /**< An audio device has been removed. */
+ SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED, /**< An audio device's format has been changed by the system. */
+
+ /* Sensor events */
+ SDL_EVENT_SENSOR_UPDATE = 0x1200, /**< A sensor was updated */
+
+ /* Pressure-sensitive pen events */
+ SDL_EVENT_PEN_DOWN = 0x1300, /**< Pressure-sensitive pen touched drawing surface */
+ SDL_EVENT_PEN_UP, /**< Pressure-sensitive pen stopped touching drawing surface */
+ SDL_EVENT_PEN_MOTION, /**< Pressure-sensitive pen moved, or angle/pressure changed */
+ SDL_EVENT_PEN_BUTTON_DOWN, /**< Pressure-sensitive pen button pressed */
+ SDL_EVENT_PEN_BUTTON_UP, /**< Pressure-sensitive pen button released */
+
+ /* Camera hotplug events */
+ SDL_EVENT_CAMERA_DEVICE_ADDED = 0x1400, /**< A new camera device is available */
+ SDL_EVENT_CAMERA_DEVICE_REMOVED, /**< A camera device has been removed. */
+ SDL_EVENT_CAMERA_DEVICE_APPROVED, /**< A camera device has been approved for use by the user. */
+ SDL_EVENT_CAMERA_DEVICE_DENIED, /**< A camera device has been denied for use by the user. */
+
+ /* Render events */
+ SDL_EVENT_RENDER_TARGETS_RESET = 0x2000, /**< The render targets have been reset and their contents need to be updated */
+ SDL_EVENT_RENDER_DEVICE_RESET, /**< The device has been reset and all textures need to be recreated */
+
+ /* Internal events */
+ SDL_EVENT_POLL_SENTINEL = 0x7F00, /**< Signals the end of an event poll cycle */
+
+ /** Events SDL_EVENT_USER through SDL_EVENT_LAST are for your use,
+ * and should be allocated with SDL_RegisterEvents()
+ */
+ SDL_EVENT_USER = 0x8000,
+
+ /**
+ * This last event is only for bounding internal arrays
+ */
+ SDL_EVENT_LAST = 0xFFFF,
+
+ /* This just makes sure the enum is the size of Uint32 */
+ SDL_EVENT_ENUM_PADDING = 0x7FFFFFFF
+
+} SDL_EventType;
+
+/**
+ * Fields shared by every event
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_CommonEvent
+{
+ Uint32 type; /**< Event type, shared with all events, Uint32 to cover user events which are not in the SDL_EventType enumeration */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+} SDL_CommonEvent;
+
+/**
+ * Display state change event data (event.display.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_DisplayEvent
+{
+ SDL_EventType type; /**< SDL_DISPLAYEVENT_* */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_DisplayID displayID;/**< The associated display */
+ Sint32 data1; /**< event dependent data */
+ Sint32 data2; /**< event dependent data */
+} SDL_DisplayEvent;
+
+/**
+ * Window state change event data (event.window.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_WindowEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_WINDOW_* */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_WindowID windowID; /**< The associated window */
+ Sint32 data1; /**< event dependent data */
+ Sint32 data2; /**< event dependent data */
+} SDL_WindowEvent;
+
+/**
+ * Keyboard device event structure (event.kdevice.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_KeyboardDeviceEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_KEYBOARD_ADDED or SDL_EVENT_KEYBOARD_REMOVED */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_KeyboardID which; /**< The keyboard instance id */
+} SDL_KeyboardDeviceEvent;
+
+/**
+ * Keyboard button event structure (event.key.*)
+ *
+ * The `key` is the base SDL_Keycode generated by pressing the `scancode`
+ * using the current keyboard layout, applying any options specified in
+ * SDL_HINT_KEYCODE_OPTIONS. You can get the SDL_Keycode corresponding to the
+ * event scancode and modifiers directly from the keyboard layout, bypassing
+ * SDL_HINT_KEYCODE_OPTIONS, by calling SDL_GetKeyFromScancode().
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetKeyFromScancode
+ * \sa SDL_HINT_KEYCODE_OPTIONS
+ */
+typedef struct SDL_KeyboardEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_KEY_DOWN or SDL_EVENT_KEY_UP */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_WindowID windowID; /**< The window with keyboard focus, if any */
+ SDL_KeyboardID which; /**< The keyboard instance id, or 0 if unknown or virtual */
+ SDL_Scancode scancode; /**< SDL physical key code */
+ SDL_Keycode key; /**< SDL virtual key code */
+ SDL_Keymod mod; /**< current key modifiers */
+ Uint16 raw; /**< The platform dependent scancode for this event */
+ Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */
+ Uint8 repeat; /**< Non-zero if this is a key repeat */
+} SDL_KeyboardEvent;
+
+/**
+ * Keyboard text editing event structure (event.edit.*)
+ *
+ * The start cursor is the position, in UTF-8 characters, where new typing
+ * will be inserted into the editing text. The length is the number of UTF-8
+ * characters that will be replaced by new typing.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_TextEditingEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_TEXT_EDITING */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_WindowID windowID; /**< The window with keyboard focus, if any */
+ const char *text; /**< The editing text */
+ Sint32 start; /**< The start cursor of selected editing text, or -1 if not set */
+ Sint32 length; /**< The length of selected editing text, or -1 if not set */
+} SDL_TextEditingEvent;
+
+/**
+ * Keyboard IME candidates event structure (event.edit_candidates.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_TextEditingCandidatesEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_TEXT_EDITING_CANDIDATES */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_WindowID windowID; /**< The window with keyboard focus, if any */
+ const char * const *candidates; /**< The list of candidates, or NULL if there are no candidates available */
+ Sint32 num_candidates; /**< The number of strings in `candidates` */
+ Sint32 selected_candidate; /**< The index of the selected candidate, or -1 if no candidate is selected */
+ SDL_bool horizontal; /**< SDL_TRUE if the list is horizontal, SDL_FALSE if it's vertical */
+} SDL_TextEditingCandidatesEvent;
+
+/**
+ * Keyboard text input event structure (event.text.*)
+ *
+ * This event will never be delivered unless text input is enabled by calling
+ * SDL_StartTextInput(). Text input is disabled by default!
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_StartTextInput
+ * \sa SDL_StopTextInput
+ */
+typedef struct SDL_TextInputEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_TEXT_INPUT */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_WindowID windowID; /**< The window with keyboard focus, if any */
+ const char *text; /**< The input text, UTF-8 encoded */
+} SDL_TextInputEvent;
+
+/**
+ * Mouse device event structure (event.mdevice.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_MouseDeviceEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_MOUSE_ADDED or SDL_EVENT_MOUSE_REMOVED */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_MouseID which; /**< The mouse instance id */
+} SDL_MouseDeviceEvent;
+
+/**
+ * Mouse motion event structure (event.motion.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_MouseMotionEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_MOUSE_MOTION */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_WindowID windowID; /**< The window with mouse focus, if any */
+ SDL_MouseID which; /**< The mouse instance id, SDL_TOUCH_MOUSEID, or SDL_PEN_MOUSEID */
+ SDL_MouseButtonFlags state; /**< The current button state */
+ float x; /**< X coordinate, relative to window */
+ float y; /**< Y coordinate, relative to window */
+ float xrel; /**< The relative motion in the X direction */
+ float yrel; /**< The relative motion in the Y direction */
+} SDL_MouseMotionEvent;
+
+/**
+ * Mouse button event structure (event.button.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_MouseButtonEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_MOUSE_BUTTON_DOWN or SDL_EVENT_MOUSE_BUTTON_UP */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_WindowID windowID; /**< The window with mouse focus, if any */
+ SDL_MouseID which; /**< The mouse instance id, SDL_TOUCH_MOUSEID, or SDL_PEN_MOUSEID */
+ Uint8 button; /**< The mouse button index */
+ Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */
+ Uint8 clicks; /**< 1 for single-click, 2 for double-click, etc. */
+ Uint8 padding;
+ float x; /**< X coordinate, relative to window */
+ float y; /**< Y coordinate, relative to window */
+} SDL_MouseButtonEvent;
+
+/**
+ * Mouse wheel event structure (event.wheel.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_MouseWheelEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_MOUSE_WHEEL */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_WindowID windowID; /**< The window with mouse focus, if any */
+ SDL_MouseID which; /**< The mouse instance id, SDL_TOUCH_MOUSEID, or SDL_PEN_MOUSEID */
+ float x; /**< The amount scrolled horizontally, positive to the right and negative to the left */
+ float y; /**< The amount scrolled vertically, positive away from the user and negative toward the user */
+ SDL_MouseWheelDirection direction; /**< Set to one of the SDL_MOUSEWHEEL_* defines. When FLIPPED the values in X and Y will be opposite. Multiply by -1 to change them back */
+ float mouse_x; /**< X coordinate, relative to window */
+ float mouse_y; /**< Y coordinate, relative to window */
+} SDL_MouseWheelEvent;
+
+/**
+ * Joystick axis motion event structure (event.jaxis.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_JoyAxisEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_JOYSTICK_AXIS_MOTION */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_JoystickID which; /**< The joystick instance id */
+ Uint8 axis; /**< The joystick axis index */
+ Uint8 padding1;
+ Uint8 padding2;
+ Uint8 padding3;
+ Sint16 value; /**< The axis value (range: -32768 to 32767) */
+ Uint16 padding4;
+} SDL_JoyAxisEvent;
+
+/**
+ * Joystick trackball motion event structure (event.jball.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_JoyBallEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_JOYSTICK_BALL_MOTION */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_JoystickID which; /**< The joystick instance id */
+ Uint8 ball; /**< The joystick trackball index */
+ Uint8 padding1;
+ Uint8 padding2;
+ Uint8 padding3;
+ Sint16 xrel; /**< The relative motion in the X direction */
+ Sint16 yrel; /**< The relative motion in the Y direction */
+} SDL_JoyBallEvent;
+
+/**
+ * Joystick hat position change event structure (event.jhat.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_JoyHatEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_JOYSTICK_HAT_MOTION */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_JoystickID which; /**< The joystick instance id */
+ Uint8 hat; /**< The joystick hat index */
+ Uint8 value; /**< The hat position value.
+ * \sa SDL_HAT_LEFTUP SDL_HAT_UP SDL_HAT_RIGHTUP
+ * \sa SDL_HAT_LEFT SDL_HAT_CENTERED SDL_HAT_RIGHT
+ * \sa SDL_HAT_LEFTDOWN SDL_HAT_DOWN SDL_HAT_RIGHTDOWN
+ *
+ * Note that zero means the POV is centered.
+ */
+ Uint8 padding1;
+ Uint8 padding2;
+} SDL_JoyHatEvent;
+
+/**
+ * Joystick button event structure (event.jbutton.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_JoyButtonEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_JOYSTICK_BUTTON_DOWN or SDL_EVENT_JOYSTICK_BUTTON_UP */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_JoystickID which; /**< The joystick instance id */
+ Uint8 button; /**< The joystick button index */
+ Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */
+ Uint8 padding1;
+ Uint8 padding2;
+} SDL_JoyButtonEvent;
+
+/**
+ * Joystick device event structure (event.jdevice.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_JoyDeviceEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_JOYSTICK_ADDED or SDL_EVENT_JOYSTICK_REMOVED or SDL_EVENT_JOYSTICK_UPDATE_COMPLETE */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_JoystickID which; /**< The joystick instance id */
+} SDL_JoyDeviceEvent;
+
+/**
+ * Joysick battery level change event structure (event.jbattery.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_JoyBatteryEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_JOYSTICK_BATTERY_UPDATED */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_JoystickID which; /**< The joystick instance id */
+ SDL_PowerState state; /**< The joystick battery state */
+ int percent; /**< The joystick battery percent charge remaining */
+} SDL_JoyBatteryEvent;
+
+/**
+ * Gamepad axis motion event structure (event.gaxis.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_GamepadAxisEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_GAMEPAD_AXIS_MOTION */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_JoystickID which; /**< The joystick instance id */
+ Uint8 axis; /**< The gamepad axis (SDL_GamepadAxis) */
+ Uint8 padding1;
+ Uint8 padding2;
+ Uint8 padding3;
+ Sint16 value; /**< The axis value (range: -32768 to 32767) */
+ Uint16 padding4;
+} SDL_GamepadAxisEvent;
+
+
+/**
+ * Gamepad button event structure (event.gbutton.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_GamepadButtonEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_GAMEPAD_BUTTON_DOWN or SDL_EVENT_GAMEPAD_BUTTON_UP */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_JoystickID which; /**< The joystick instance id */
+ Uint8 button; /**< The gamepad button (SDL_GamepadButton) */
+ Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */
+ Uint8 padding1;
+ Uint8 padding2;
+} SDL_GamepadButtonEvent;
+
+
+/**
+ * Gamepad device event structure (event.gdevice.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_GamepadDeviceEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_GAMEPAD_ADDED, SDL_EVENT_GAMEPAD_REMOVED, or SDL_EVENT_GAMEPAD_REMAPPED, SDL_EVENT_GAMEPAD_UPDATE_COMPLETE or SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_JoystickID which; /**< The joystick instance id */
+} SDL_GamepadDeviceEvent;
+
+/**
+ * Gamepad touchpad event structure (event.gtouchpad.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_GamepadTouchpadEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN or SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION or SDL_EVENT_GAMEPAD_TOUCHPAD_UP */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_JoystickID which; /**< The joystick instance id */
+ Sint32 touchpad; /**< The index of the touchpad */
+ Sint32 finger; /**< The index of the finger on the touchpad */
+ float x; /**< Normalized in the range 0...1 with 0 being on the left */
+ float y; /**< Normalized in the range 0...1 with 0 being at the top */
+ float pressure; /**< Normalized in the range 0...1 */
+} SDL_GamepadTouchpadEvent;
+
+/**
+ * Gamepad sensor event structure (event.gsensor.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_GamepadSensorEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_GAMEPAD_SENSOR_UPDATE */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_JoystickID which; /**< The joystick instance id */
+ Sint32 sensor; /**< The type of the sensor, one of the values of SDL_SensorType */
+ float data[3]; /**< Up to 3 values from the sensor, as defined in SDL_sensor.h */
+ Uint64 sensor_timestamp; /**< The timestamp of the sensor reading in nanoseconds, not necessarily synchronized with the system clock */
+} SDL_GamepadSensorEvent;
+
+/**
+ * Audio device event structure (event.adevice.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_AudioDeviceEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_AUDIO_DEVICE_ADDED, or SDL_EVENT_AUDIO_DEVICE_REMOVED, or SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_AudioDeviceID which; /**< SDL_AudioDeviceID for the device being added or removed or changing */
+ Uint8 recording; /**< zero if a playback device, non-zero if a recording device. */
+ Uint8 padding1;
+ Uint8 padding2;
+ Uint8 padding3;
+} SDL_AudioDeviceEvent;
+
+/**
+ * Camera device event structure (event.cdevice.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_CameraDeviceEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_CAMERA_DEVICE_ADDED, SDL_EVENT_CAMERA_DEVICE_REMOVED, SDL_EVENT_CAMERA_DEVICE_APPROVED, SDL_EVENT_CAMERA_DEVICE_DENIED */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_CameraID which; /**< SDL_CameraID for the device being added or removed or changing */
+} SDL_CameraDeviceEvent;
+
+/**
+ * Touch finger event structure (event.tfinger.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_TouchFingerEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_FINGER_MOTION or SDL_EVENT_FINGER_DOWN or SDL_EVENT_FINGER_UP */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_TouchID touchID; /**< The touch device id */
+ SDL_FingerID fingerID;
+ float x; /**< Normalized in the range 0...1 */
+ float y; /**< Normalized in the range 0...1 */
+ float dx; /**< Normalized in the range -1...1 */
+ float dy; /**< Normalized in the range -1...1 */
+ float pressure; /**< Normalized in the range 0...1 */
+ SDL_WindowID windowID; /**< The window underneath the finger, if any */
+} SDL_TouchFingerEvent;
+
+
+/**
+ * Pressure-sensitive pen touched or stopped touching surface (event.ptip.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_PenTipEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_PEN_DOWN or SDL_EVENT_PEN_UP */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_WindowID windowID; /**< The window with pen focus, if any */
+ SDL_PenID which; /**< The pen instance id */
+ Uint8 tip; /**< SDL_PEN_TIP_INK when using a regular pen tip, or SDL_PEN_TIP_ERASER if the pen is being used as an eraser (e.g., flipped to use the eraser tip) */
+ Uint8 state; /**< SDL_PRESSED on SDL_EVENT_PEN_DOWN and SDL_RELEASED on SDL_EVENT_PEN_UP */
+ Uint16 pen_state; /**< Pen button masks (where SDL_BUTTON(1) is the first button, SDL_BUTTON(2) is the second button etc.), SDL_PEN_DOWN_MASK is set if the pen is touching the surface, and SDL_PEN_ERASER_MASK is set if the pen is (used as) an eraser. */
+ float x; /**< X coordinate, relative to window */
+ float y; /**< Y coordinate, relative to window */
+ float axes[SDL_PEN_NUM_AXES]; /**< Pen axes such as pressure and tilt (ordered as per SDL_PenAxis) */
+} SDL_PenTipEvent;
+
+/**
+ * Pressure-sensitive pen motion / pressure / angle event structure
+ * (event.pmotion.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_PenMotionEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_PEN_MOTION */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_WindowID windowID; /**< The window with pen focus, if any */
+ SDL_PenID which; /**< The pen instance id */
+ Uint8 padding1;
+ Uint8 padding2;
+ Uint16 pen_state; /**< Pen button masks (where SDL_BUTTON(1) is the first button, SDL_BUTTON(2) is the second button etc.), SDL_PEN_DOWN_MASK is set if the pen is touching the surface, and SDL_PEN_ERASER_MASK is set if the pen is (used as) an eraser. */
+ float x; /**< X coordinate, relative to window */
+ float y; /**< Y coordinate, relative to window */
+ float axes[SDL_PEN_NUM_AXES]; /**< Pen axes such as pressure and tilt (ordered as per SDL_PenAxis) */
+} SDL_PenMotionEvent;
+
+/**
+ * Pressure-sensitive pen button event structure (event.pbutton.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_PenButtonEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_PEN_BUTTON_DOWN or SDL_EVENT_PEN_BUTTON_UP */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_WindowID windowID; /**< The window with pen focus, if any */
+ SDL_PenID which; /**< The pen instance id */
+ Uint8 button; /**< The pen button index (1 represents the pen tip for compatibility with mouse events) */
+ Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */
+ Uint16 pen_state; /**< Pen button masks (where SDL_BUTTON(1) is the first button, SDL_BUTTON(2) is the second button etc.), SDL_PEN_DOWN_MASK is set if the pen is touching the surface, and SDL_PEN_ERASER_MASK is set if the pen is (used as) an eraser. */
+ float x; /**< X coordinate, relative to window */
+ float y; /**< Y coordinate, relative to window */
+ float axes[SDL_PEN_NUM_AXES]; /**< Pen axes such as pressure and tilt (ordered as per SDL_PenAxis) */
+} SDL_PenButtonEvent;
+
+/**
+ * An event used to drop text or request a file open by the system
+ * (event.drop.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_DropEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_DROP_BEGIN or SDL_EVENT_DROP_FILE or SDL_EVENT_DROP_TEXT or SDL_EVENT_DROP_COMPLETE or SDL_EVENT_DROP_POSITION */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_WindowID windowID; /**< The window that was dropped on, if any */
+ float x; /**< X coordinate, relative to window (not on begin) */
+ float y; /**< Y coordinate, relative to window (not on begin) */
+ const char *source; /**< The source app that sent this drop event, or NULL if that isn't available */
+ const char *data; /**< The text for SDL_EVENT_DROP_TEXT and the file name for SDL_EVENT_DROP_FILE, NULL for other events */
+} SDL_DropEvent;
+
+/**
+ * An event triggered when the clipboard contents have changed
+ * (event.clipboard.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_ClipboardEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_CLIPBOARD_UPDATE */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+} SDL_ClipboardEvent;
+
+/**
+ * Sensor event structure (event.sensor.*)
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_SensorEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_SENSOR_UPDATE */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_SensorID which; /**< The instance ID of the sensor */
+ float data[6]; /**< Up to 6 values from the sensor - additional values can be queried using SDL_GetSensorData() */
+ Uint64 sensor_timestamp; /**< The timestamp of the sensor reading in nanoseconds, not necessarily synchronized with the system clock */
+} SDL_SensorEvent;
+
+/**
+ * The "quit requested" event
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_QuitEvent
+{
+ SDL_EventType type; /**< SDL_EVENT_QUIT */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+} SDL_QuitEvent;
+
+/**
+ * A user-defined event type (event.user.*)
+ *
+ * This event is unique; it is never created by SDL, but only by the
+ * application. The event can be pushed onto the event queue using
+ * SDL_PushEvent(). The contents of the structure members are completely up to
+ * the programmer; the only requirement is that '''type''' is a value obtained
+ * from SDL_RegisterEvents().
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_UserEvent
+{
+ Uint32 type; /**< SDL_EVENT_USER through SDL_EVENT_LAST-1, Uint32 because these are not in the SDL_EventType enumeration */
+ Uint32 reserved;
+ Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
+ SDL_WindowID windowID; /**< The associated window if any */
+ Sint32 code; /**< User defined event code */
+ void *data1; /**< User defined data pointer */
+ void *data2; /**< User defined data pointer */
+} SDL_UserEvent;
+
+
+/**
+ * The structure for all events in SDL.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef union SDL_Event
+{
+ Uint32 type; /**< Event type, shared with all events, Uint32 to cover user events which are not in the SDL_EventType enumeration */
+ SDL_CommonEvent common; /**< Common event data */
+ SDL_DisplayEvent display; /**< Display event data */
+ SDL_WindowEvent window; /**< Window event data */
+ SDL_KeyboardDeviceEvent kdevice; /**< Keyboard device change event data */
+ SDL_KeyboardEvent key; /**< Keyboard event data */
+ SDL_TextEditingEvent edit; /**< Text editing event data */
+ SDL_TextEditingCandidatesEvent edit_candidates; /**< Text editing candidates event data */
+ SDL_TextInputEvent text; /**< Text input event data */
+ SDL_MouseDeviceEvent mdevice; /**< Mouse device change event data */
+ SDL_MouseMotionEvent motion; /**< Mouse motion event data */
+ SDL_MouseButtonEvent button; /**< Mouse button event data */
+ SDL_MouseWheelEvent wheel; /**< Mouse wheel event data */
+ SDL_JoyDeviceEvent jdevice; /**< Joystick device change event data */
+ SDL_JoyAxisEvent jaxis; /**< Joystick axis event data */
+ SDL_JoyBallEvent jball; /**< Joystick ball event data */
+ SDL_JoyHatEvent jhat; /**< Joystick hat event data */
+ SDL_JoyButtonEvent jbutton; /**< Joystick button event data */
+ SDL_JoyBatteryEvent jbattery; /**< Joystick battery event data */
+ SDL_GamepadDeviceEvent gdevice; /**< Gamepad device event data */
+ SDL_GamepadAxisEvent gaxis; /**< Gamepad axis event data */
+ SDL_GamepadButtonEvent gbutton; /**< Gamepad button event data */
+ SDL_GamepadTouchpadEvent gtouchpad; /**< Gamepad touchpad event data */
+ SDL_GamepadSensorEvent gsensor; /**< Gamepad sensor event data */
+ SDL_AudioDeviceEvent adevice; /**< Audio device event data */
+ SDL_CameraDeviceEvent cdevice; /**< Camera device event data */
+ SDL_SensorEvent sensor; /**< Sensor event data */
+ SDL_QuitEvent quit; /**< Quit request event data */
+ SDL_UserEvent user; /**< Custom event data */
+ SDL_TouchFingerEvent tfinger; /**< Touch finger event data */
+ SDL_PenTipEvent ptip; /**< Pen tip touching or leaving drawing surface */
+ SDL_PenMotionEvent pmotion; /**< Pen change in position, pressure, or angle */
+ SDL_PenButtonEvent pbutton; /**< Pen button press */
+ SDL_DropEvent drop; /**< Drag and drop event data */
+ SDL_ClipboardEvent clipboard; /**< Clipboard event data */
+
+ /* This is necessary for ABI compatibility between Visual C++ and GCC.
+ Visual C++ will respect the push pack pragma and use 52 bytes (size of
+ SDL_TextEditingEvent, the largest structure for 32-bit and 64-bit
+ architectures) for this union, and GCC will use the alignment of the
+ largest datatype within the union, which is 8 bytes on 64-bit
+ architectures.
+
+ So... we'll add padding to force the size to be the same for both.
+
+ On architectures where pointers are 16 bytes, this needs rounding up to
+ the next multiple of 16, 64, and on architectures where pointers are
+ even larger the size of SDL_UserEvent will dominate as being 3 pointers.
+ */
+ Uint8 padding[128];
+} SDL_Event;
+
+/* Make sure we haven't broken binary compatibility */
+SDL_COMPILE_TIME_ASSERT(SDL_Event, sizeof(SDL_Event) == sizeof(((SDL_Event *)NULL)->padding));
+
+
+/* Function prototypes */
+
+/**
+ * Pump the event loop, gathering events from the input devices.
+ *
+ * This function updates the event queue and internal input device state.
+ *
+ * **WARNING**: This should only be run in the thread that initialized the
+ * video subsystem, and for extra safety, you should consider only doing those
+ * things on the main thread in any case.
+ *
+ * SDL_PumpEvents() gathers all the pending input information from devices and
+ * places it in the event queue. Without calls to SDL_PumpEvents() no events
+ * would ever be placed on the queue. Often the need for calls to
+ * SDL_PumpEvents() is hidden from the user since SDL_PollEvent() and
+ * SDL_WaitEvent() implicitly call SDL_PumpEvents(). However, if you are not
+ * polling or waiting for events (e.g. you are filtering them), then you must
+ * call SDL_PumpEvents() to force an event queue update.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PollEvent
+ * \sa SDL_WaitEvent
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_PumpEvents(void);
+
+/* @{ */
+typedef enum SDL_EventAction
+{
+ SDL_ADDEVENT,
+ SDL_PEEKEVENT,
+ SDL_GETEVENT
+} SDL_EventAction;
+
+/**
+ * Check the event queue for messages and optionally return them.
+ *
+ * `action` may be any of the following:
+ *
+ * - `SDL_ADDEVENT`: up to `numevents` events will be added to the back of the
+ * event queue.
+ * - `SDL_PEEKEVENT`: `numevents` events at the front of the event queue,
+ * within the specified minimum and maximum type, will be returned to the
+ * caller and will _not_ be removed from the queue.
+ * - `SDL_GETEVENT`: up to `numevents` events at the front of the event queue,
+ * within the specified minimum and maximum type, will be returned to the
+ * caller and will be removed from the queue.
+ *
+ * You may have to call SDL_PumpEvents() before calling this function.
+ * Otherwise, the events may not be ready to be filtered when you call
+ * SDL_PeepEvents().
+ *
+ * This function is thread-safe.
+ *
+ * \param events destination buffer for the retrieved events, may be NULL to
+ * leave the events in the queue and return the number of events
+ * that would have been stored.
+ * \param numevents if action is SDL_ADDEVENT, the number of events to add
+ * back to the event queue; if action is SDL_PEEKEVENT or
+ * SDL_GETEVENT, the maximum number of events to retrieve.
+ * \param action action to take; see [[#action|Remarks]] for details.
+ * \param minType minimum value of the event type to be considered;
+ * SDL_EVENT_FIRST is a safe choice.
+ * \param maxType maximum value of the event type to be considered;
+ * SDL_EVENT_LAST is a safe choice.
+ * \returns the number of events actually stored or a negative error code on
+ * failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PollEvent
+ * \sa SDL_PumpEvents
+ * \sa SDL_PushEvent
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event *events, int numevents, SDL_EventAction action, Uint32 minType, Uint32 maxType);
+/* @} */
+
+/**
+ * Check for the existence of a certain event type in the event queue.
+ *
+ * If you need to check for a range of event types, use SDL_HasEvents()
+ * instead.
+ *
+ * \param type the type of event to be queried; see SDL_EventType for details.
+ * \returns SDL_TRUE if events matching `type` are present, or SDL_FALSE if
+ * events matching `type` are not present.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasEvents
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 type);
+
+
+/**
+ * Check for the existence of certain event types in the event queue.
+ *
+ * If you need to check for a single event type, use SDL_HasEvent() instead.
+ *
+ * \param minType the low end of event type to be queried, inclusive; see
+ * SDL_EventType for details.
+ * \param maxType the high end of event type to be queried, inclusive; see
+ * SDL_EventType for details.
+ * \returns SDL_TRUE if events with type >= `minType` and <= `maxType` are
+ * present, or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasEvents
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType);
+
+/**
+ * Clear events of a specific type from the event queue.
+ *
+ * This will unconditionally remove any events from the queue that match
+ * `type`. If you need to remove a range of event types, use SDL_FlushEvents()
+ * instead.
+ *
+ * It's also normal to just ignore events you don't care about in your event
+ * loop without calling this function.
+ *
+ * This function only affects currently queued events. If you want to make
+ * sure that all pending OS events are flushed, you can call SDL_PumpEvents()
+ * on the main thread immediately before the flush call.
+ *
+ * If you have user events with custom data that needs to be freed, you should
+ * use SDL_PeepEvents() to remove and clean up those events before calling
+ * this function.
+ *
+ * \param type the type of event to be cleared; see SDL_EventType for details.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_FlushEvents
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_FlushEvent(Uint32 type);
+
+/**
+ * Clear events of a range of types from the event queue.
+ *
+ * This will unconditionally remove any events from the queue that are in the
+ * range of `minType` to `maxType`, inclusive. If you need to remove a single
+ * event type, use SDL_FlushEvent() instead.
+ *
+ * It's also normal to just ignore events you don't care about in your event
+ * loop without calling this function.
+ *
+ * This function only affects currently queued events. If you want to make
+ * sure that all pending OS events are flushed, you can call SDL_PumpEvents()
+ * on the main thread immediately before the flush call.
+ *
+ * \param minType the low end of event type to be cleared, inclusive; see
+ * SDL_EventType for details.
+ * \param maxType the high end of event type to be cleared, inclusive; see
+ * SDL_EventType for details.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_FlushEvent
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType);
+
+/**
+ * Poll for currently pending events.
+ *
+ * If `event` is not NULL, the next event is removed from the queue and stored
+ * in the SDL_Event structure pointed to by `event`. The 1 returned refers to
+ * this event, immediately stored in the SDL Event structure -- not an event
+ * to follow.
+ *
+ * If `event` is NULL, it simply returns 1 if there is an event in the queue,
+ * but will not remove it from the queue.
+ *
+ * As this function may implicitly call SDL_PumpEvents(), you can only call
+ * this function in the thread that set the video mode.
+ *
+ * SDL_PollEvent() is the favored way of receiving system events since it can
+ * be done from the main loop and does not suspend the main loop while waiting
+ * on an event to be posted.
+ *
+ * The common practice is to fully process the event queue once every frame,
+ * usually as a first step before updating the game's state:
+ *
+ * ```c
+ * while (game_is_still_running) {
+ * SDL_Event event;
+ * while (SDL_PollEvent(&event)) { // poll until all events are handled!
+ * // decide what to do with this event.
+ * }
+ *
+ * // update game state, draw the current frame
+ * }
+ * ```
+ *
+ * \param event the SDL_Event structure to be filled with the next event from
+ * the queue, or NULL.
+ * \returns SDL_TRUE if this got an event or SDL_FALSE if there are none
+ * available.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PushEvent
+ * \sa SDL_WaitEvent
+ * \sa SDL_WaitEventTimeout
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_PollEvent(SDL_Event *event);
+
+/**
+ * Wait indefinitely for the next available event.
+ *
+ * If `event` is not NULL, the next event is removed from the queue and stored
+ * in the SDL_Event structure pointed to by `event`.
+ *
+ * As this function may implicitly call SDL_PumpEvents(), you can only call
+ * this function in the thread that initialized the video subsystem.
+ *
+ * \param event the SDL_Event structure to be filled in with the next event
+ * from the queue, or NULL.
+ * \returns SDL_TRUE on success or SDL_FALSE if there was an error while
+ * waiting for events; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PollEvent
+ * \sa SDL_PushEvent
+ * \sa SDL_WaitEventTimeout
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitEvent(SDL_Event *event);
+
+/**
+ * Wait until the specified timeout (in milliseconds) for the next available
+ * event.
+ *
+ * If `event` is not NULL, the next event is removed from the queue and stored
+ * in the SDL_Event structure pointed to by `event`.
+ *
+ * As this function may implicitly call SDL_PumpEvents(), you can only call
+ * this function in the thread that initialized the video subsystem.
+ *
+ * The timeout is not guaranteed, the actual wait time could be longer due to
+ * system scheduling.
+ *
+ * \param event the SDL_Event structure to be filled in with the next event
+ * from the queue, or NULL.
+ * \param timeoutMS the maximum number of milliseconds to wait for the next
+ * available event.
+ * \returns SDL_TRUE if this got an event or SDL_FALSE if the timeout elapsed
+ * without any events available.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PollEvent
+ * \sa SDL_PushEvent
+ * \sa SDL_WaitEvent
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WaitEventTimeout(SDL_Event *event, Sint32 timeoutMS);
+
+/**
+ * Add an event to the event queue.
+ *
+ * The event queue can actually be used as a two way communication channel.
+ * Not only can events be read from the queue, but the user can also push
+ * their own events onto it. `event` is a pointer to the event structure you
+ * wish to push onto the queue. The event is copied into the queue, and the
+ * caller may dispose of the memory pointed to after SDL_PushEvent() returns.
+ *
+ * Note: Pushing device input events onto the queue doesn't modify the state
+ * of the device within SDL.
+ *
+ * This function is thread-safe, and can be called from other threads safely.
+ *
+ * Note: Events pushed onto the queue with SDL_PushEvent() get passed through
+ * the event filter but events added with SDL_PeepEvents() do not.
+ *
+ * For pushing application-specific events, please use SDL_RegisterEvents() to
+ * get an event type that does not conflict with other code that also wants
+ * its own custom event types.
+ *
+ * \param event the SDL_Event to be added to the queue.
+ * \returns 1 on success, 0 if the event was filtered, or a negative error
+ * code on failure; call SDL_GetError() for more information. A
+ * common reason for error is the event queue being full.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PeepEvents
+ * \sa SDL_PollEvent
+ * \sa SDL_RegisterEvents
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event *event);
+
+/**
+ * A function pointer used for callbacks that watch the event queue.
+ *
+ * \param userdata what was passed as `userdata` to SDL_SetEventFilter() or
+ * SDL_AddEventWatch, etc.
+ * \param event the event that triggered the callback.
+ * \returns 1 to permit event to be added to the queue, and 0 to disallow it.
+ * When used with SDL_AddEventWatch, the return value is ignored.
+ *
+ * \threadsafety SDL may call this callback at any time from any thread; the
+ * application is responsible for locking resources the callback
+ * touches that need to be protected.
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetEventFilter
+ * \sa SDL_AddEventWatch
+ */
+typedef int (SDLCALL *SDL_EventFilter)(void *userdata, SDL_Event *event);
+
+/**
+ * Set up a filter to process all events before they change internal state and
+ * are posted to the internal event queue.
+ *
+ * If the filter function returns 1 when called, then the event will be added
+ * to the internal queue. If it returns 0, then the event will be dropped from
+ * the queue, but the internal state will still be updated. This allows
+ * selective filtering of dynamically arriving events.
+ *
+ * **WARNING**: Be very careful of what you do in the event filter function,
+ * as it may run in a different thread!
+ *
+ * On platforms that support it, if the quit event is generated by an
+ * interrupt signal (e.g. pressing Ctrl-C), it will be delivered to the
+ * application at the next event poll.
+ *
+ * There is one caveat when dealing with the SDL_QuitEvent event type. The
+ * event filter is only called when the window manager desires to close the
+ * application window. If the event filter returns 1, then the window will be
+ * closed, otherwise the window will remain open if possible.
+ *
+ * Note: Disabled events never make it to the event filter function; see
+ * SDL_SetEventEnabled().
+ *
+ * Note: If you just want to inspect events without filtering, you should use
+ * SDL_AddEventWatch() instead.
+ *
+ * Note: Events pushed onto the queue with SDL_PushEvent() get passed through
+ * the event filter, but events pushed onto the queue with SDL_PeepEvents() do
+ * not.
+ *
+ * \param filter an SDL_EventFilter function to call when an event happens.
+ * \param userdata a pointer that is passed to `filter`.
+ *
+ * \threadsafety SDL may call the filter callback at any time from any thread;
+ * the application is responsible for locking resources the
+ * callback touches that need to be protected.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AddEventWatch
+ * \sa SDL_SetEventEnabled
+ * \sa SDL_GetEventFilter
+ * \sa SDL_PeepEvents
+ * \sa SDL_PushEvent
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter, void *userdata);
+
+/**
+ * Query the current event filter.
+ *
+ * This function can be used to "chain" filters, by saving the existing filter
+ * before replacing it with a function that will call that saved filter.
+ *
+ * \param filter the current callback function will be stored here.
+ * \param userdata the pointer that is passed to the current event filter will
+ * be stored here.
+ * \returns SDL_TRUE on success or SDL_FALSE if there is no event filter set.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetEventFilter
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter *filter, void **userdata);
+
+/**
+ * Add a callback to be triggered when an event is added to the event queue.
+ *
+ * `filter` will be called when an event happens, and its return value is
+ * ignored.
+ *
+ * **WARNING**: Be very careful of what you do in the event filter function,
+ * as it may run in a different thread!
+ *
+ * If the quit event is generated by a signal (e.g. SIGINT), it will bypass
+ * the internal queue and be delivered to the watch callback immediately, and
+ * arrive at the next event poll.
+ *
+ * Note: the callback is called for events posted by the user through
+ * SDL_PushEvent(), but not for disabled events, nor for events by a filter
+ * callback set with SDL_SetEventFilter(), nor for events posted by the user
+ * through SDL_PeepEvents().
+ *
+ * \param filter an SDL_EventFilter function to call when an event happens.
+ * \param userdata a pointer that is passed to `filter`.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_DelEventWatch
+ * \sa SDL_SetEventFilter
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_AddEventWatch(SDL_EventFilter filter, void *userdata);
+
+/**
+ * Remove an event watch callback added with SDL_AddEventWatch().
+ *
+ * This function takes the same input as SDL_AddEventWatch() to identify and
+ * delete the corresponding callback.
+ *
+ * \param filter the function originally passed to SDL_AddEventWatch().
+ * \param userdata the pointer originally passed to SDL_AddEventWatch().
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AddEventWatch
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_DelEventWatch(SDL_EventFilter filter, void *userdata);
+
+/**
+ * Run a specific filter function on the current event queue, removing any
+ * events for which the filter returns 0.
+ *
+ * See SDL_SetEventFilter() for more information. Unlike SDL_SetEventFilter(),
+ * this function does not change the filter permanently, it only uses the
+ * supplied filter until this function returns.
+ *
+ * \param filter the SDL_EventFilter function to call when an event happens.
+ * \param userdata a pointer that is passed to `filter`.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetEventFilter
+ * \sa SDL_SetEventFilter
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter, void *userdata);
+
+/**
+ * Set the state of processing events by type.
+ *
+ * \param type the type of event; see SDL_EventType for details.
+ * \param enabled whether to process the event or not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_EventEnabled
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_SetEventEnabled(Uint32 type, SDL_bool enabled);
+
+/**
+ * Query the state of processing events by type.
+ *
+ * \param type the type of event; see SDL_EventType for details.
+ * \returns SDL_TRUE if the event is being processed, SDL_FALSE otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetEventEnabled
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_EventEnabled(Uint32 type);
+
+/**
+ * Allocate a set of user-defined events, and return the beginning event
+ * number for that set of events.
+ *
+ * \param numevents the number of events to be allocated.
+ * \returns the beginning event number, or 0 if numevents is invalid or if
+ * there are not enough user-defined events left.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PushEvent
+ */
+extern SDL_DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents);
+
+/**
+ * Get window associated with an event.
+ *
+ * \param event an event containing a `windowID`.
+ * \returns the associated window on success or NULL if there is none.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PollEvent
+ * \sa SDL_WaitEvent
+ * \sa SDL_WaitEventTimeout
+ */
+extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowFromEvent(const SDL_Event *event);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_events_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_filesystem.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_filesystem.h
new file mode 100644
index 0000000..756a52d
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_filesystem.h
@@ -0,0 +1,386 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryFilesystem
+ *
+ * SDL Filesystem API.
+ */
+
+#ifndef SDL_filesystem_h_
+#define SDL_filesystem_h_
+
+#include
+#include
+
+#include
+
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Get the directory where the application was run from.
+ *
+ * SDL caches the result of this call internally, but the first call to this
+ * function is not necessarily fast, so plan accordingly.
+ *
+ * **macOS and iOS Specific Functionality**: If the application is in a ".app"
+ * bundle, this function returns the Resource directory (e.g.
+ * MyApp.app/Contents/Resources/). This behaviour can be overridden by adding
+ * a property to the Info.plist file. Adding a string key with the name
+ * SDL_FILESYSTEM_BASE_DIR_TYPE with a supported value will change the
+ * behaviour.
+ *
+ * Supported values for the SDL_FILESYSTEM_BASE_DIR_TYPE property (Given an
+ * application in /Applications/SDLApp/MyApp.app):
+ *
+ * - `resource`: bundle resource directory (the default). For example:
+ * `/Applications/SDLApp/MyApp.app/Contents/Resources`
+ * - `bundle`: the Bundle directory. For example:
+ * `/Applications/SDLApp/MyApp.app/`
+ * - `parent`: the containing directory of the bundle. For example:
+ * `/Applications/SDLApp/`
+ *
+ * **Nintendo 3DS Specific Functionality**: This function returns "romfs"
+ * directory of the application as it is uncommon to store resources outside
+ * the executable. As such it is not a writable directory.
+ *
+ * The returned path is guaranteed to end with a path separator ('\\' on
+ * Windows, '/' on most other platforms).
+ *
+ * \returns an absolute path in UTF-8 encoding to the application data
+ * directory. NULL will be returned on error or when the platform
+ * doesn't implement this functionality, call SDL_GetError() for more
+ * information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetPrefPath
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetBasePath(void);
+
+/**
+ * Get the user-and-app-specific path where files can be written.
+ *
+ * Get the "pref dir". This is meant to be where users can write personal
+ * files (preferences and save games, etc) that are specific to your
+ * application. This directory is unique per user, per application.
+ *
+ * This function will decide the appropriate location in the native
+ * filesystem, create the directory if necessary, and return a string of the
+ * absolute path to the directory in UTF-8 encoding.
+ *
+ * On Windows, the string might look like:
+ *
+ * `C:\\Users\\bob\\AppData\\Roaming\\My Company\\My Program Name\\`
+ *
+ * On Linux, the string might look like:
+ *
+ * `/home/bob/.local/share/My Program Name/`
+ *
+ * On macOS, the string might look like:
+ *
+ * `/Users/bob/Library/Application Support/My Program Name/`
+ *
+ * You should assume the path returned by this function is the only safe place
+ * to write files (and that SDL_GetBasePath(), while it might be writable, or
+ * even the parent of the returned path, isn't where you should be writing
+ * things).
+ *
+ * Both the org and app strings may become part of a directory name, so please
+ * follow these rules:
+ *
+ * - Try to use the same org string (_including case-sensitivity_) for all
+ * your applications that use this function.
+ * - Always use a unique app string for each one, and make sure it never
+ * changes for an app once you've decided on it.
+ * - Unicode characters are legal, as long as they are UTF-8 encoded, but...
+ * - ...only use letters, numbers, and spaces. Avoid punctuation like "Game
+ * Name 2: Bad Guy's Revenge!" ... "Game Name 2" is sufficient.
+ *
+ * The returned path is guaranteed to end with a path separator ('\\' on
+ * Windows, '/' on most other platforms).
+ *
+ * \param org the name of your organization.
+ * \param app the name of your application.
+ * \returns a UTF-8 string of the user directory in platform-dependent
+ * notation. NULL if there's a problem (creating directory failed,
+ * etc.). This should be freed with SDL_free() when it is no longer
+ * needed.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetBasePath
+ */
+extern SDL_DECLSPEC char * SDLCALL SDL_GetPrefPath(const char *org, const char *app);
+
+/**
+ * The type of the OS-provided default folder for a specific purpose.
+ *
+ * Note that the Trash folder isn't included here, because trashing files
+ * usually involves extra OS-specific functionality to remember the file's
+ * original location.
+ *
+ * The folders supported per platform are:
+ *
+ * | | Windows | WinRT/UWP |macOS/iOS | tvOS | Unix (XDG) | Haiku | Emscripten |
+ * | ----------- | ------- | --------- |--------- | ---- | ---------- | ----- | ---------- |
+ * | HOME | X | X | X | | X | X | X |
+ * | DESKTOP | X | X | X | | X | X | |
+ * | DOCUMENTS | X | X | X | | X | | |
+ * | DOWNLOADS | Vista+ | X | X | | X | | |
+ * | MUSIC | X | X | X | | X | | |
+ * | PICTURES | X | X | X | | X | | |
+ * | PUBLICSHARE | | | X | | X | | |
+ * | SAVEDGAMES | Vista+ | | | | | | |
+ * | SCREENSHOTS | Vista+ | X | | | | | |
+ * | TEMPLATES | X | X | X | | X | | |
+ * | VIDEOS | X | X | X* | | X | | |
+ *
+ * Note that on macOS/iOS, the Videos folder is called "Movies".
+ *
+ * \since This enum is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetUserFolder
+ */
+typedef enum SDL_Folder
+{
+ /** The folder which contains all of the current user's data, preferences,
+ and documents. It usually contains most of the other folders. If a
+ requested folder does not exist, the home folder can be considered a safe
+ fallback to store a user's documents. */
+ SDL_FOLDER_HOME,
+ /** The folder of files that are displayed on the desktop. Note that the
+ existence of a desktop folder does not guarantee that the system does
+ show icons on its desktop; certain GNU/Linux distros with a graphical
+ environment may not have desktop icons. */
+ SDL_FOLDER_DESKTOP,
+ /** User document files, possibly application-specific. This is a good
+ place to save a user's projects. */
+ SDL_FOLDER_DOCUMENTS,
+ /** Standard folder for user files downloaded from the internet. */
+ SDL_FOLDER_DOWNLOADS,
+ /** Music files that can be played using a standard music player (mp3,
+ ogg...). */
+ SDL_FOLDER_MUSIC,
+ /** Image files that can be displayed using a standard viewer (png,
+ jpg...). */
+ SDL_FOLDER_PICTURES,
+ /** Files that are meant to be shared with other users on the same
+ computer. */
+ SDL_FOLDER_PUBLICSHARE,
+ /** Save files for games. */
+ SDL_FOLDER_SAVEDGAMES,
+ /** Application screenshots. */
+ SDL_FOLDER_SCREENSHOTS,
+ /** Template files to be used when the user requests the desktop environment
+ to create a new file in a certain folder, such as "New Text File.txt".
+ Any file in the Templates folder can be used as a starting point for a
+ new file. */
+ SDL_FOLDER_TEMPLATES,
+ /** Video files that can be played using a standard video player (mp4,
+ webm...). */
+ SDL_FOLDER_VIDEOS,
+ /** total number of types in this enum, not a folder type by itself. */
+ SDL_FOLDER_TOTAL
+} SDL_Folder;
+
+/**
+ * Finds the most suitable user folder for a specific purpose.
+ *
+ * Many OSes provide certain standard folders for certain purposes, such as
+ * storing pictures, music or videos for a certain user. This function gives
+ * the path for many of those special locations.
+ *
+ * This function is specifically for _user_ folders, which are meant for the
+ * user to access and manage. For application-specific folders, meant to hold
+ * data for the application to manage, see SDL_GetBasePath() and
+ * SDL_GetPrefPath().
+ *
+ * The returned path is guaranteed to end with a path separator ('\\' on
+ * Windows, '/' on most other platforms).
+ *
+ * If NULL is returned, the error may be obtained with SDL_GetError().
+ *
+ * \param folder the type of folder to find.
+ * \returns either a null-terminated C string containing the full path to the
+ * folder, or NULL if an error happened.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetUserFolder(SDL_Folder folder);
+
+
+/* Abstract filesystem interface */
+
+typedef enum SDL_PathType
+{
+ SDL_PATHTYPE_NONE, /**< path does not exist */
+ SDL_PATHTYPE_FILE, /**< a normal file */
+ SDL_PATHTYPE_DIRECTORY, /**< a directory */
+ SDL_PATHTYPE_OTHER /**< something completely different like a device node (not a symlink, those are always followed) */
+} SDL_PathType;
+
+typedef struct SDL_PathInfo
+{
+ SDL_PathType type; /* the path type */
+ Uint64 size; /* the file size in bytes */
+ SDL_Time create_time; /* the time when the path was created */
+ SDL_Time modify_time; /* the last time the path was modified */
+ SDL_Time access_time; /* the last time the path was read */
+} SDL_PathInfo;
+
+/**
+ * Flags for path matching
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ *
+ * \sa SDL_GlobDirectory
+ * \sa SDL_GlobStorageDirectory
+ */
+typedef Uint32 SDL_GlobFlags;
+
+#define SDL_GLOB_CASEINSENSITIVE (1u << 0)
+
+/**
+ * Create a directory.
+ *
+ * \param path the path of the directory to create.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_CreateDirectory(const char *path);
+
+/* Callback for directory enumeration. Return 1 to keep enumerating,
+ 0 to stop enumerating (no error), -1 to stop enumerating and
+ report an error. `dirname` is the directory being enumerated,
+ `fname` is the enumerated entry. */
+typedef int (SDLCALL *SDL_EnumerateDirectoryCallback)(void *userdata, const char *dirname, const char *fname);
+
+/**
+ * Enumerate a directory through a callback function.
+ *
+ * This function provides every directory entry through an app-provided
+ * callback, called once for each directory entry, until all results have been
+ * provided or the callback returns <= 0.
+ *
+ * \param path the path of the directory to enumerate.
+ * \param callback a function that is called for each entry in the directory.
+ * \param userdata a pointer that is passed to `callback`.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback callback, void *userdata);
+
+/**
+ * Remove a file or an empty directory.
+ *
+ * \param path the path of the directory to enumerate.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_RemovePath(const char *path);
+
+/**
+ * Rename a file or directory.
+ *
+ * \param oldpath the old path.
+ * \param newpath the new path.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_RenamePath(const char *oldpath, const char *newpath);
+
+/**
+ * Copy a file.
+ *
+ * \param oldpath the old path.
+ * \param newpath the new path.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_CopyFile(const char *oldpath, const char *newpath);
+
+/**
+ * Get information about a filesystem path.
+ *
+ * \param path the path to query.
+ * \param info a pointer filled in with information about the path, or NULL to
+ * check for the existence of a file.
+ * \returns 0 on success or a negative error code if the file doesn't exist,
+ * or another failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetPathInfo(const char *path, SDL_PathInfo *info);
+
+/**
+ * Enumerate a directory tree, filtered by pattern, and return a list.
+ *
+ * Files are filtered out if they don't match the string in `pattern`, which
+ * may contain wildcard characters '*' (match everything) and '?' (match one
+ * character). If pattern is NULL, no filtering is done and all results are
+ * returned. Subdirectories are permitted, and are specified with a path
+ * separator of '/'. Wildcard characters '*' and '?' never match a path
+ * separator.
+ *
+ * `flags` may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching
+ * case-insensitive.
+ *
+ * The returned array is always NULL-terminated, for your iterating
+ * convenience, but if `count` is non-NULL, on return it will contain the
+ * number of items in the array, not counting the NULL terminator.
+ *
+ * \param path the path of the directory to enumerate.
+ * \param pattern the pattern that files in the directory must match. Can be
+ * NULL.
+ * \param flags `SDL_GLOB_*` bitflags that affect this search.
+ * \param count on return, will be set to the number of items in the returned
+ * array. Can be NULL.
+ * \returns an array of strings on success or NULL on failure; call
+ * SDL_GetError() for more information. This is a single allocation
+ * that should be freed with SDL_free() when it is no longer needed.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC char ** SDLCALL SDL_GlobDirectory(const char *path, const char *pattern, SDL_GlobFlags flags, int *count);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_filesystem_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_gamepad.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_gamepad.h
new file mode 100644
index 0000000..cec0684
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_gamepad.h
@@ -0,0 +1,1469 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryGamepad
+ *
+ * SDL provides a low-level joystick API, which just treats joysticks as an
+ * arbitrary pile of buttons, axes, and hat switches. If you're planning to
+ * write your own control configuration screen, this can give you a lot of
+ * flexibility, but that's a lot of work, and most things that we consider
+ * "joysticks" now are actually console-style gamepads. So SDL provides the
+ * gamepad API on top of the lower-level joystick functionality.
+ *
+ * The difference betweena joystick and a gamepad is that a gamepad tells you
+ * _where_ a button or axis is on the device. You don't speak to gamepads in
+ * terms of arbitrary numbers like "button 3" or "axis 2" but in standard
+ * locations: the d-pad, the shoulder buttons, triggers, A/B/X/Y (or
+ * X/O/Square/Triangle, if you will).
+ *
+ * One turns a joystick into a gamepad by providing a magic configuration
+ * string, which tells SDL the details of a specific device: when you see this
+ * specific hardware, if button 2 gets pressed, this is actually D-Pad Up,
+ * etc.
+ *
+ * SDL has many popular controllers configured out of the box, and users can
+ * add their own controller details through an environment variable if it's
+ * otherwise unknown to SDL.
+ *
+ * In order to use these functions, SDL_Init() must have been called with the
+ * SDL_INIT_GAMEPAD flag. This causes SDL to scan the system for gamepads, and
+ * load appropriate drivers.
+ *
+ * If you would like to receive gamepad updates while the application is in
+ * the background, you should set the following hint before calling
+ * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS
+ */
+
+#ifndef SDL_gamepad_h_
+#define SDL_gamepad_h_
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * The structure used to identify an SDL gamepad
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_Gamepad SDL_Gamepad;
+
+/**
+ * Standard gamepad types.
+ *
+ * This type does not necessarily map to first-party controllers from
+ * Microsoft/Sony/Nintendo; in many cases, third-party controllers can report
+ * as these, either because they were designed for a specific console, or they
+ * simply most closely match that console's controllers (does it have A/B/X/Y
+ * buttons or X/O/Square/Triangle? Does it have a touchpad? etc).
+ */
+typedef enum SDL_GamepadType
+{
+ SDL_GAMEPAD_TYPE_UNKNOWN = 0,
+ SDL_GAMEPAD_TYPE_STANDARD,
+ SDL_GAMEPAD_TYPE_XBOX360,
+ SDL_GAMEPAD_TYPE_XBOXONE,
+ SDL_GAMEPAD_TYPE_PS3,
+ SDL_GAMEPAD_TYPE_PS4,
+ SDL_GAMEPAD_TYPE_PS5,
+ SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO,
+ SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT,
+ SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT,
+ SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR,
+ SDL_GAMEPAD_TYPE_MAX
+} SDL_GamepadType;
+
+/**
+ * The list of buttons available on a gamepad
+ *
+ * For controllers that use a diamond pattern for the face buttons, the
+ * south/east/west/north buttons below correspond to the locations in the
+ * diamond pattern. For Xbox controllers, this would be A/B/X/Y, for Nintendo
+ * Switch controllers, this would be B/A/Y/X, for PlayStation controllers this
+ * would be Cross/Circle/Square/Triangle.
+ *
+ * For controllers that don't use a diamond pattern for the face buttons, the
+ * south/east/west/north buttons indicate the buttons labeled A, B, C, D, or
+ * 1, 2, 3, 4, or for controllers that aren't labeled, they are the primary,
+ * secondary, etc. buttons.
+ *
+ * The activate action is often the south button and the cancel action is
+ * often the east button, but in some regions this is reversed, so your game
+ * should allow remapping actions based on user preferences.
+ *
+ * You can query the labels for the face buttons using
+ * SDL_GetGamepadButtonLabel()
+ *
+ * \since This enum is available since SDL 3.0.0.
+ */
+typedef enum SDL_GamepadButton
+{
+ SDL_GAMEPAD_BUTTON_INVALID = -1,
+ SDL_GAMEPAD_BUTTON_SOUTH, /* Bottom face button (e.g. Xbox A button) */
+ SDL_GAMEPAD_BUTTON_EAST, /* Right face button (e.g. Xbox B button) */
+ SDL_GAMEPAD_BUTTON_WEST, /* Left face button (e.g. Xbox X button) */
+ SDL_GAMEPAD_BUTTON_NORTH, /* Top face button (e.g. Xbox Y button) */
+ SDL_GAMEPAD_BUTTON_BACK,
+ SDL_GAMEPAD_BUTTON_GUIDE,
+ SDL_GAMEPAD_BUTTON_START,
+ SDL_GAMEPAD_BUTTON_LEFT_STICK,
+ SDL_GAMEPAD_BUTTON_RIGHT_STICK,
+ SDL_GAMEPAD_BUTTON_LEFT_SHOULDER,
+ SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER,
+ SDL_GAMEPAD_BUTTON_DPAD_UP,
+ SDL_GAMEPAD_BUTTON_DPAD_DOWN,
+ SDL_GAMEPAD_BUTTON_DPAD_LEFT,
+ SDL_GAMEPAD_BUTTON_DPAD_RIGHT,
+ SDL_GAMEPAD_BUTTON_MISC1, /* Additional button (e.g. Xbox Series X share button, PS5 microphone button, Nintendo Switch Pro capture button, Amazon Luna microphone button, Google Stadia capture button) */
+ SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1, /* Upper or primary paddle, under your right hand (e.g. Xbox Elite paddle P1) */
+ SDL_GAMEPAD_BUTTON_LEFT_PADDLE1, /* Upper or primary paddle, under your left hand (e.g. Xbox Elite paddle P3) */
+ SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2, /* Lower or secondary paddle, under your right hand (e.g. Xbox Elite paddle P2) */
+ SDL_GAMEPAD_BUTTON_LEFT_PADDLE2, /* Lower or secondary paddle, under your left hand (e.g. Xbox Elite paddle P4) */
+ SDL_GAMEPAD_BUTTON_TOUCHPAD, /* PS4/PS5 touchpad button */
+ SDL_GAMEPAD_BUTTON_MISC2, /* Additional button */
+ SDL_GAMEPAD_BUTTON_MISC3, /* Additional button */
+ SDL_GAMEPAD_BUTTON_MISC4, /* Additional button */
+ SDL_GAMEPAD_BUTTON_MISC5, /* Additional button */
+ SDL_GAMEPAD_BUTTON_MISC6, /* Additional button */
+ SDL_GAMEPAD_BUTTON_MAX
+} SDL_GamepadButton;
+
+/**
+ * The set of gamepad button labels
+ *
+ * This isn't a complete set, just the face buttons to make it easy to show
+ * button prompts.
+ *
+ * For a complete set, you should look at the button and gamepad type and have
+ * a set of symbols that work well with your art style.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ */
+typedef enum SDL_GamepadButtonLabel
+{
+ SDL_GAMEPAD_BUTTON_LABEL_UNKNOWN,
+ SDL_GAMEPAD_BUTTON_LABEL_A,
+ SDL_GAMEPAD_BUTTON_LABEL_B,
+ SDL_GAMEPAD_BUTTON_LABEL_X,
+ SDL_GAMEPAD_BUTTON_LABEL_Y,
+ SDL_GAMEPAD_BUTTON_LABEL_CROSS,
+ SDL_GAMEPAD_BUTTON_LABEL_CIRCLE,
+ SDL_GAMEPAD_BUTTON_LABEL_SQUARE,
+ SDL_GAMEPAD_BUTTON_LABEL_TRIANGLE
+} SDL_GamepadButtonLabel;
+
+/**
+ * The list of axes available on a gamepad
+ *
+ * Thumbstick axis values range from SDL_JOYSTICK_AXIS_MIN to
+ * SDL_JOYSTICK_AXIS_MAX, and are centered within ~8000 of zero, though
+ * advanced UI will allow users to set or autodetect the dead zone, which
+ * varies between gamepads.
+ *
+ * Trigger axis values range from 0 (released) to SDL_JOYSTICK_AXIS_MAX (fully
+ * pressed) when reported by SDL_GetGamepadAxis(). Note that this is not the
+ * same range that will be reported by the lower-level SDL_GetJoystickAxis().
+ *
+ * \since This enum is available since SDL 3.0.0.
+ */
+typedef enum SDL_GamepadAxis
+{
+ SDL_GAMEPAD_AXIS_INVALID = -1,
+ SDL_GAMEPAD_AXIS_LEFTX,
+ SDL_GAMEPAD_AXIS_LEFTY,
+ SDL_GAMEPAD_AXIS_RIGHTX,
+ SDL_GAMEPAD_AXIS_RIGHTY,
+ SDL_GAMEPAD_AXIS_LEFT_TRIGGER,
+ SDL_GAMEPAD_AXIS_RIGHT_TRIGGER,
+ SDL_GAMEPAD_AXIS_MAX
+} SDL_GamepadAxis;
+
+/**
+ * Types of gamepad control bindings.
+ *
+ * A gamepad is a collection of bindings that map arbitrary joystick buttons,
+ * axes and hat switches to specific positions on a generic console-style
+ * gamepad. This enum is used as part of SDL_GamepadBinding to specify those
+ * mappings.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ */
+typedef enum SDL_GamepadBindingType
+{
+ SDL_GAMEPAD_BINDTYPE_NONE = 0,
+ SDL_GAMEPAD_BINDTYPE_BUTTON,
+ SDL_GAMEPAD_BINDTYPE_AXIS,
+ SDL_GAMEPAD_BINDTYPE_HAT
+} SDL_GamepadBindingType;
+
+/**
+ * A mapping between one joystick input to a gamepad control.
+ *
+ * A gamepad has a collection of several bindings, to say, for example, when
+ * joystick button number 5 is pressed, that should be treated like the
+ * gamepad's "start" button.
+ *
+ * SDL has these bindings built-in for many popular controllers, and can add
+ * more with a simple text string. Those strings are parsed into a collection
+ * of these structs to make it easier to operate on the data.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadBindings
+ */
+typedef struct SDL_GamepadBinding
+{
+ SDL_GamepadBindingType input_type;
+ union
+ {
+ int button;
+
+ struct
+ {
+ int axis;
+ int axis_min;
+ int axis_max;
+ } axis;
+
+ struct
+ {
+ int hat;
+ int hat_mask;
+ } hat;
+
+ } input;
+
+ SDL_GamepadBindingType output_type;
+ union
+ {
+ SDL_GamepadButton button;
+
+ struct
+ {
+ SDL_GamepadAxis axis;
+ int axis_min;
+ int axis_max;
+ } axis;
+
+ } output;
+} SDL_GamepadBinding;
+
+
+/**
+ * Add support for gamepads that SDL is unaware of or change the binding of an
+ * existing gamepad.
+ *
+ * The mapping string has the format "GUID,name,mapping", where GUID is the
+ * string value from SDL_GUIDToString(), name is the human readable string for
+ * the device and mappings are gamepad mappings to joystick ones. Under
+ * Windows there is a reserved GUID of "xinput" that covers all XInput
+ * devices. The mapping format for joystick is:
+ *
+ * - `bX`: a joystick button, index X
+ * - `hX.Y`: hat X with value Y
+ * - `aX`: axis X of the joystick
+ *
+ * Buttons can be used as a gamepad axes and vice versa.
+ *
+ * This string shows an example of a valid mapping for a gamepad:
+ *
+ * ```c
+ * "341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7"
+ * ```
+ *
+ * \param mapping the mapping string.
+ * \returns 1 if a new mapping is added, 0 if an existing mapping is updated,
+ * -1 on failure; call SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadMapping
+ * \sa SDL_GetGamepadMappingForGUID
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMapping(const char *mapping);
+
+/**
+ * Load a set of gamepad mappings from an SDL_IOStream.
+ *
+ * You can call this function several times, if needed, to load different
+ * database files.
+ *
+ * If a new mapping is loaded for an already known gamepad GUID, the later
+ * version will overwrite the one currently loaded.
+ *
+ * Mappings not belonging to the current platform or with no platform field
+ * specified will be ignored (i.e. mappings for Linux will be ignored in
+ * Windows, etc).
+ *
+ * This function will load the text database entirely in memory before
+ * processing it, so take this into consideration if you are in a memory
+ * constrained environment.
+ *
+ * \param src the data stream for the mappings to be added.
+ * \param closeio if SDL_TRUE, calls SDL_CloseIO() on `src` before returning,
+ * even in the case of an error.
+ * \returns the number of mappings added or -1 on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AddGamepadMapping
+ * \sa SDL_AddGamepadMappingsFromFile
+ * \sa SDL_GetGamepadMapping
+ * \sa SDL_GetGamepadMappingForGUID
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromIO(SDL_IOStream *src, SDL_bool closeio);
+
+/**
+ * Load a set of gamepad mappings from a file.
+ *
+ * You can call this function several times, if needed, to load different
+ * database files.
+ *
+ * If a new mapping is loaded for an already known gamepad GUID, the later
+ * version will overwrite the one currently loaded.
+ *
+ * Mappings not belonging to the current platform or with no platform field
+ * specified will be ignored (i.e. mappings for Linux will be ignored in
+ * Windows, etc).
+ *
+ * \param file the mappings file to load.
+ * \returns the number of mappings added or -1 on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AddGamepadMapping
+ * \sa SDL_AddGamepadMappingsFromIO
+ * \sa SDL_GetGamepadMapping
+ * \sa SDL_GetGamepadMappingForGUID
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromFile(const char *file);
+
+/**
+ * Reinitialize the SDL mapping database to its initial state.
+ *
+ * This will generate gamepad events as needed if device mappings change.
+ *
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_ReloadGamepadMappings(void);
+
+/**
+ * Get the current gamepad mappings.
+ *
+ * \param count a pointer filled in with the number of mappings returned, can
+ * be NULL.
+ * \returns an array of the mapping strings, NULL-terminated, or NULL on
+ * failure; call SDL_GetError() for more information. This is a
+ * single allocation that should be freed with SDL_free() when it is
+ * no longer needed.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC char ** SDLCALL SDL_GetGamepadMappings(int *count);
+
+/**
+ * Get the gamepad mapping string for a given GUID.
+ *
+ * \param guid a structure containing the GUID for which a mapping is desired.
+ * \returns a mapping string or NULL on failure; call SDL_GetError() for more
+ * information. This should be freed with SDL_free() when it is no
+ * longer needed.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickGUIDForID
+ * \sa SDL_GetJoystickGUID
+ */
+extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMappingForGUID(SDL_GUID guid);
+
+/**
+ * Get the current mapping of a gamepad.
+ *
+ * Details about mappings are discussed with SDL_AddGamepadMapping().
+ *
+ * \param gamepad the gamepad you want to get the current mapping for.
+ * \returns a string that has the gamepad's mapping or NULL if no mapping is
+ * available; call SDL_GetError() for more information. This should
+ * be freed with SDL_free() when it is no longer needed.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AddGamepadMapping
+ * \sa SDL_GetGamepadMappingForID
+ * \sa SDL_GetGamepadMappingForGUID
+ * \sa SDL_SetGamepadMapping
+ */
+extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMapping(SDL_Gamepad *gamepad);
+
+/**
+ * Set the current mapping of a joystick or gamepad.
+ *
+ * Details about mappings are discussed with SDL_AddGamepadMapping().
+ *
+ * \param instance_id the joystick instance ID.
+ * \param mapping the mapping to use for this device, or NULL to clear the
+ * mapping.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AddGamepadMapping
+ * \sa SDL_GetGamepadMapping
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetGamepadMapping(SDL_JoystickID instance_id, const char *mapping);
+
+/**
+ * Return whether a gamepad is currently connected.
+ *
+ * \returns SDL_TRUE if a gamepad is connected, SDL_FALSE otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepads
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasGamepad(void);
+
+/**
+ * Get a list of currently connected gamepads.
+ *
+ * \param count a pointer filled in with the number of gamepads returned, may
+ * be NULL.
+ * \returns a 0 terminated array of joystick instance IDs or NULL on failure;
+ * call SDL_GetError() for more information. This should be freed
+ * with SDL_free() when it is no longer needed.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasGamepad
+ * \sa SDL_OpenGamepad
+ */
+extern SDL_DECLSPEC SDL_JoystickID * SDLCALL SDL_GetGamepads(int *count);
+
+/**
+ * Check if the given joystick is supported by the gamepad interface.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns SDL_TRUE if the given joystick is supported by the gamepad
+ * interface, SDL_FALSE if it isn't or it's an invalid index.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoysticks
+ * \sa SDL_OpenGamepad
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsGamepad(SDL_JoystickID instance_id);
+
+/**
+ * Get the implementation dependent name of a gamepad.
+ *
+ * This can be called before any gamepads are opened.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the name of the selected gamepad. If no name can be found, this
+ * function returns NULL; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadName
+ * \sa SDL_GetGamepads
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadNameForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the implementation dependent path of a gamepad.
+ *
+ * This can be called before any gamepads are opened.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the path of the selected gamepad. If no path can be found, this
+ * function returns NULL; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadPath
+ * \sa SDL_GetGamepads
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadPathForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the player index of a gamepad.
+ *
+ * This can be called before any gamepads are opened.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the player index of a gamepad, or -1 if it's not available.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadPlayerIndex
+ * \sa SDL_GetGamepads
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetGamepadPlayerIndexForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the implementation-dependent GUID of a gamepad.
+ *
+ * This can be called before any gamepads are opened.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the GUID of the selected gamepad. If called on an invalid index,
+ * this function returns a zero GUID.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GUIDToString
+ * \sa SDL_GetGamepads
+ */
+extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetGamepadGUIDForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the USB vendor ID of a gamepad, if available.
+ *
+ * This can be called before any gamepads are opened. If the vendor ID isn't
+ * available this function returns 0.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the USB vendor ID of the selected gamepad. If called on an invalid
+ * index, this function returns zero.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadVendor
+ * \sa SDL_GetGamepads
+ */
+extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadVendorForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the USB product ID of a gamepad, if available.
+ *
+ * This can be called before any gamepads are opened. If the product ID isn't
+ * available this function returns 0.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the USB product ID of the selected gamepad. If called on an
+ * invalid index, this function returns zero.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadProduct
+ * \sa SDL_GetGamepads
+ */
+extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the product version of a gamepad, if available.
+ *
+ * This can be called before any gamepads are opened. If the product version
+ * isn't available this function returns 0.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the product version of the selected gamepad. If called on an
+ * invalid index, this function returns zero.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadProductVersion
+ * \sa SDL_GetGamepads
+ */
+extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductVersionForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the type of a gamepad.
+ *
+ * This can be called before any gamepads are opened.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the gamepad type.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadType
+ * \sa SDL_GetGamepads
+ * \sa SDL_GetRealGamepadTypeForID
+ */
+extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadTypeForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the type of a gamepad, ignoring any mapping override.
+ *
+ * This can be called before any gamepads are opened.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the gamepad type.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadTypeForID
+ * \sa SDL_GetGamepads
+ * \sa SDL_GetRealGamepadType
+ */
+extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetRealGamepadTypeForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the mapping of a gamepad.
+ *
+ * This can be called before any gamepads are opened.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the mapping string. Returns NULL if no mapping is available. This
+ * should be freed with SDL_free() when it is no longer needed.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepads
+ * \sa SDL_GetGamepadMapping
+ */
+extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMappingForID(SDL_JoystickID instance_id);
+
+/**
+ * Open a gamepad for use.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns a gamepad identifier or NULL if an error occurred; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_CloseGamepad
+ * \sa SDL_IsGamepad
+ */
+extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_OpenGamepad(SDL_JoystickID instance_id);
+
+/**
+ * Get the SDL_Gamepad associated with a joystick instance ID, if it has been
+ * opened.
+ *
+ * \param instance_id the joystick instance ID of the gamepad.
+ * \returns an SDL_Gamepad on success or NULL on failure or if it hasn't been
+ * opened yet; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromID(SDL_JoystickID instance_id);
+
+/**
+ * Get the SDL_Gamepad associated with a player index.
+ *
+ * \param player_index the player index, which different from the instance ID.
+ * \returns the SDL_Gamepad associated with a player index.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadPlayerIndex
+ * \sa SDL_SetGamepadPlayerIndex
+ */
+extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromPlayerIndex(int player_index);
+
+/**
+ * Get the properties associated with an opened gamepad.
+ *
+ * These properties are shared with the underlying joystick object.
+ *
+ * The following read-only properties are provided by SDL:
+ *
+ * - `SDL_PROP_GAMEPAD_CAP_MONO_LED_BOOLEAN`: true if this gamepad has an LED
+ * that has adjustable brightness
+ * - `SDL_PROP_GAMEPAD_CAP_RGB_LED_BOOLEAN`: true if this gamepad has an LED
+ * that has adjustable color
+ * - `SDL_PROP_GAMEPAD_CAP_PLAYER_LED_BOOLEAN`: true if this gamepad has a
+ * player LED
+ * - `SDL_PROP_GAMEPAD_CAP_RUMBLE_BOOLEAN`: true if this gamepad has
+ * left/right rumble
+ * - `SDL_PROP_GAMEPAD_CAP_TRIGGER_RUMBLE_BOOLEAN`: true if this gamepad has
+ * simple trigger rumble
+ *
+ * \param gamepad a gamepad identifier previously returned by
+ * SDL_OpenGamepad().
+ * \returns a valid property ID on success or 0 on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGamepadProperties(SDL_Gamepad *gamepad);
+
+#define SDL_PROP_GAMEPAD_CAP_MONO_LED_BOOLEAN SDL_PROP_JOYSTICK_CAP_MONO_LED_BOOLEAN
+#define SDL_PROP_GAMEPAD_CAP_RGB_LED_BOOLEAN SDL_PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN
+#define SDL_PROP_GAMEPAD_CAP_PLAYER_LED_BOOLEAN SDL_PROP_JOYSTICK_CAP_PLAYER_LED_BOOLEAN
+#define SDL_PROP_GAMEPAD_CAP_RUMBLE_BOOLEAN SDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN
+#define SDL_PROP_GAMEPAD_CAP_TRIGGER_RUMBLE_BOOLEAN SDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN
+
+/**
+ * Get the instance ID of an opened gamepad.
+ *
+ * \param gamepad a gamepad identifier previously returned by
+ * SDL_OpenGamepad().
+ * \returns the instance ID of the specified gamepad on success or 0 on
+ * failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetGamepadID(SDL_Gamepad *gamepad);
+
+/**
+ * Get the implementation-dependent name for an opened gamepad.
+ *
+ * \param gamepad a gamepad identifier previously returned by
+ * SDL_OpenGamepad().
+ * \returns the implementation dependent name for the gamepad, or NULL if
+ * there is no name or the identifier passed is invalid.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadNameForID
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadName(SDL_Gamepad *gamepad);
+
+/**
+ * Get the implementation-dependent path for an opened gamepad.
+ *
+ * \param gamepad a gamepad identifier previously returned by
+ * SDL_OpenGamepad().
+ * \returns the implementation dependent path for the gamepad, or NULL if
+ * there is no path or the identifier passed is invalid.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadPathForID
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadPath(SDL_Gamepad *gamepad);
+
+/**
+ * Get the type of an opened gamepad.
+ *
+ * \param gamepad the gamepad object to query.
+ * \returns the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it's not
+ * available.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadTypeForID
+ */
+extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadType(SDL_Gamepad *gamepad);
+
+/**
+ * Get the type of an opened gamepad, ignoring any mapping override.
+ *
+ * \param gamepad the gamepad object to query.
+ * \returns the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it's not
+ * available.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetRealGamepadTypeForID
+ */
+extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetRealGamepadType(SDL_Gamepad *gamepad);
+
+/**
+ * Get the player index of an opened gamepad.
+ *
+ * For XInput gamepads this returns the XInput user index.
+ *
+ * \param gamepad the gamepad object to query.
+ * \returns the player index for gamepad, or -1 if it's not available.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetGamepadPlayerIndex
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetGamepadPlayerIndex(SDL_Gamepad *gamepad);
+
+/**
+ * Set the player index of an opened gamepad.
+ *
+ * \param gamepad the gamepad object to adjust.
+ * \param player_index player index to assign to this gamepad, or -1 to clear
+ * the player index and turn off player LEDs.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadPlayerIndex
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetGamepadPlayerIndex(SDL_Gamepad *gamepad, int player_index);
+
+/**
+ * Get the USB vendor ID of an opened gamepad, if available.
+ *
+ * If the vendor ID isn't available this function returns 0.
+ *
+ * \param gamepad the gamepad object to query.
+ * \returns the USB vendor ID, or zero if unavailable.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadVendorForID
+ */
+extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadVendor(SDL_Gamepad *gamepad);
+
+/**
+ * Get the USB product ID of an opened gamepad, if available.
+ *
+ * If the product ID isn't available this function returns 0.
+ *
+ * \param gamepad the gamepad object to query.
+ * \returns the USB product ID, or zero if unavailable.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadProductForID
+ */
+extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProduct(SDL_Gamepad *gamepad);
+
+/**
+ * Get the product version of an opened gamepad, if available.
+ *
+ * If the product version isn't available this function returns 0.
+ *
+ * \param gamepad the gamepad object to query.
+ * \returns the USB product version, or zero if unavailable.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadProductVersionForID
+ */
+extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductVersion(SDL_Gamepad *gamepad);
+
+/**
+ * Get the firmware version of an opened gamepad, if available.
+ *
+ * If the firmware version isn't available this function returns 0.
+ *
+ * \param gamepad the gamepad object to query.
+ * \returns the gamepad firmware version, or zero if unavailable.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadFirmwareVersion(SDL_Gamepad *gamepad);
+
+/**
+ * Get the serial number of an opened gamepad, if available.
+ *
+ * Returns the serial number of the gamepad, or NULL if it is not available.
+ *
+ * \param gamepad the gamepad object to query.
+ * \returns the serial number, or NULL if unavailable.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadSerial(SDL_Gamepad *gamepad);
+
+/**
+ * Get the Steam Input handle of an opened gamepad, if available.
+ *
+ * Returns an InputHandle_t for the gamepad that can be used with Steam Input
+ * API: https://partner.steamgames.com/doc/api/ISteamInput
+ *
+ * \param gamepad the gamepad object to query.
+ * \returns the gamepad handle, or 0 if unavailable.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetGamepadSteamHandle(SDL_Gamepad *gamepad);
+
+/**
+ * Get the connection state of a gamepad.
+ *
+ * \param gamepad the gamepad object to query.
+ * \returns the connection state on success or
+ * `SDL_JOYSTICK_CONNECTION_INVALID` on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetGamepadConnectionState(SDL_Gamepad *gamepad);
+
+/**
+ * Get the battery state of a gamepad.
+ *
+ * You should never take a battery status as absolute truth. Batteries
+ * (especially failing batteries) are delicate hardware, and the values
+ * reported here are best estimates based on what that hardware reports. It's
+ * not uncommon for older batteries to lose stored power much faster than it
+ * reports, or completely drain when reporting it has 20 percent left, etc.
+ *
+ * \param gamepad the gamepad object to query.
+ * \param percent a pointer filled in with the percentage of battery life
+ * left, between 0 and 100, or NULL to ignore. This will be
+ * filled in with -1 we can't determine a value or there is no
+ * battery.
+ * \returns the current battery state.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetGamepadPowerInfo(SDL_Gamepad *gamepad, int *percent);
+
+/**
+ * Check if a gamepad has been opened and is currently connected.
+ *
+ * \param gamepad a gamepad identifier previously returned by
+ * SDL_OpenGamepad().
+ * \returns SDL_TRUE if the gamepad has been opened and is currently
+ * connected, or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadConnected(SDL_Gamepad *gamepad);
+
+/**
+ * Get the underlying joystick from a gamepad.
+ *
+ * This function will give you a SDL_Joystick object, which allows you to use
+ * the SDL_Joystick functions with a SDL_Gamepad object. This would be useful
+ * for getting a joystick's position at any given time, even if it hasn't
+ * moved (moving it would produce an event, which would have the axis' value).
+ *
+ * The pointer returned is owned by the SDL_Gamepad. You should not call
+ * SDL_CloseJoystick() on it, for example, since doing so will likely cause
+ * SDL to crash.
+ *
+ * \param gamepad the gamepad object that you want to get a joystick from.
+ * \returns an SDL_Joystick object, or NULL on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetGamepadJoystick(SDL_Gamepad *gamepad);
+
+/**
+ * Set the state of gamepad event processing.
+ *
+ * If gamepad events are disabled, you must call SDL_UpdateGamepads() yourself
+ * and check the state of the gamepad when you want gamepad information.
+ *
+ * \param enabled whether to process gamepad events or not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GamepadEventsEnabled
+ * \sa SDL_UpdateGamepads
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_SetGamepadEventsEnabled(SDL_bool enabled);
+
+/**
+ * Query the state of gamepad event processing.
+ *
+ * If gamepad events are disabled, you must call SDL_UpdateGamepads() yourself
+ * and check the state of the gamepad when you want gamepad information.
+ *
+ * \returns SDL_TRUE if gamepad events are being processed, SDL_FALSE
+ * otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetGamepadEventsEnabled
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadEventsEnabled(void);
+
+/**
+ * Get the SDL joystick layer bindings for a gamepad.
+ *
+ * \param gamepad a gamepad.
+ * \param count a pointer filled in with the number of bindings returned.
+ * \returns a NULL terminated array of pointers to bindings or NULL on
+ * failure; call SDL_GetError() for more information. This is a
+ * single allocation that should be freed with SDL_free() when it is
+ * no longer needed.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_GamepadBinding ** SDLCALL SDL_GetGamepadBindings(SDL_Gamepad *gamepad, int *count);
+
+/**
+ * Manually pump gamepad updates if not using the loop.
+ *
+ * This function is called automatically by the event loop if events are
+ * enabled. Under such circumstances, it will not be necessary to call this
+ * function.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_UpdateGamepads(void);
+
+/**
+ * Convert a string into SDL_GamepadType enum.
+ *
+ * This function is called internally to translate SDL_Gamepad mapping strings
+ * for the underlying joystick device into the consistent SDL_Gamepad mapping.
+ * You do not normally need to call this function unless you are parsing
+ * SDL_Gamepad mappings in your own code.
+ *
+ * \param str string representing a SDL_GamepadType type.
+ * \returns the SDL_GamepadType enum corresponding to the input string, or
+ * `SDL_GAMEPAD_TYPE_UNKNOWN` if no match was found.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadStringForType
+ */
+extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadTypeFromString(const char *str);
+
+/**
+ * Convert from an SDL_GamepadType enum to a string.
+ *
+ * \param type an enum value for a given SDL_GamepadType.
+ * \returns a string for the given type, or NULL if an invalid type is
+ * specified. The string returned is of the format used by
+ * SDL_Gamepad mapping strings.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadTypeFromString
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForType(SDL_GamepadType type);
+
+/**
+ * Convert a string into SDL_GamepadAxis enum.
+ *
+ * This function is called internally to translate SDL_Gamepad mapping strings
+ * for the underlying joystick device into the consistent SDL_Gamepad mapping.
+ * You do not normally need to call this function unless you are parsing
+ * SDL_Gamepad mappings in your own code.
+ *
+ * Note specially that "righttrigger" and "lefttrigger" map to
+ * `SDL_GAMEPAD_AXIS_RIGHT_TRIGGER` and `SDL_GAMEPAD_AXIS_LEFT_TRIGGER`,
+ * respectively.
+ *
+ * \param str string representing a SDL_Gamepad axis.
+ * \returns the SDL_GamepadAxis enum corresponding to the input string, or
+ * `SDL_GAMEPAD_AXIS_INVALID` if no match was found.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadStringForAxis
+ */
+extern SDL_DECLSPEC SDL_GamepadAxis SDLCALL SDL_GetGamepadAxisFromString(const char *str);
+
+/**
+ * Convert from an SDL_GamepadAxis enum to a string.
+ *
+ * \param axis an enum value for a given SDL_GamepadAxis.
+ * \returns a string for the given axis, or NULL if an invalid axis is
+ * specified. The string returned is of the format used by
+ * SDL_Gamepad mapping strings.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadAxisFromString
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForAxis(SDL_GamepadAxis axis);
+
+/**
+ * Query whether a gamepad has a given axis.
+ *
+ * This merely reports whether the gamepad's mapping defined this axis, as
+ * that is all the information SDL has about the physical device.
+ *
+ * \param gamepad a gamepad.
+ * \param axis an axis enum value (an SDL_GamepadAxis value).
+ * \returns SDL_TRUE if the gamepad has this axis, SDL_FALSE otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GamepadHasButton
+ * \sa SDL_GetGamepadAxis
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadHasAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis);
+
+/**
+ * Get the current state of an axis control on a gamepad.
+ *
+ * The axis indices start at index 0.
+ *
+ * For thumbsticks, the state is a value ranging from -32768 (up/left) to
+ * 32767 (down/right).
+ *
+ * Triggers range from 0 when released to 32767 when fully pressed, and never
+ * return a negative value. Note that this differs from the value reported by
+ * the lower-level SDL_GetJoystickAxis(), which normally uses the full range.
+ *
+ * \param gamepad a gamepad.
+ * \param axis an axis index (one of the SDL_GamepadAxis values).
+ * \returns axis state (including 0) on success or 0 (also) on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GamepadHasAxis
+ * \sa SDL_GetGamepadButton
+ */
+extern SDL_DECLSPEC Sint16 SDLCALL SDL_GetGamepadAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis);
+
+/**
+ * Convert a string into an SDL_GamepadButton enum.
+ *
+ * This function is called internally to translate SDL_Gamepad mapping strings
+ * for the underlying joystick device into the consistent SDL_Gamepad mapping.
+ * You do not normally need to call this function unless you are parsing
+ * SDL_Gamepad mappings in your own code.
+ *
+ * \param str string representing a SDL_Gamepad axis.
+ * \returns the SDL_GamepadButton enum corresponding to the input string, or
+ * `SDL_GAMEPAD_BUTTON_INVALID` if no match was found.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadStringForButton
+ */
+extern SDL_DECLSPEC SDL_GamepadButton SDLCALL SDL_GetGamepadButtonFromString(const char *str);
+
+/**
+ * Convert from an SDL_GamepadButton enum to a string.
+ *
+ * \param button an enum value for a given SDL_GamepadButton.
+ * \returns a string for the given button, or NULL if an invalid button is
+ * specified. The string returned is of the format used by
+ * SDL_Gamepad mapping strings.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadButtonFromString
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForButton(SDL_GamepadButton button);
+
+/**
+ * Query whether a gamepad has a given button.
+ *
+ * This merely reports whether the gamepad's mapping defined this button, as
+ * that is all the information SDL has about the physical device.
+ *
+ * \param gamepad a gamepad.
+ * \param button a button enum value (an SDL_GamepadButton value).
+ * \returns SDL_TRUE if the gamepad has this button, SDL_FALSE otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GamepadHasAxis
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadHasButton(SDL_Gamepad *gamepad, SDL_GamepadButton button);
+
+/**
+ * Get the current state of a button on a gamepad.
+ *
+ * \param gamepad a gamepad.
+ * \param button a button index (one of the SDL_GamepadButton values).
+ * \returns 1 for pressed state or 0 for not pressed state or failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GamepadHasButton
+ * \sa SDL_GetGamepadAxis
+ */
+extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetGamepadButton(SDL_Gamepad *gamepad, SDL_GamepadButton button);
+
+/**
+ * Get the label of a button on a gamepad.
+ *
+ * \param type the type of gamepad to check.
+ * \param button a button index (one of the SDL_GamepadButton values).
+ * \returns the SDL_GamepadButtonLabel enum corresponding to the button label.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadButtonLabel
+ */
+extern SDL_DECLSPEC SDL_GamepadButtonLabel SDLCALL SDL_GetGamepadButtonLabelForType(SDL_GamepadType type, SDL_GamepadButton button);
+
+/**
+ * Get the label of a button on a gamepad.
+ *
+ * \param gamepad a gamepad.
+ * \param button a button index (one of the SDL_GamepadButton values).
+ * \returns the SDL_GamepadButtonLabel enum corresponding to the button label.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadButtonLabelForType
+ */
+extern SDL_DECLSPEC SDL_GamepadButtonLabel SDLCALL SDL_GetGamepadButtonLabel(SDL_Gamepad *gamepad, SDL_GamepadButton button);
+
+/**
+ * Get the number of touchpads on a gamepad.
+ *
+ * \param gamepad a gamepad.
+ * \returns number of touchpads.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetNumGamepadTouchpadFingers
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetNumGamepadTouchpads(SDL_Gamepad *gamepad);
+
+/**
+ * Get the number of supported simultaneous fingers on a touchpad on a game
+ * gamepad.
+ *
+ * \param gamepad a gamepad.
+ * \param touchpad a touchpad.
+ * \returns number of supported simultaneous fingers.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadTouchpadFinger
+ * \sa SDL_GetNumGamepadTouchpads
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetNumGamepadTouchpadFingers(SDL_Gamepad *gamepad, int touchpad);
+
+/**
+ * Get the current state of a finger on a touchpad on a gamepad.
+ *
+ * \param gamepad a gamepad.
+ * \param touchpad a touchpad.
+ * \param finger a finger.
+ * \param state filled with state.
+ * \param x filled with x position, normalized 0 to 1, with the origin in the
+ * upper left.
+ * \param y filled with y position, normalized 0 to 1, with the origin in the
+ * upper left.
+ * \param pressure filled with pressure value.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetNumGamepadTouchpadFingers
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetGamepadTouchpadFinger(SDL_Gamepad *gamepad, int touchpad, int finger, Uint8 *state, float *x, float *y, float *pressure);
+
+/**
+ * Return whether a gamepad has a particular sensor.
+ *
+ * \param gamepad the gamepad to query.
+ * \param type the type of sensor to query.
+ * \returns SDL_TRUE if the sensor exists, SDL_FALSE otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadSensorData
+ * \sa SDL_GetGamepadSensorDataRate
+ * \sa SDL_SetGamepadSensorEnabled
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadHasSensor(SDL_Gamepad *gamepad, SDL_SensorType type);
+
+/**
+ * Set whether data reporting for a gamepad sensor is enabled.
+ *
+ * \param gamepad the gamepad to update.
+ * \param type the type of sensor to enable/disable.
+ * \param enabled whether data reporting should be enabled.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GamepadHasSensor
+ * \sa SDL_GamepadSensorEnabled
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetGamepadSensorEnabled(SDL_Gamepad *gamepad, SDL_SensorType type, SDL_bool enabled);
+
+/**
+ * Query whether sensor data reporting is enabled for a gamepad.
+ *
+ * \param gamepad the gamepad to query.
+ * \param type the type of sensor to query.
+ * \returns SDL_TRUE if the sensor is enabled, SDL_FALSE otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetGamepadSensorEnabled
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GamepadSensorEnabled(SDL_Gamepad *gamepad, SDL_SensorType type);
+
+/**
+ * Get the data rate (number of events per second) of a gamepad sensor.
+ *
+ * \param gamepad the gamepad to query.
+ * \param type the type of sensor to query.
+ * \returns the data rate, or 0.0f if the data rate is not available.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC float SDLCALL SDL_GetGamepadSensorDataRate(SDL_Gamepad *gamepad, SDL_SensorType type);
+
+/**
+ * Get the current state of a gamepad sensor.
+ *
+ * The number of values and interpretation of the data is sensor dependent.
+ * See SDL_sensor.h for the details for each type of sensor.
+ *
+ * \param gamepad the gamepad to query.
+ * \param type the type of sensor to query.
+ * \param data a pointer filled with the current sensor state.
+ * \param num_values the number of values to write to data.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetGamepadSensorData(SDL_Gamepad *gamepad, SDL_SensorType type, float *data, int num_values);
+
+/**
+ * Start a rumble effect on a gamepad.
+ *
+ * Each call to this function cancels any previous rumble effect, and calling
+ * it with 0 intensity stops any rumbling.
+ *
+ * This function requires you to process SDL events or call
+ * SDL_UpdateJoysticks() to update rumble state.
+ *
+ * \param gamepad the gamepad to vibrate.
+ * \param low_frequency_rumble the intensity of the low frequency (left)
+ * rumble motor, from 0 to 0xFFFF.
+ * \param high_frequency_rumble the intensity of the high frequency (right)
+ * rumble motor, from 0 to 0xFFFF.
+ * \param duration_ms the duration of the rumble effect, in milliseconds.
+ * \returns 0, or -1 if rumble isn't supported on this gamepad.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms);
+
+/**
+ * Start a rumble effect in the gamepad's triggers.
+ *
+ * Each call to this function cancels any previous trigger rumble effect, and
+ * calling it with 0 intensity stops any rumbling.
+ *
+ * Note that this is rumbling of the _triggers_ and not the gamepad as a
+ * whole. This is currently only supported on Xbox One gamepads. If you want
+ * the (more common) whole-gamepad rumble, use SDL_RumbleGamepad() instead.
+ *
+ * This function requires you to process SDL events or call
+ * SDL_UpdateJoysticks() to update rumble state.
+ *
+ * \param gamepad the gamepad to vibrate.
+ * \param left_rumble the intensity of the left trigger rumble motor, from 0
+ * to 0xFFFF.
+ * \param right_rumble the intensity of the right trigger rumble motor, from 0
+ * to 0xFFFF.
+ * \param duration_ms the duration of the rumble effect, in milliseconds.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_RumbleGamepad
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_RumbleGamepadTriggers(SDL_Gamepad *gamepad, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms);
+
+/**
+ * Update a gamepad's LED color.
+ *
+ * An example of a joystick LED is the light on the back of a PlayStation 4's
+ * DualShock 4 controller.
+ *
+ * For gamepads with a single color LED, the maximum of the RGB values will be
+ * used as the LED brightness.
+ *
+ * \param gamepad the gamepad to update.
+ * \param red the intensity of the red LED.
+ * \param green the intensity of the green LED.
+ * \param blue the intensity of the blue LED.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetGamepadLED(SDL_Gamepad *gamepad, Uint8 red, Uint8 green, Uint8 blue);
+
+/**
+ * Send a gamepad specific effect packet.
+ *
+ * \param gamepad the gamepad to affect.
+ * \param data the data to send to the gamepad.
+ * \param size the size of the data to send to the gamepad.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SendGamepadEffect(SDL_Gamepad *gamepad, const void *data, int size);
+
+/**
+ * Close a gamepad previously opened with SDL_OpenGamepad().
+ *
+ * \param gamepad a gamepad identifier previously returned by
+ * SDL_OpenGamepad().
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenGamepad
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_CloseGamepad(SDL_Gamepad *gamepad);
+
+/**
+ * Return the sfSymbolsName for a given button on a gamepad on Apple
+ * platforms.
+ *
+ * \param gamepad the gamepad to query.
+ * \param button a button on the gamepad.
+ * \returns the sfSymbolsName or NULL if the name can't be found.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadAppleSFSymbolsNameForAxis
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadAppleSFSymbolsNameForButton(SDL_Gamepad *gamepad, SDL_GamepadButton button);
+
+/**
+ * Return the sfSymbolsName for a given axis on a gamepad on Apple platforms.
+ *
+ * \param gamepad the gamepad to query.
+ * \param axis an axis on the gamepad.
+ * \returns the sfSymbolsName or NULL if the name can't be found.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetGamepadAppleSFSymbolsNameForButton
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadAppleSFSymbolsNameForAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis);
+
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_gamepad_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_guid.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_guid.h
new file mode 100644
index 0000000..285b237
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_guid.h
@@ -0,0 +1,101 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* WIKI CATEGORY: GUID */
+
+/**
+ * # CategoryGUID
+ *
+ * A GUID is a 128-bit value that represents something that is uniquely
+ * identifiable by this value: "globally unique."
+ */
+
+#ifndef SDL_guid_h_
+#define SDL_guid_h_
+
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * An SDL_GUID is a 128-bit identifier for an input device that identifies
+ * that device across runs of SDL programs on the same platform.
+ *
+ * If the device is detached and then re-attached to a different port, or if
+ * the base system is rebooted, the device should still report the same GUID.
+ *
+ * GUIDs are as precise as possible but are not guaranteed to distinguish
+ * physically distinct but equivalent devices. For example, two game
+ * controllers from the same vendor with the same product ID and revision may
+ * have the same GUID.
+ *
+ * GUIDs may be platform-dependent (i.e., the same device may report different
+ * GUIDs on different operating systems).
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_GUID {
+ Uint8 data[16];
+} SDL_GUID;
+
+/* Function prototypes */
+
+/**
+ * Get an ASCII string representation for a given SDL_GUID.
+ *
+ * \param guid the SDL_GUID you wish to convert to string.
+ * \param pszGUID buffer in which to write the ASCII string.
+ * \param cbGUID the size of pszGUID, should be at least 33 bytes.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_StringToGUID
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_GUIDToString(SDL_GUID guid, char *pszGUID, int cbGUID);
+
+/**
+ * Convert a GUID string into a SDL_GUID structure.
+ *
+ * Performs no error checking. If this function is given a string containing
+ * an invalid GUID, the function will silently succeed, but the GUID generated
+ * will not be useful.
+ *
+ * \param pchGUID string containing an ASCII representation of a GUID.
+ * \returns a SDL_GUID structure.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GUIDToString
+ */
+extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_StringToGUID(const char *pchGUID);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_guid_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_haptic.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_haptic.h
new file mode 100644
index 0000000..1d0a54e
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_haptic.h
@@ -0,0 +1,1430 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryHaptic
+ *
+ * The SDL haptic subsystem manages haptic (force feedback) devices.
+ *
+ * The basic usage is as follows:
+ *
+ * - Initialize the subsystem (SDL_INIT_HAPTIC).
+ * - Open a haptic device.
+ * - SDL_OpenHaptic() to open from index.
+ * - SDL_OpenHapticFromJoystick() to open from an existing joystick.
+ * - Create an effect (SDL_HapticEffect).
+ * - Upload the effect with SDL_CreateHapticEffect().
+ * - Run the effect with SDL_RunHapticEffect().
+ * - (optional) Free the effect with SDL_DestroyHapticEffect().
+ * - Close the haptic device with SDL_CloseHaptic().
+ *
+ * Simple rumble example:
+ *
+ * ```c
+ * SDL_Haptic *haptic = NULL;
+ *
+ * // Open the device
+ * SDL_HapticID *haptics = SDL_GetHaptics(NULL);
+ * if (haptics) {
+ * haptic = SDL_OpenHaptic(haptics[0]);
+ * SDL_free(haptics);
+ * }
+ * if (haptic == NULL)
+ * return -1;
+ *
+ * // Initialize simple rumble
+ * if (SDL_InitHapticRumble(haptic) != 0)
+ * return -1;
+ *
+ * // Play effect at 50% strength for 2 seconds
+ * if (SDL_PlayHapticRumble(haptic, 0.5, 2000) != 0)
+ * return -1;
+ * SDL_Delay(2000);
+ *
+ * // Clean up
+ * SDL_CloseHaptic(haptic);
+ * ```
+ *
+ * Complete example:
+ *
+ * ```c
+ * int test_haptic(SDL_Joystick *joystick)
+ * {
+ * SDL_Haptic *haptic;
+ * SDL_HapticEffect effect;
+ * int effect_id;
+ *
+ * // Open the device
+ * haptic = SDL_OpenHapticFromJoystick(joystick);
+ * if (haptic == NULL) return -1; // Most likely joystick isn't haptic
+ *
+ * // See if it can do sine waves
+ * if ((SDL_GetHapticFeatures(haptic) & SDL_HAPTIC_SINE)==0) {
+ * SDL_CloseHaptic(haptic); // No sine effect
+ * return -1;
+ * }
+ *
+ * // Create the effect
+ * SDL_memset(&effect, 0, sizeof(SDL_HapticEffect)); // 0 is safe default
+ * effect.type = SDL_HAPTIC_SINE;
+ * effect.periodic.direction.type = SDL_HAPTIC_POLAR; // Polar coordinates
+ * effect.periodic.direction.dir[0] = 18000; // Force comes from south
+ * effect.periodic.period = 1000; // 1000 ms
+ * effect.periodic.magnitude = 20000; // 20000/32767 strength
+ * effect.periodic.length = 5000; // 5 seconds long
+ * effect.periodic.attack_length = 1000; // Takes 1 second to get max strength
+ * effect.periodic.fade_length = 1000; // Takes 1 second to fade away
+ *
+ * // Upload the effect
+ * effect_id = SDL_CreateHapticEffect(haptic, &effect);
+ *
+ * // Test the effect
+ * SDL_RunHapticEffect(haptic, effect_id, 1);
+ * SDL_Delay(5000); // Wait for the effect to finish
+ *
+ * // We destroy the effect, although closing the device also does this
+ * SDL_DestroyHapticEffect(haptic, effect_id);
+ *
+ * // Close the device
+ * SDL_CloseHaptic(haptic);
+ *
+ * return 0; // Success
+ * }
+ * ```
+ *
+ * Note that the SDL haptic subsystem is not thread-safe.
+ */
+
+
+#ifndef SDL_haptic_h_
+#define SDL_haptic_h_
+
+#include
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* FIXME:
+ *
+ * At the moment the magnitude variables are mixed between signed/unsigned, and
+ * it is also not made clear that ALL of those variables expect a max of 0x7FFF.
+ *
+ * Some platforms may have higher precision than that (Linux FF, Windows XInput)
+ * so we should fix the inconsistency in favor of higher possible precision,
+ * adjusting for platforms that use different scales.
+ * -flibit
+ */
+
+/**
+ * \typedef SDL_Haptic
+ *
+ * The haptic structure used to identify an SDL haptic.
+ *
+ * \sa SDL_OpenHaptic
+ * \sa SDL_OpenHapticFromJoystick
+ * \sa SDL_CloseHaptic
+ */
+struct SDL_Haptic;
+typedef struct SDL_Haptic SDL_Haptic;
+
+
+/**
+ * \name Haptic features
+ *
+ * Different haptic features a device can have.
+ */
+/* @{ */
+
+/**
+ * \name Haptic effects
+ */
+/* @{ */
+
+/**
+ * Constant effect supported.
+ *
+ * Constant haptic effect.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticCondition
+ */
+#define SDL_HAPTIC_CONSTANT (1u<<0)
+
+/**
+ * Sine wave effect supported.
+ *
+ * Periodic haptic effect that simulates sine waves.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticPeriodic
+ */
+#define SDL_HAPTIC_SINE (1u<<1)
+
+/**
+ * Square wave effect supported.
+ *
+ * Periodic haptic effect that simulates square waves.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticPeriodic
+ */
+#define SDL_HAPTIC_SQUARE (1u<<2)
+
+/**
+ * Triangle wave effect supported.
+ *
+ * Periodic haptic effect that simulates triangular waves.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticPeriodic
+ */
+#define SDL_HAPTIC_TRIANGLE (1u<<3)
+
+/**
+ * Sawtoothup wave effect supported.
+ *
+ * Periodic haptic effect that simulates saw tooth up waves.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticPeriodic
+ */
+#define SDL_HAPTIC_SAWTOOTHUP (1u<<4)
+
+/**
+ * Sawtoothdown wave effect supported.
+ *
+ * Periodic haptic effect that simulates saw tooth down waves.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticPeriodic
+ */
+#define SDL_HAPTIC_SAWTOOTHDOWN (1u<<5)
+
+/**
+ * Ramp effect supported.
+ *
+ * Ramp haptic effect.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticRamp
+ */
+#define SDL_HAPTIC_RAMP (1u<<6)
+
+/**
+ * Spring effect supported - uses axes position.
+ *
+ * Condition haptic effect that simulates a spring. Effect is based on the
+ * axes position.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticCondition
+ */
+#define SDL_HAPTIC_SPRING (1u<<7)
+
+/**
+ * Damper effect supported - uses axes velocity.
+ *
+ * Condition haptic effect that simulates dampening. Effect is based on the
+ * axes velocity.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticCondition
+ */
+#define SDL_HAPTIC_DAMPER (1u<<8)
+
+/**
+ * Inertia effect supported - uses axes acceleration.
+ *
+ * Condition haptic effect that simulates inertia. Effect is based on the axes
+ * acceleration.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticCondition
+ */
+#define SDL_HAPTIC_INERTIA (1u<<9)
+
+/**
+ * Friction effect supported - uses axes movement.
+ *
+ * Condition haptic effect that simulates friction. Effect is based on the
+ * axes movement.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticCondition
+ */
+#define SDL_HAPTIC_FRICTION (1u<<10)
+
+/**
+ * Left/Right effect supported.
+ *
+ * Haptic effect for direct control over high/low frequency motors.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticLeftRight
+ */
+#define SDL_HAPTIC_LEFTRIGHT (1u<<11)
+
+/**
+ * Reserved for future use
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_HAPTIC_RESERVED1 (1u<<12)
+#define SDL_HAPTIC_RESERVED2 (1u<<13)
+#define SDL_HAPTIC_RESERVED3 (1u<<14)
+
+/**
+ * Custom effect is supported.
+ *
+ * User defined custom haptic effect.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ */
+#define SDL_HAPTIC_CUSTOM (1u<<15)
+
+/* @} *//* Haptic effects */
+
+/* These last few are features the device has, not effects */
+
+/**
+ * Device can set global gain.
+ *
+ * Device supports setting the global gain.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetHapticGain
+ */
+#define SDL_HAPTIC_GAIN (1u<<16)
+
+/**
+ * Device can set autocenter.
+ *
+ * Device supports setting autocenter.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetHapticAutocenter
+ */
+#define SDL_HAPTIC_AUTOCENTER (1u<<17)
+
+/**
+ * Device can be queried for effect status.
+ *
+ * Device supports querying effect status.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetHapticEffectStatus
+ */
+#define SDL_HAPTIC_STATUS (1u<<18)
+
+/**
+ * Device can be paused.
+ *
+ * Devices supports being paused.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_PauseHaptic
+ * \sa SDL_ResumeHaptic
+ */
+#define SDL_HAPTIC_PAUSE (1u<<19)
+
+
+/**
+ * \name Direction encodings
+ */
+/* @{ */
+
+/**
+ * Uses polar coordinates for the direction.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticDirection
+ */
+#define SDL_HAPTIC_POLAR 0
+
+/**
+ * Uses cartesian coordinates for the direction.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticDirection
+ */
+#define SDL_HAPTIC_CARTESIAN 1
+
+/**
+ * Uses spherical coordinates for the direction.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticDirection
+ */
+#define SDL_HAPTIC_SPHERICAL 2
+
+/**
+ * Use this value to play an effect on the steering wheel axis.
+ *
+ * This provides better compatibility across platforms and devices as SDL will
+ * guess the correct axis.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticDirection
+ */
+#define SDL_HAPTIC_STEERING_AXIS 3
+
+/* @} *//* Direction encodings */
+
+/* @} *//* Haptic features */
+
+/*
+ * Misc defines.
+ */
+
+/**
+ * Used to play a device an infinite number of times.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_RunHapticEffect
+ */
+#define SDL_HAPTIC_INFINITY 4294967295U
+
+
+/**
+ * Structure that represents a haptic direction.
+ *
+ * This is the direction where the force comes from, instead of the direction
+ * in which the force is exerted.
+ *
+ * Directions can be specified by:
+ *
+ * - SDL_HAPTIC_POLAR : Specified by polar coordinates.
+ * - SDL_HAPTIC_CARTESIAN : Specified by cartesian coordinates.
+ * - SDL_HAPTIC_SPHERICAL : Specified by spherical coordinates.
+ *
+ * Cardinal directions of the haptic device are relative to the positioning of
+ * the device. North is considered to be away from the user.
+ *
+ * The following diagram represents the cardinal directions:
+ *
+ * ```
+ * .--.
+ * |__| .-------.
+ * |=.| |.-----.|
+ * |--| || ||
+ * | | |'-----'|
+ * |__|~')_____('
+ * [ COMPUTER ]
+ *
+ *
+ * North (0,-1)
+ * ^
+ * |
+ * |
+ * (-1,0) West <----[ HAPTIC ]----> East (1,0)
+ * |
+ * |
+ * v
+ * South (0,1)
+ *
+ *
+ * [ USER ]
+ * \|||/
+ * (o o)
+ * ---ooO-(_)-Ooo---
+ * ```
+ *
+ * If type is SDL_HAPTIC_POLAR, direction is encoded by hundredths of a degree
+ * starting north and turning clockwise. SDL_HAPTIC_POLAR only uses the first
+ * `dir` parameter. The cardinal directions would be:
+ *
+ * - North: 0 (0 degrees)
+ * - East: 9000 (90 degrees)
+ * - South: 18000 (180 degrees)
+ * - West: 27000 (270 degrees)
+ *
+ * If type is SDL_HAPTIC_CARTESIAN, direction is encoded by three positions (X
+ * axis, Y axis and Z axis (with 3 axes)). SDL_HAPTIC_CARTESIAN uses the first
+ * three `dir` parameters. The cardinal directions would be:
+ *
+ * - North: 0,-1, 0
+ * - East: 1, 0, 0
+ * - South: 0, 1, 0
+ * - West: -1, 0, 0
+ *
+ * The Z axis represents the height of the effect if supported, otherwise it's
+ * unused. In cartesian encoding (1, 2) would be the same as (2, 4), you can
+ * use any multiple you want, only the direction matters.
+ *
+ * If type is SDL_HAPTIC_SPHERICAL, direction is encoded by two rotations. The
+ * first two `dir` parameters are used. The `dir` parameters are as follows
+ * (all values are in hundredths of degrees):
+ *
+ * - Degrees from (1, 0) rotated towards (0, 1).
+ * - Degrees towards (0, 0, 1) (device needs at least 3 axes).
+ *
+ * Example of force coming from the south with all encodings (force coming
+ * from the south means the user will have to pull the stick to counteract):
+ *
+ * ```c
+ * SDL_HapticDirection direction;
+ *
+ * // Cartesian directions
+ * direction.type = SDL_HAPTIC_CARTESIAN; // Using cartesian direction encoding.
+ * direction.dir[0] = 0; // X position
+ * direction.dir[1] = 1; // Y position
+ * // Assuming the device has 2 axes, we don't need to specify third parameter.
+ *
+ * // Polar directions
+ * direction.type = SDL_HAPTIC_POLAR; // We'll be using polar direction encoding.
+ * direction.dir[0] = 18000; // Polar only uses first parameter
+ *
+ * // Spherical coordinates
+ * direction.type = SDL_HAPTIC_SPHERICAL; // Spherical encoding
+ * direction.dir[0] = 9000; // Since we only have two axes we don't need more parameters.
+ * ```
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_HAPTIC_POLAR
+ * \sa SDL_HAPTIC_CARTESIAN
+ * \sa SDL_HAPTIC_SPHERICAL
+ * \sa SDL_HAPTIC_STEERING_AXIS
+ * \sa SDL_HapticEffect
+ * \sa SDL_GetNumHapticAxes
+ */
+typedef struct SDL_HapticDirection
+{
+ Uint8 type; /**< The type of encoding. */
+ Sint32 dir[3]; /**< The encoded direction. */
+} SDL_HapticDirection;
+
+
+/**
+ * A structure containing a template for a Constant effect.
+ *
+ * This struct is exclusively for the SDL_HAPTIC_CONSTANT effect.
+ *
+ * A constant effect applies a constant force in the specified direction to
+ * the joystick.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_HAPTIC_CONSTANT
+ * \sa SDL_HapticEffect
+ */
+typedef struct SDL_HapticConstant
+{
+ /* Header */
+ Uint16 type; /**< SDL_HAPTIC_CONSTANT */
+ SDL_HapticDirection direction; /**< Direction of the effect. */
+
+ /* Replay */
+ Uint32 length; /**< Duration of the effect. */
+ Uint16 delay; /**< Delay before starting the effect. */
+
+ /* Trigger */
+ Uint16 button; /**< Button that triggers the effect. */
+ Uint16 interval; /**< How soon it can be triggered again after button. */
+
+ /* Constant */
+ Sint16 level; /**< Strength of the constant effect. */
+
+ /* Envelope */
+ Uint16 attack_length; /**< Duration of the attack. */
+ Uint16 attack_level; /**< Level at the start of the attack. */
+ Uint16 fade_length; /**< Duration of the fade. */
+ Uint16 fade_level; /**< Level at the end of the fade. */
+} SDL_HapticConstant;
+
+/**
+ * A structure containing a template for a Periodic effect.
+ *
+ * The struct handles the following effects:
+ *
+ * - SDL_HAPTIC_SINE
+ * - SDL_HAPTIC_SQUARE
+ * - SDL_HAPTIC_TRIANGLE
+ * - SDL_HAPTIC_SAWTOOTHUP
+ * - SDL_HAPTIC_SAWTOOTHDOWN
+ *
+ * A periodic effect consists in a wave-shaped effect that repeats itself over
+ * time. The type determines the shape of the wave and the parameters
+ * determine the dimensions of the wave.
+ *
+ * Phase is given by hundredth of a degree meaning that giving the phase a
+ * value of 9000 will displace it 25% of its period. Here are sample values:
+ *
+ * - 0: No phase displacement.
+ * - 9000: Displaced 25% of its period.
+ * - 18000: Displaced 50% of its period.
+ * - 27000: Displaced 75% of its period.
+ * - 36000: Displaced 100% of its period, same as 0, but 0 is preferred.
+ *
+ * Examples:
+ *
+ * ```
+ * SDL_HAPTIC_SINE
+ * __ __ __ __
+ * / \ / \ / \ /
+ * / \__/ \__/ \__/
+ *
+ * SDL_HAPTIC_SQUARE
+ * __ __ __ __ __
+ * | | | | | | | | | |
+ * | |__| |__| |__| |__| |
+ *
+ * SDL_HAPTIC_TRIANGLE
+ * /\ /\ /\ /\ /\
+ * / \ / \ / \ / \ /
+ * / \/ \/ \/ \/
+ *
+ * SDL_HAPTIC_SAWTOOTHUP
+ * /| /| /| /| /| /| /|
+ * / | / | / | / | / | / | / |
+ * / |/ |/ |/ |/ |/ |/ |
+ *
+ * SDL_HAPTIC_SAWTOOTHDOWN
+ * \ |\ |\ |\ |\ |\ |\ |
+ * \ | \ | \ | \ | \ | \ | \ |
+ * \| \| \| \| \| \| \|
+ * ```
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_HAPTIC_SINE
+ * \sa SDL_HAPTIC_SQUARE
+ * \sa SDL_HAPTIC_TRIANGLE
+ * \sa SDL_HAPTIC_SAWTOOTHUP
+ * \sa SDL_HAPTIC_SAWTOOTHDOWN
+ * \sa SDL_HapticEffect
+ */
+typedef struct SDL_HapticPeriodic
+{
+ /* Header */
+ Uint16 type; /**< SDL_HAPTIC_SINE, SDL_HAPTIC_SQUARE
+ SDL_HAPTIC_TRIANGLE, SDL_HAPTIC_SAWTOOTHUP or
+ SDL_HAPTIC_SAWTOOTHDOWN */
+ SDL_HapticDirection direction; /**< Direction of the effect. */
+
+ /* Replay */
+ Uint32 length; /**< Duration of the effect. */
+ Uint16 delay; /**< Delay before starting the effect. */
+
+ /* Trigger */
+ Uint16 button; /**< Button that triggers the effect. */
+ Uint16 interval; /**< How soon it can be triggered again after button. */
+
+ /* Periodic */
+ Uint16 period; /**< Period of the wave. */
+ Sint16 magnitude; /**< Peak value; if negative, equivalent to 180 degrees extra phase shift. */
+ Sint16 offset; /**< Mean value of the wave. */
+ Uint16 phase; /**< Positive phase shift given by hundredth of a degree. */
+
+ /* Envelope */
+ Uint16 attack_length; /**< Duration of the attack. */
+ Uint16 attack_level; /**< Level at the start of the attack. */
+ Uint16 fade_length; /**< Duration of the fade. */
+ Uint16 fade_level; /**< Level at the end of the fade. */
+} SDL_HapticPeriodic;
+
+/**
+ * A structure containing a template for a Condition effect.
+ *
+ * The struct handles the following effects:
+ *
+ * - SDL_HAPTIC_SPRING: Effect based on axes position.
+ * - SDL_HAPTIC_DAMPER: Effect based on axes velocity.
+ * - SDL_HAPTIC_INERTIA: Effect based on axes acceleration.
+ * - SDL_HAPTIC_FRICTION: Effect based on axes movement.
+ *
+ * Direction is handled by condition internals instead of a direction member.
+ * The condition effect specific members have three parameters. The first
+ * refers to the X axis, the second refers to the Y axis and the third refers
+ * to the Z axis. The right terms refer to the positive side of the axis and
+ * the left terms refer to the negative side of the axis. Please refer to the
+ * SDL_HapticDirection diagram for which side is positive and which is
+ * negative.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticDirection
+ * \sa SDL_HAPTIC_SPRING
+ * \sa SDL_HAPTIC_DAMPER
+ * \sa SDL_HAPTIC_INERTIA
+ * \sa SDL_HAPTIC_FRICTION
+ * \sa SDL_HapticEffect
+ */
+typedef struct SDL_HapticCondition
+{
+ /* Header */
+ Uint16 type; /**< SDL_HAPTIC_SPRING, SDL_HAPTIC_DAMPER,
+ SDL_HAPTIC_INERTIA or SDL_HAPTIC_FRICTION */
+ SDL_HapticDirection direction; /**< Direction of the effect - Not used ATM. */
+
+ /* Replay */
+ Uint32 length; /**< Duration of the effect. */
+ Uint16 delay; /**< Delay before starting the effect. */
+
+ /* Trigger */
+ Uint16 button; /**< Button that triggers the effect. */
+ Uint16 interval; /**< How soon it can be triggered again after button. */
+
+ /* Condition */
+ Uint16 right_sat[3]; /**< Level when joystick is to the positive side; max 0xFFFF. */
+ Uint16 left_sat[3]; /**< Level when joystick is to the negative side; max 0xFFFF. */
+ Sint16 right_coeff[3]; /**< How fast to increase the force towards the positive side. */
+ Sint16 left_coeff[3]; /**< How fast to increase the force towards the negative side. */
+ Uint16 deadband[3]; /**< Size of the dead zone; max 0xFFFF: whole axis-range when 0-centered. */
+ Sint16 center[3]; /**< Position of the dead zone. */
+} SDL_HapticCondition;
+
+/**
+ * A structure containing a template for a Ramp effect.
+ *
+ * This struct is exclusively for the SDL_HAPTIC_RAMP effect.
+ *
+ * The ramp effect starts at start strength and ends at end strength. It
+ * augments in linear fashion. If you use attack and fade with a ramp the
+ * effects get added to the ramp effect making the effect become quadratic
+ * instead of linear.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_HAPTIC_RAMP
+ * \sa SDL_HapticEffect
+ */
+typedef struct SDL_HapticRamp
+{
+ /* Header */
+ Uint16 type; /**< SDL_HAPTIC_RAMP */
+ SDL_HapticDirection direction; /**< Direction of the effect. */
+
+ /* Replay */
+ Uint32 length; /**< Duration of the effect. */
+ Uint16 delay; /**< Delay before starting the effect. */
+
+ /* Trigger */
+ Uint16 button; /**< Button that triggers the effect. */
+ Uint16 interval; /**< How soon it can be triggered again after button. */
+
+ /* Ramp */
+ Sint16 start; /**< Beginning strength level. */
+ Sint16 end; /**< Ending strength level. */
+
+ /* Envelope */
+ Uint16 attack_length; /**< Duration of the attack. */
+ Uint16 attack_level; /**< Level at the start of the attack. */
+ Uint16 fade_length; /**< Duration of the fade. */
+ Uint16 fade_level; /**< Level at the end of the fade. */
+} SDL_HapticRamp;
+
+/**
+ * A structure containing a template for a Left/Right effect.
+ *
+ * This struct is exclusively for the SDL_HAPTIC_LEFTRIGHT effect.
+ *
+ * The Left/Right effect is used to explicitly control the large and small
+ * motors, commonly found in modern game controllers. The small (right) motor
+ * is high frequency, and the large (left) motor is low frequency.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_HAPTIC_LEFTRIGHT
+ * \sa SDL_HapticEffect
+ */
+typedef struct SDL_HapticLeftRight
+{
+ /* Header */
+ Uint16 type; /**< SDL_HAPTIC_LEFTRIGHT */
+
+ /* Replay */
+ Uint32 length; /**< Duration of the effect in milliseconds. */
+
+ /* Rumble */
+ Uint16 large_magnitude; /**< Control of the large controller motor. */
+ Uint16 small_magnitude; /**< Control of the small controller motor. */
+} SDL_HapticLeftRight;
+
+/**
+ * A structure containing a template for the SDL_HAPTIC_CUSTOM effect.
+ *
+ * This struct is exclusively for the SDL_HAPTIC_CUSTOM effect.
+ *
+ * A custom force feedback effect is much like a periodic effect, where the
+ * application can define its exact shape. You will have to allocate the data
+ * yourself. Data should consist of channels * samples Uint16 samples.
+ *
+ * If channels is one, the effect is rotated using the defined direction.
+ * Otherwise it uses the samples in data for the different axes.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_HAPTIC_CUSTOM
+ * \sa SDL_HapticEffect
+ */
+typedef struct SDL_HapticCustom
+{
+ /* Header */
+ Uint16 type; /**< SDL_HAPTIC_CUSTOM */
+ SDL_HapticDirection direction; /**< Direction of the effect. */
+
+ /* Replay */
+ Uint32 length; /**< Duration of the effect. */
+ Uint16 delay; /**< Delay before starting the effect. */
+
+ /* Trigger */
+ Uint16 button; /**< Button that triggers the effect. */
+ Uint16 interval; /**< How soon it can be triggered again after button. */
+
+ /* Custom */
+ Uint8 channels; /**< Axes to use, minimum of one. */
+ Uint16 period; /**< Sample periods. */
+ Uint16 samples; /**< Amount of samples. */
+ Uint16 *data; /**< Should contain channels*samples items. */
+
+ /* Envelope */
+ Uint16 attack_length; /**< Duration of the attack. */
+ Uint16 attack_level; /**< Level at the start of the attack. */
+ Uint16 fade_length; /**< Duration of the fade. */
+ Uint16 fade_level; /**< Level at the end of the fade. */
+} SDL_HapticCustom;
+
+/**
+ * The generic template for any haptic effect.
+ *
+ * All values max at 32767 (0x7FFF). Signed values also can be negative. Time
+ * values unless specified otherwise are in milliseconds.
+ *
+ * You can also pass SDL_HAPTIC_INFINITY to length instead of a 0-32767 value.
+ * Neither delay, interval, attack_length nor fade_length support
+ * SDL_HAPTIC_INFINITY. Fade will also not be used since effect never ends.
+ *
+ * Additionally, the SDL_HAPTIC_RAMP effect does not support a duration of
+ * SDL_HAPTIC_INFINITY.
+ *
+ * Button triggers may not be supported on all devices, it is advised to not
+ * use them if possible. Buttons start at index 1 instead of index 0 like the
+ * joystick.
+ *
+ * If both attack_length and fade_level are 0, the envelope is not used,
+ * otherwise both values are used.
+ *
+ * Common parts:
+ *
+ * ```c
+ * // Replay - All effects have this
+ * Uint32 length; // Duration of effect (ms).
+ * Uint16 delay; // Delay before starting effect.
+ *
+ * // Trigger - All effects have this
+ * Uint16 button; // Button that triggers effect.
+ * Uint16 interval; // How soon before effect can be triggered again.
+ *
+ * // Envelope - All effects except condition effects have this
+ * Uint16 attack_length; // Duration of the attack (ms).
+ * Uint16 attack_level; // Level at the start of the attack.
+ * Uint16 fade_length; // Duration of the fade out (ms).
+ * Uint16 fade_level; // Level at the end of the fade.
+ * ```
+ *
+ * Here we have an example of a constant effect evolution in time:
+ *
+ * ```
+ * Strength
+ * ^
+ * |
+ * | effect level --> _________________
+ * | / \
+ * | / \
+ * | / \
+ * | / \
+ * | attack_level --> | \
+ * | | | <--- fade_level
+ * |
+ * +--------------------------------------------------> Time
+ * [--] [---]
+ * attack_length fade_length
+ *
+ * [------------------][-----------------------]
+ * delay length
+ * ```
+ *
+ * Note either the attack_level or the fade_level may be above the actual
+ * effect level.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticConstant
+ * \sa SDL_HapticPeriodic
+ * \sa SDL_HapticCondition
+ * \sa SDL_HapticRamp
+ * \sa SDL_HapticLeftRight
+ * \sa SDL_HapticCustom
+ */
+typedef union SDL_HapticEffect
+{
+ /* Common for all force feedback effects */
+ Uint16 type; /**< Effect type. */
+ SDL_HapticConstant constant; /**< Constant effect. */
+ SDL_HapticPeriodic periodic; /**< Periodic effect. */
+ SDL_HapticCondition condition; /**< Condition effect. */
+ SDL_HapticRamp ramp; /**< Ramp effect. */
+ SDL_HapticLeftRight leftright; /**< Left/Right effect. */
+ SDL_HapticCustom custom; /**< Custom effect. */
+} SDL_HapticEffect;
+
+/**
+ * This is a unique ID for a haptic device for the time it is connected to the
+ * system, and is never reused for the lifetime of the application.
+ *
+ * If the haptic device is disconnected and reconnected, it will get a new ID.
+ *
+ * The ID value starts at 1 and increments from there. The value 0 is an
+ * invalid ID.
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ */
+typedef Uint32 SDL_HapticID;
+
+
+/* Function prototypes */
+
+/**
+ * Get a list of currently connected haptic devices.
+ *
+ * \param count a pointer filled in with the number of haptic devices
+ * returned, may be NULL.
+ * \returns a 0 terminated array of haptic device instance IDs or NULL on
+ * failure; call SDL_GetError() for more information. This should be
+ * freed with SDL_free() when it is no longer needed.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenHaptic
+ */
+extern SDL_DECLSPEC SDL_HapticID * SDLCALL SDL_GetHaptics(int *count);
+
+/**
+ * Get the implementation dependent name of a haptic device.
+ *
+ * This can be called before any haptic devices are opened.
+ *
+ * \param instance_id the haptic device instance ID.
+ * \returns the name of the selected haptic device. If no name can be found,
+ * this function returns NULL; call SDL_GetError() for more
+ * information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetHapticName
+ * \sa SDL_OpenHaptic
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetHapticNameForID(SDL_HapticID instance_id);
+
+/**
+ * Open a haptic device for use.
+ *
+ * The index passed as an argument refers to the N'th haptic device on this
+ * system.
+ *
+ * When opening a haptic device, its gain will be set to maximum and
+ * autocenter will be disabled. To modify these values use SDL_SetHapticGain()
+ * and SDL_SetHapticAutocenter().
+ *
+ * \param instance_id the haptic device instance ID.
+ * \returns the device identifier or NULL on failure; call SDL_GetError() for
+ * more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_CloseHaptic
+ * \sa SDL_GetHaptics
+ * \sa SDL_OpenHapticFromJoystick
+ * \sa SDL_OpenHapticFromMouse
+ * \sa SDL_SetHapticAutocenter
+ * \sa SDL_SetHapticGain
+ */
+extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_OpenHaptic(SDL_HapticID instance_id);
+
+
+/**
+ * Get the SDL_Haptic associated with an instance ID, if it has been opened.
+ *
+ * \param instance_id the instance ID to get the SDL_Haptic for.
+ * \returns an SDL_Haptic on success or NULL on failure or if it hasn't been
+ * opened yet; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_GetHapticFromID(SDL_HapticID instance_id);
+
+/**
+ * Get the instance ID of an opened haptic device.
+ *
+ * \param haptic the SDL_Haptic device to query.
+ * \returns the instance ID of the specified haptic device on success or 0 on
+ * failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_HapticID SDLCALL SDL_GetHapticID(SDL_Haptic *haptic);
+
+/**
+ * Get the implementation dependent name of a haptic device.
+ *
+ * \param haptic the SDL_Haptic obtained from SDL_OpenJoystick().
+ * \returns the name of the selected haptic device. If no name can be found,
+ * this function returns NULL; call SDL_GetError() for more
+ * information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetHapticNameForID
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetHapticName(SDL_Haptic *haptic);
+
+/**
+ * Query whether or not the current mouse has haptic capabilities.
+ *
+ * \returns SDL_TRUE if the mouse is haptic or SDL_FALSE if it isn't.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenHapticFromMouse
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsMouseHaptic(void);
+
+/**
+ * Try to open a haptic device from the current mouse.
+ *
+ * \returns the haptic device identifier or NULL on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_CloseHaptic
+ * \sa SDL_IsMouseHaptic
+ */
+extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_OpenHapticFromMouse(void);
+
+/**
+ * Query if a joystick has haptic features.
+ *
+ * \param joystick the SDL_Joystick to test for haptic capabilities.
+ * \returns SDL_TRUE if the joystick is haptic or SDL_FALSE if it isn't.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenHapticFromJoystick
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsJoystickHaptic(SDL_Joystick *joystick);
+
+/**
+ * Open a haptic device for use from a joystick device.
+ *
+ * You must still close the haptic device separately. It will not be closed
+ * with the joystick.
+ *
+ * When opened from a joystick you should first close the haptic device before
+ * closing the joystick device. If not, on some implementations the haptic
+ * device will also get unallocated and you'll be unable to use force feedback
+ * on that device.
+ *
+ * \param joystick the SDL_Joystick to create a haptic device from.
+ * \returns a valid haptic device identifier on success or NULL on failure;
+ * call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_CloseHaptic
+ * \sa SDL_IsJoystickHaptic
+ */
+extern SDL_DECLSPEC SDL_Haptic * SDLCALL SDL_OpenHapticFromJoystick(SDL_Joystick *joystick);
+
+/**
+ * Close a haptic device previously opened with SDL_OpenHaptic().
+ *
+ * \param haptic the SDL_Haptic device to close.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenHaptic
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_CloseHaptic(SDL_Haptic *haptic);
+
+/**
+ * Get the number of effects a haptic device can store.
+ *
+ * On some platforms this isn't fully supported, and therefore is an
+ * approximation. Always check to see if your created effect was actually
+ * created and do not rely solely on SDL_GetMaxHapticEffects().
+ *
+ * \param haptic the SDL_Haptic device to query.
+ * \returns the number of effects the haptic device can store or a negative
+ * error code on failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetMaxHapticEffectsPlaying
+ * \sa SDL_GetHapticFeatures
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetMaxHapticEffects(SDL_Haptic *haptic);
+
+/**
+ * Get the number of effects a haptic device can play at the same time.
+ *
+ * This is not supported on all platforms, but will always return a value.
+ *
+ * \param haptic the SDL_Haptic device to query maximum playing effects.
+ * \returns the number of effects the haptic device can play at the same time
+ * or a negative error code on failure; call SDL_GetError() for more
+ * information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetMaxHapticEffects
+ * \sa SDL_GetHapticFeatures
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetMaxHapticEffectsPlaying(SDL_Haptic *haptic);
+
+/**
+ * Get the haptic device's supported features in bitwise manner.
+ *
+ * \param haptic the SDL_Haptic device to query.
+ * \returns a list of supported haptic features in bitwise manner (OR'd), or 0
+ * on failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HapticEffectSupported
+ * \sa SDL_GetMaxHapticEffects
+ */
+extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetHapticFeatures(SDL_Haptic *haptic);
+
+/**
+ * Get the number of haptic axes the device has.
+ *
+ * The number of haptic axes might be useful if working with the
+ * SDL_HapticDirection effect.
+ *
+ * \param haptic the SDL_Haptic device to query.
+ * \returns the number of axes on success or a negative error code on failure;
+ * call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetNumHapticAxes(SDL_Haptic *haptic);
+
+/**
+ * Check to see if an effect is supported by a haptic device.
+ *
+ * \param haptic the SDL_Haptic device to query.
+ * \param effect the desired effect to query.
+ * \returns SDL_TRUE if the effect is supported or SDL_FALSE if it isn't.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_CreateHapticEffect
+ * \sa SDL_GetHapticFeatures
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HapticEffectSupported(SDL_Haptic *haptic, const SDL_HapticEffect *effect);
+
+/**
+ * Create a new haptic effect on a specified device.
+ *
+ * \param haptic an SDL_Haptic device to create the effect on.
+ * \param effect an SDL_HapticEffect structure containing the properties of
+ * the effect to create.
+ * \returns the ID of the effect on success or a negative error code on
+ * failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_DestroyHapticEffect
+ * \sa SDL_RunHapticEffect
+ * \sa SDL_UpdateHapticEffect
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_CreateHapticEffect(SDL_Haptic *haptic, const SDL_HapticEffect *effect);
+
+/**
+ * Update the properties of an effect.
+ *
+ * Can be used dynamically, although behavior when dynamically changing
+ * direction may be strange. Specifically the effect may re-upload itself and
+ * start playing from the start. You also cannot change the type either when
+ * running SDL_UpdateHapticEffect().
+ *
+ * \param haptic the SDL_Haptic device that has the effect.
+ * \param effect the identifier of the effect to update.
+ * \param data an SDL_HapticEffect structure containing the new effect
+ * properties to use.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_CreateHapticEffect
+ * \sa SDL_RunHapticEffect
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_UpdateHapticEffect(SDL_Haptic *haptic, int effect, const SDL_HapticEffect *data);
+
+/**
+ * Run the haptic effect on its associated haptic device.
+ *
+ * To repeat the effect over and over indefinitely, set `iterations` to
+ * `SDL_HAPTIC_INFINITY`. (Repeats the envelope - attack and fade.) To make
+ * one instance of the effect last indefinitely (so the effect does not fade),
+ * set the effect's `length` in its structure/union to `SDL_HAPTIC_INFINITY`
+ * instead.
+ *
+ * \param haptic the SDL_Haptic device to run the effect on.
+ * \param effect the ID of the haptic effect to run.
+ * \param iterations the number of iterations to run the effect; use
+ * `SDL_HAPTIC_INFINITY` to repeat forever.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetHapticEffectStatus
+ * \sa SDL_StopHapticEffect
+ * \sa SDL_StopHapticEffects
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_RunHapticEffect(SDL_Haptic *haptic, int effect, Uint32 iterations);
+
+/**
+ * Stop the haptic effect on its associated haptic device.
+ *
+ * \param haptic the SDL_Haptic device to stop the effect on.
+ * \param effect the ID of the haptic effect to stop.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_RunHapticEffect
+ * \sa SDL_StopHapticEffects
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_StopHapticEffect(SDL_Haptic *haptic, int effect);
+
+/**
+ * Destroy a haptic effect on the device.
+ *
+ * This will stop the effect if it's running. Effects are automatically
+ * destroyed when the device is closed.
+ *
+ * \param haptic the SDL_Haptic device to destroy the effect on.
+ * \param effect the ID of the haptic effect to destroy.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_CreateHapticEffect
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_DestroyHapticEffect(SDL_Haptic *haptic, int effect);
+
+/**
+ * Get the status of the current effect on the specified haptic device.
+ *
+ * Device must support the SDL_HAPTIC_STATUS feature.
+ *
+ * \param haptic the SDL_Haptic device to query for the effect status on.
+ * \param effect the ID of the haptic effect to query its status.
+ * \returns 0 if it isn't playing, 1 if it is playing, or a negative error
+ * code on failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetHapticEffectStatus(SDL_Haptic *haptic, int effect);
+
+/**
+ * Set the global gain of the specified haptic device.
+ *
+ * Device must support the SDL_HAPTIC_GAIN feature.
+ *
+ * The user may specify the maximum gain by setting the environment variable
+ * `SDL_HAPTIC_GAIN_MAX` which should be between 0 and 100. All calls to
+ * SDL_SetHapticGain() will scale linearly using `SDL_HAPTIC_GAIN_MAX` as the
+ * maximum.
+ *
+ * \param haptic the SDL_Haptic device to set the gain on.
+ * \param gain value to set the gain to, should be between 0 and 100 (0 -
+ * 100).
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetHapticFeatures
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetHapticGain(SDL_Haptic *haptic, int gain);
+
+/**
+ * Set the global autocenter of the device.
+ *
+ * Autocenter should be between 0 and 100. Setting it to 0 will disable
+ * autocentering.
+ *
+ * Device must support the SDL_HAPTIC_AUTOCENTER feature.
+ *
+ * \param haptic the SDL_Haptic device to set autocentering on.
+ * \param autocenter value to set autocenter to (0-100).
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetHapticFeatures
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetHapticAutocenter(SDL_Haptic *haptic, int autocenter);
+
+/**
+ * Pause a haptic device.
+ *
+ * Device must support the `SDL_HAPTIC_PAUSE` feature. Call SDL_ResumeHaptic()
+ * to resume playback.
+ *
+ * Do not modify the effects nor add new ones while the device is paused. That
+ * can cause all sorts of weird errors.
+ *
+ * \param haptic the SDL_Haptic device to pause.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_ResumeHaptic
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_PauseHaptic(SDL_Haptic *haptic);
+
+/**
+ * Resume a haptic device.
+ *
+ * Call to unpause after SDL_PauseHaptic().
+ *
+ * \param haptic the SDL_Haptic device to unpause.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PauseHaptic
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_ResumeHaptic(SDL_Haptic *haptic);
+
+/**
+ * Stop all the currently playing effects on a haptic device.
+ *
+ * \param haptic the SDL_Haptic device to stop.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_RunHapticEffect
+ * \sa SDL_StopHapticEffects
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_StopHapticEffects(SDL_Haptic *haptic);
+
+/**
+ * Check whether rumble is supported on a haptic device.
+ *
+ * \param haptic haptic device to check for rumble support.
+ * \returns SDL_TRUE if the effect is supported or SDL_FALSE if it isn't.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_InitHapticRumble
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HapticRumbleSupported(SDL_Haptic *haptic);
+
+/**
+ * Initialize a haptic device for simple rumble playback.
+ *
+ * \param haptic the haptic device to initialize for simple rumble playback.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PlayHapticRumble
+ * \sa SDL_StopHapticRumble
+ * \sa SDL_HapticRumbleSupported
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_InitHapticRumble(SDL_Haptic *haptic);
+
+/**
+ * Run a simple rumble effect on a haptic device.
+ *
+ * \param haptic the haptic device to play the rumble effect on.
+ * \param strength strength of the rumble to play as a 0-1 float value.
+ * \param length length of the rumble to play in milliseconds.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_InitHapticRumble
+ * \sa SDL_StopHapticRumble
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_PlayHapticRumble(SDL_Haptic *haptic, float strength, Uint32 length);
+
+/**
+ * Stop the simple rumble on a haptic device.
+ *
+ * \param haptic the haptic device to stop the rumble effect on.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PlayHapticRumble
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_StopHapticRumble(SDL_Haptic *haptic);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_haptic_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_hidapi.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_hidapi.h
new file mode 100644
index 0000000..66bea9d
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_hidapi.h
@@ -0,0 +1,552 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* WIKI CATEGORY: HIDAPI */
+
+/**
+ * # CategoryHIDAPI
+ *
+ * Header file for SDL HIDAPI functions.
+ *
+ * This is an adaptation of the original HIDAPI interface by Alan Ott, and
+ * includes source code licensed under the following license:
+ *
+ * ```
+ * HIDAPI - Multi-Platform library for
+ * communication with HID devices.
+ *
+ * Copyright 2009, Alan Ott, Signal 11 Software.
+ * All Rights Reserved.
+ *
+ * This software may be used by anyone for any reason so
+ * long as the copyright notice in the source files
+ * remains intact.
+ * ```
+ *
+ * (Note that this license is the same as item three of SDL's zlib license, so
+ * it adds no new requirements on the user.)
+ *
+ * If you would like a version of SDL without this code, you can build SDL
+ * with SDL_HIDAPI_DISABLED defined to 1. You might want to do this for
+ * example on iOS or tvOS to avoid a dependency on the CoreBluetooth
+ * framework.
+ */
+
+#ifndef SDL_hidapi_h_
+#define SDL_hidapi_h_
+
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * An opaque handle representing an open HID device.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_hid_device SDL_hid_device;
+
+/**
+ * HID underlying bus types.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ */
+typedef enum SDL_hid_bus_type {
+ /** Unknown bus type */
+ SDL_HID_API_BUS_UNKNOWN = 0x00,
+
+ /** USB bus
+ Specifications:
+ https://usb.org/hid */
+ SDL_HID_API_BUS_USB = 0x01,
+
+ /** Bluetooth or Bluetooth LE bus
+ Specifications:
+ https://www.bluetooth.com/specifications/specs/human-interface-device-profile-1-1-1/
+ https://www.bluetooth.com/specifications/specs/hid-service-1-0/
+ https://www.bluetooth.com/specifications/specs/hid-over-gatt-profile-1-0/ */
+ SDL_HID_API_BUS_BLUETOOTH = 0x02,
+
+ /** I2C bus
+ Specifications:
+ https://docs.microsoft.com/previous-versions/windows/hardware/design/dn642101(v=vs.85) */
+ SDL_HID_API_BUS_I2C = 0x03,
+
+ /** SPI bus
+ Specifications:
+ https://www.microsoft.com/download/details.aspx?id=103325 */
+ SDL_HID_API_BUS_SPI = 0x04
+
+} SDL_hid_bus_type;
+
+/** hidapi info structure */
+
+/**
+ * Information about a connected HID device
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_hid_device_info
+{
+ /** Platform-specific device path */
+ char *path;
+ /** Device Vendor ID */
+ unsigned short vendor_id;
+ /** Device Product ID */
+ unsigned short product_id;
+ /** Serial Number */
+ wchar_t *serial_number;
+ /** Device Release Number in binary-coded decimal,
+ also known as Device Version Number */
+ unsigned short release_number;
+ /** Manufacturer String */
+ wchar_t *manufacturer_string;
+ /** Product string */
+ wchar_t *product_string;
+ /** Usage Page for this Device/Interface
+ (Windows/Mac/hidraw only) */
+ unsigned short usage_page;
+ /** Usage for this Device/Interface
+ (Windows/Mac/hidraw only) */
+ unsigned short usage;
+ /** The USB interface which this logical device
+ represents.
+
+ Valid only if the device is a USB HID device.
+ Set to -1 in all other cases.
+ */
+ int interface_number;
+
+ /** Additional information about the USB interface.
+ Valid on libusb and Android implementations. */
+ int interface_class;
+ int interface_subclass;
+ int interface_protocol;
+
+ /** Underlying bus type */
+ SDL_hid_bus_type bus_type;
+
+ /** Pointer to the next device */
+ struct SDL_hid_device_info *next;
+
+} SDL_hid_device_info;
+
+
+/**
+ * Initialize the HIDAPI library.
+ *
+ * This function initializes the HIDAPI library. Calling it is not strictly
+ * necessary, as it will be called automatically by SDL_hid_enumerate() and
+ * any of the SDL_hid_open_*() functions if it is needed. This function should
+ * be called at the beginning of execution however, if there is a chance of
+ * HIDAPI handles being opened by different threads simultaneously.
+ *
+ * Each call to this function should have a matching call to SDL_hid_exit()
+ *
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_hid_exit
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_init(void);
+
+/**
+ * Finalize the HIDAPI library.
+ *
+ * This function frees all of the static data associated with HIDAPI. It
+ * should be called at the end of execution to avoid memory leaks.
+ *
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_hid_init
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_exit(void);
+
+/**
+ * Check to see if devices may have been added or removed.
+ *
+ * Enumerating the HID devices is an expensive operation, so you can call this
+ * to see if there have been any system device changes since the last call to
+ * this function. A change in the counter returned doesn't necessarily mean
+ * that anything has changed, but you can call SDL_hid_enumerate() to get an
+ * updated device list.
+ *
+ * Calling this function for the first time may cause a thread or other system
+ * resource to be allocated to track device change notifications.
+ *
+ * \returns a change counter that is incremented with each potential device
+ * change, or 0 if device change detection isn't available.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_hid_enumerate
+ */
+extern SDL_DECLSPEC Uint32 SDLCALL SDL_hid_device_change_count(void);
+
+/**
+ * Enumerate the HID Devices.
+ *
+ * This function returns a linked list of all the HID devices attached to the
+ * system which match vendor_id and product_id. If `vendor_id` is set to 0
+ * then any vendor matches. If `product_id` is set to 0 then any product
+ * matches. If `vendor_id` and `product_id` are both set to 0, then all HID
+ * devices will be returned.
+ *
+ * By default SDL will only enumerate controllers, to reduce risk of hanging
+ * or crashing on bad drivers, but SDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS
+ * can be set to "0" to enumerate all HID devices.
+ *
+ * \param vendor_id the Vendor ID (VID) of the types of device to open, or 0
+ * to match any vendor.
+ * \param product_id the Product ID (PID) of the types of device to open, or 0
+ * to match any product.
+ * \returns a pointer to a linked list of type SDL_hid_device_info, containing
+ * information about the HID devices attached to the system, or NULL
+ * in the case of failure. Free this linked list by calling
+ * SDL_hid_free_enumeration().
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_hid_device_change_count
+ */
+extern SDL_DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_enumerate(unsigned short vendor_id, unsigned short product_id);
+
+/**
+ * Free an enumeration linked list.
+ *
+ * This function frees a linked list created by SDL_hid_enumerate().
+ *
+ * \param devs pointer to a list of struct_device returned from
+ * SDL_hid_enumerate().
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_hid_free_enumeration(SDL_hid_device_info *devs);
+
+/**
+ * Open a HID device using a Vendor ID (VID), Product ID (PID) and optionally
+ * a serial number.
+ *
+ * If `serial_number` is NULL, the first device with the specified VID and PID
+ * is opened.
+ *
+ * \param vendor_id the Vendor ID (VID) of the device to open.
+ * \param product_id the Product ID (PID) of the device to open.
+ * \param serial_number the Serial Number of the device to open (Optionally
+ * NULL).
+ * \returns a pointer to a SDL_hid_device object on success or NULL on
+ * failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number);
+
+/**
+ * Open a HID device by its path name.
+ *
+ * The path name be determined by calling SDL_hid_enumerate(), or a
+ * platform-specific path name can be used (eg: /dev/hidraw0 on Linux).
+ *
+ * \param path the path name of the device to open.
+ * \returns a pointer to a SDL_hid_device object on success or NULL on
+ * failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open_path(const char *path);
+
+/**
+ * Write an Output report to a HID device.
+ *
+ * The first byte of `data` must contain the Report ID. For devices which only
+ * support a single report, this must be set to 0x0. The remaining bytes
+ * contain the report data. Since the Report ID is mandatory, calls to
+ * SDL_hid_write() will always contain one more byte than the report contains.
+ * For example, if a hid report is 16 bytes long, 17 bytes must be passed to
+ * SDL_hid_write(), the Report ID (or 0x0, for devices with a single report),
+ * followed by the report data (16 bytes). In this example, the length passed
+ * in would be 17.
+ *
+ * SDL_hid_write() will send the data on the first OUT endpoint, if one
+ * exists. If it does not, it will send the data through the Control Endpoint
+ * (Endpoint 0).
+ *
+ * \param dev a device handle returned from SDL_hid_open().
+ * \param data the data to send, including the report number as the first
+ * byte.
+ * \param length the length in bytes of the data to send.
+ * \returns the actual number of bytes written and -1 on on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_write(SDL_hid_device *dev, const unsigned char *data, size_t length);
+
+/**
+ * Read an Input report from a HID device with timeout.
+ *
+ * Input reports are returned to the host through the INTERRUPT IN endpoint.
+ * The first byte will contain the Report number if the device uses numbered
+ * reports.
+ *
+ * \param dev a device handle returned from SDL_hid_open().
+ * \param data a buffer to put the read data into.
+ * \param length the number of bytes to read. For devices with multiple
+ * reports, make sure to read an extra byte for the report
+ * number.
+ * \param milliseconds timeout in milliseconds or -1 for blocking wait.
+ * \returns the actual number of bytes read and -1 on on failure; call
+ * SDL_GetError() for more information. If no packet was available to
+ * be read within the timeout period, this function returns 0.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_read_timeout(SDL_hid_device *dev, unsigned char *data, size_t length, int milliseconds);
+
+/**
+ * Read an Input report from a HID device.
+ *
+ * Input reports are returned to the host through the INTERRUPT IN endpoint.
+ * The first byte will contain the Report number if the device uses numbered
+ * reports.
+ *
+ * \param dev a device handle returned from SDL_hid_open().
+ * \param data a buffer to put the read data into.
+ * \param length the number of bytes to read. For devices with multiple
+ * reports, make sure to read an extra byte for the report
+ * number.
+ * \returns the actual number of bytes read and -1 on failure; call
+ * SDL_GetError() for more information. If no packet was available to
+ * be read and the handle is in non-blocking mode, this function
+ * returns 0.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_read(SDL_hid_device *dev, unsigned char *data, size_t length);
+
+/**
+ * Set the device handle to be non-blocking.
+ *
+ * In non-blocking mode calls to SDL_hid_read() will return immediately with a
+ * value of 0 if there is no data to be read. In blocking mode, SDL_hid_read()
+ * will wait (block) until there is data to read before returning.
+ *
+ * Nonblocking can be turned on and off at any time.
+ *
+ * \param dev a device handle returned from SDL_hid_open().
+ * \param nonblock enable or not the nonblocking reads - 1 to enable
+ * nonblocking - 0 to disable nonblocking.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_set_nonblocking(SDL_hid_device *dev, int nonblock);
+
+/**
+ * Send a Feature report to the device.
+ *
+ * Feature reports are sent over the Control endpoint as a Set_Report
+ * transfer. The first byte of `data` must contain the Report ID. For devices
+ * which only support a single report, this must be set to 0x0. The remaining
+ * bytes contain the report data. Since the Report ID is mandatory, calls to
+ * SDL_hid_send_feature_report() will always contain one more byte than the
+ * report contains. For example, if a hid report is 16 bytes long, 17 bytes
+ * must be passed to SDL_hid_send_feature_report(): the Report ID (or 0x0, for
+ * devices which do not use numbered reports), followed by the report data (16
+ * bytes). In this example, the length passed in would be 17.
+ *
+ * \param dev a device handle returned from SDL_hid_open().
+ * \param data the data to send, including the report number as the first
+ * byte.
+ * \param length the length in bytes of the data to send, including the report
+ * number.
+ * \returns the actual number of bytes written and -1 on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_send_feature_report(SDL_hid_device *dev, const unsigned char *data, size_t length);
+
+/**
+ * Get a feature report from a HID device.
+ *
+ * Set the first byte of `data` to the Report ID of the report to be read.
+ * Make sure to allow space for this extra byte in `data`. Upon return, the
+ * first byte will still contain the Report ID, and the report data will start
+ * in data[1].
+ *
+ * \param dev a device handle returned from SDL_hid_open().
+ * \param data a buffer to put the read data into, including the Report ID.
+ * Set the first byte of `data` to the Report ID of the report to
+ * be read, or set it to zero if your device does not use numbered
+ * reports.
+ * \param length the number of bytes to read, including an extra byte for the
+ * report ID. The buffer can be longer than the actual report.
+ * \returns the number of bytes read plus one for the report ID (which is
+ * still in the first byte), or -1 on on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_get_feature_report(SDL_hid_device *dev, unsigned char *data, size_t length);
+
+/**
+ * Get an input report from a HID device.
+ *
+ * Set the first byte of `data` to the Report ID of the report to be read.
+ * Make sure to allow space for this extra byte in `data`. Upon return, the
+ * first byte will still contain the Report ID, and the report data will start
+ * in data[1].
+ *
+ * \param dev a device handle returned from SDL_hid_open().
+ * \param data a buffer to put the read data into, including the Report ID.
+ * Set the first byte of `data` to the Report ID of the report to
+ * be read, or set it to zero if your device does not use numbered
+ * reports.
+ * \param length the number of bytes to read, including an extra byte for the
+ * report ID. The buffer can be longer than the actual report.
+ * \returns the number of bytes read plus one for the report ID (which is
+ * still in the first byte), or -1 on on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_get_input_report(SDL_hid_device *dev, unsigned char *data, size_t length);
+
+/**
+ * Close a HID device.
+ *
+ * \param dev a device handle returned from SDL_hid_open().
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_close(SDL_hid_device *dev);
+
+/**
+ * Get The Manufacturer String from a HID device.
+ *
+ * \param dev a device handle returned from SDL_hid_open().
+ * \param string a wide string buffer to put the data into.
+ * \param maxlen the length of the buffer in multiples of wchar_t.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_get_manufacturer_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen);
+
+/**
+ * Get The Product String from a HID device.
+ *
+ * \param dev a device handle returned from SDL_hid_open().
+ * \param string a wide string buffer to put the data into.
+ * \param maxlen the length of the buffer in multiples of wchar_t.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_get_product_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen);
+
+/**
+ * Get The Serial Number String from a HID device.
+ *
+ * \param dev a device handle returned from SDL_hid_open().
+ * \param string a wide string buffer to put the data into.
+ * \param maxlen the length of the buffer in multiples of wchar_t.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_get_serial_number_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen);
+
+/**
+ * Get a string from a HID device, based on its string index.
+ *
+ * \param dev a device handle returned from SDL_hid_open().
+ * \param string_index the index of the string to get.
+ * \param string a wide string buffer to put the data into.
+ * \param maxlen the length of the buffer in multiples of wchar_t.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_get_indexed_string(SDL_hid_device *dev, int string_index, wchar_t *string, size_t maxlen);
+
+/**
+ * Get the device info from a HID device.
+ *
+ * \param dev a device handle returned from SDL_hid_open().
+ * \returns a pointer to the SDL_hid_device_info for this hid_device or NULL
+ * on failure; call SDL_GetError() for more information. This struct
+ * is valid until the device is closed with SDL_hid_close().
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_get_device_info(SDL_hid_device *dev);
+
+/**
+ * Get a report descriptor from a HID device.
+ *
+ * User has to provide a preallocated buffer where descriptor will be copied
+ * to. The recommended size for a preallocated buffer is 4096 bytes.
+ *
+ * \param dev a device handle returned from SDL_hid_open().
+ * \param buf the buffer to copy descriptor into.
+ * \param buf_size the size of the buffer in bytes.
+ * \returns the number of bytes actually copied or -1 on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_hid_get_report_descriptor(SDL_hid_device *dev, unsigned char *buf, size_t buf_size);
+
+/**
+ * Start or stop a BLE scan on iOS and tvOS to pair Steam Controllers.
+ *
+ * \param active SDL_TRUE to start the scan, SDL_FALSE to stop the scan.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_hid_ble_scan(SDL_bool active);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_hidapi_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_hints.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_hints.h
new file mode 100644
index 0000000..79aa008
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_hints.h
@@ -0,0 +1,3895 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryHints
+ *
+ * Official documentation for SDL configuration variables
+ *
+ * This file contains functions to set and get configuration hints, as well as
+ * listing each of them alphabetically.
+ *
+ * The convention for naming hints is SDL_HINT_X, where "SDL_X" is the
+ * environment variable that can be used to override the default.
+ *
+ * In general these hints are just that - they may or may not be supported or
+ * applicable on any given platform, but they provide a way for an application
+ * or user to give the library a hint as to how they would like the library to
+ * work.
+ */
+
+#ifndef SDL_hints_h_
+#define SDL_hints_h_
+
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Specify the behavior of Alt+Tab while the keyboard is grabbed.
+ *
+ * By default, SDL emulates Alt+Tab functionality while the keyboard is
+ * grabbed and your window is full-screen. This prevents the user from getting
+ * stuck in your application if you've enabled keyboard grab.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": SDL will not handle Alt+Tab. Your application is responsible for
+ * handling Alt+Tab while the keyboard is grabbed.
+ * - "1": SDL will minimize your window when Alt+Tab is pressed (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED "SDL_ALLOW_ALT_TAB_WHILE_GRABBED"
+
+/**
+ * A variable to control whether the SDL activity is allowed to be re-created.
+ *
+ * If this hint is true, the activity can be recreated on demand by the OS,
+ * and Java static data and C++ static data remain with their current values.
+ * If this hint is false, then SDL will call exit() when you return from your
+ * main function and the application will be terminated and then started fresh
+ * each time.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": The application starts fresh at each launch. (default)
+ * - "1": The application activity can be recreated by the OS.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY "SDL_ANDROID_ALLOW_RECREATE_ACTIVITY"
+
+/**
+ * A variable to control whether the event loop will block itself when the app
+ * is paused.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Non blocking.
+ * - "1": Blocking. (default)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_ANDROID_BLOCK_ON_PAUSE "SDL_ANDROID_BLOCK_ON_PAUSE"
+
+/**
+ * A variable to control whether we trap the Android back button to handle it
+ * manually.
+ *
+ * This is necessary for the right mouse button to work on some Android
+ * devices, or to be able to trap the back button for use in your code
+ * reliably. If this hint is true, the back button will show up as an
+ * SDL_EVENT_KEY_DOWN / SDL_EVENT_KEY_UP pair with a keycode of
+ * SDL_SCANCODE_AC_BACK.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Back button will be handled as usual for system. (default)
+ * - "1": Back button will be trapped, allowing you to handle the key press
+ * manually. (This will also let right mouse click work on systems where the
+ * right mouse button functions as back.)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_ANDROID_TRAP_BACK_BUTTON "SDL_ANDROID_TRAP_BACK_BUTTON"
+
+/**
+ * A variable setting the app ID string.
+ *
+ * This string is used by desktop compositors to identify and group windows
+ * together, as well as match applications with associated desktop settings
+ * and icons.
+ *
+ * This will override SDL_PROP_APP_METADATA_IDENTIFIER_STRING, if set by the
+ * application.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_APP_ID "SDL_APP_ID"
+
+/**
+ * A variable setting the application name.
+ *
+ * This hint lets you specify the application name sent to the OS when
+ * required. For example, this will often appear in volume control applets for
+ * audio streams, and in lists of applications which are inhibiting the
+ * screensaver. You should use a string that describes your program ("My Game
+ * 2: The Revenge")
+ *
+ * This will override SDL_PROP_APP_METADATA_NAME_STRING, if set by the
+ * application.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_APP_NAME "SDL_APP_NAME"
+
+/**
+ * A variable controlling whether controllers used with the Apple TV generate
+ * UI events.
+ *
+ * When UI events are generated by controller input, the app will be
+ * backgrounded when the Apple TV remote's menu button is pressed, and when
+ * the pause or B buttons on gamepads are pressed.
+ *
+ * More information about properly making use of controllers for the Apple TV
+ * can be found here:
+ * https://developer.apple.com/tvos/human-interface-guidelines/remote-and-controllers/
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Controller input does not generate UI events. (default)
+ * - "1": Controller input generates UI events.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS "SDL_APPLE_TV_CONTROLLER_UI_EVENTS"
+
+/**
+ * A variable controlling whether the Apple TV remote's joystick axes will
+ * automatically match the rotation of the remote.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Remote orientation does not affect joystick axes. (default)
+ * - "1": Joystick axes are based on the orientation of the remote.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION "SDL_APPLE_TV_REMOTE_ALLOW_ROTATION"
+
+/**
+ * A variable controlling the audio category on iOS and macOS.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "ambient": Use the AVAudioSessionCategoryAmbient audio category, will be
+ * muted by the phone mute switch (default)
+ * - "playback": Use the AVAudioSessionCategoryPlayback category.
+ *
+ * For more information, see Apple's documentation:
+ * https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategoriesandModes/AudioSessionCategoriesandModes.html
+ *
+ * This hint should be set before an audio device is opened.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_AUDIO_CATEGORY "SDL_AUDIO_CATEGORY"
+
+/**
+ * Specify an application icon name for an audio device.
+ *
+ * Some audio backends (such as Pulseaudio and Pipewire) allow you to set an
+ * XDG icon name for your application. Among other things, this icon might
+ * show up in a system control panel that lets the user adjust the volume on
+ * specific audio streams instead of using one giant master volume slider.
+ * Note that this is unrelated to the icon used by the windowing system, which
+ * may be set with SDL_SetWindowIcon (or via desktop file on Wayland).
+ *
+ * Setting this to "" or leaving it unset will have SDL use a reasonable
+ * default, "applications-games", which is likely to be installed. See
+ * https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
+ * and
+ * https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
+ * for the relevant XDG icon specs.
+ *
+ * This hint should be set before an audio device is opened.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_AUDIO_DEVICE_APP_ICON_NAME "SDL_AUDIO_DEVICE_APP_ICON_NAME"
+
+/**
+ * A variable controlling device buffer size.
+ *
+ * This hint is an integer > 0, that represents the size of the device's
+ * buffer in sample frames (stereo audio data in 16-bit format is 4 bytes per
+ * sample frame, for example).
+ *
+ * SDL3 generally decides this value on behalf of the app, but if for some
+ * reason the app needs to dictate this (because they want either lower
+ * latency or higher throughput AND ARE WILLING TO DEAL WITH what that might
+ * require of the app), they can specify it.
+ *
+ * SDL will try to accommodate this value, but there is no promise you'll get
+ * the buffer size requested. Many platforms won't honor this request at all,
+ * or might adjust it.
+ *
+ * This hint should be set before an audio device is opened.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_AUDIO_DEVICE_SAMPLE_FRAMES "SDL_AUDIO_DEVICE_SAMPLE_FRAMES"
+
+/**
+ * Specify an audio stream name for an audio device.
+ *
+ * Some audio backends (such as PulseAudio) allow you to describe your audio
+ * stream. Among other things, this description might show up in a system
+ * control panel that lets the user adjust the volume on specific audio
+ * streams instead of using one giant master volume slider.
+ *
+ * This hints lets you transmit that information to the OS. The contents of
+ * this hint are used while opening an audio device. You should use a string
+ * that describes your what your program is playing ("audio stream" is
+ * probably sufficient in many cases, but this could be useful for something
+ * like "team chat" if you have a headset playing VoIP audio separately).
+ *
+ * Setting this to "" or leaving it unset will have SDL use a reasonable
+ * default: "audio stream" or something similar.
+ *
+ * Note that while this talks about audio streams, this is an OS-level
+ * concept, so it applies to a physical audio device in this case, and not an
+ * SDL_AudioStream, nor an SDL logical audio device.
+ *
+ * This hint should be set before an audio device is opened.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_AUDIO_DEVICE_STREAM_NAME "SDL_AUDIO_DEVICE_STREAM_NAME"
+
+/**
+ * Specify an application role for an audio device.
+ *
+ * Some audio backends (such as Pipewire) allow you to describe the role of
+ * your audio stream. Among other things, this description might show up in a
+ * system control panel or software for displaying and manipulating media
+ * playback/recording graphs.
+ *
+ * This hints lets you transmit that information to the OS. The contents of
+ * this hint are used while opening an audio device. You should use a string
+ * that describes your what your program is playing (Game, Music, Movie,
+ * etc...).
+ *
+ * Setting this to "" or leaving it unset will have SDL use a reasonable
+ * default: "Game" or something similar.
+ *
+ * Note that while this talks about audio streams, this is an OS-level
+ * concept, so it applies to a physical audio device in this case, and not an
+ * SDL_AudioStream, nor an SDL logical audio device.
+ *
+ * This hint should be set before an audio device is opened.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_AUDIO_DEVICE_STREAM_ROLE "SDL_AUDIO_DEVICE_STREAM_ROLE"
+
+/**
+ * A variable that specifies an audio backend to use.
+ *
+ * By default, SDL will try all available audio backends in a reasonable order
+ * until it finds one that can work, but this hint allows the app or user to
+ * force a specific driver, such as "pipewire" if, say, you are on PulseAudio
+ * but want to try talking to the lower level instead.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_AUDIO_DRIVER "SDL_AUDIO_DRIVER"
+
+/**
+ * A variable that causes SDL to not ignore audio "monitors".
+ *
+ * This is currently only used by the PulseAudio driver.
+ *
+ * By default, SDL ignores audio devices that aren't associated with physical
+ * hardware. Changing this hint to "1" will expose anything SDL sees that
+ * appears to be an audio source or sink. This will add "devices" to the list
+ * that the user probably doesn't want or need, but it can be useful in
+ * scenarios where you want to hook up SDL to some sort of virtual device,
+ * etc.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Audio monitor devices will be ignored. (default)
+ * - "1": Audio monitor devices will show up in the device list.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_AUDIO_INCLUDE_MONITORS "SDL_AUDIO_INCLUDE_MONITORS"
+
+/**
+ * A variable controlling whether SDL updates joystick state when getting
+ * input events.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": You'll call SDL_UpdateJoysticks() manually.
+ * - "1": SDL will automatically call SDL_UpdateJoysticks(). (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_AUTO_UPDATE_JOYSTICKS "SDL_AUTO_UPDATE_JOYSTICKS"
+
+/**
+ * A variable controlling whether SDL updates sensor state when getting input
+ * events.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": You'll call SDL_UpdateSensors() manually.
+ * - "1": SDL will automatically call SDL_UpdateSensors(). (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_AUTO_UPDATE_SENSORS "SDL_AUTO_UPDATE_SENSORS"
+
+/**
+ * Prevent SDL from using version 4 of the bitmap header when saving BMPs.
+ *
+ * The bitmap header version 4 is required for proper alpha channel support
+ * and SDL will use it when required. Should this not be desired, this hint
+ * can force the use of the 40 byte header version which is supported
+ * everywhere.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Surfaces with a colorkey or an alpha channel are saved to a 32-bit
+ * BMP file with an alpha mask. SDL will use the bitmap header version 4 and
+ * set the alpha mask accordingly. (default)
+ * - "1": Surfaces with a colorkey or an alpha channel are saved to a 32-bit
+ * BMP file without an alpha mask. The alpha channel data will be in the
+ * file, but applications are going to ignore it.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_BMP_SAVE_LEGACY_FORMAT "SDL_BMP_SAVE_LEGACY_FORMAT"
+
+/**
+ * A variable that decides what camera backend to use.
+ *
+ * By default, SDL will try all available camera backends in a reasonable
+ * order until it finds one that can work, but this hint allows the app or
+ * user to force a specific target, such as "directshow" if, say, you are on
+ * Windows Media Foundations but want to try DirectShow instead.
+ *
+ * The default value is unset, in which case SDL will try to figure out the
+ * best camera backend on your behalf. This hint needs to be set before
+ * SDL_Init() is called to be useful.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_CAMERA_DRIVER "SDL_CAMERA_DRIVER"
+
+/**
+ * A variable that limits what CPU features are available.
+ *
+ * By default, SDL marks all features the current CPU supports as available.
+ * This hint allows to limit these to a subset.
+ *
+ * When the hint is unset, or empty, SDL will enable all detected CPU
+ * features.
+ *
+ * The variable can be set to a comma separated list containing the following
+ * items:
+ *
+ * - "all"
+ * - "altivec"
+ * - "sse"
+ * - "sse2"
+ * - "sse3"
+ * - "sse41"
+ * - "sse42"
+ * - "avx"
+ * - "avx2"
+ * - "avx512f"
+ * - "arm-simd"
+ * - "neon"
+ * - "lsx"
+ * - "lasx"
+ *
+ * The items can be prefixed by '+'/'-' to add/remove features.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_CPU_FEATURE_MASK "SDL_CPU_FEATURE_MASK"
+
+/**
+ * A variable controlling whether DirectInput should be used for controllers.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Disable DirectInput detection.
+ * - "1": Enable DirectInput detection. (default)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_DIRECTINPUT "SDL_JOYSTICK_DIRECTINPUT"
+
+/**
+ * A variable that specifies a dialog backend to use.
+ *
+ * By default, SDL will try all available dialog backends in a reasonable
+ * order until it finds one that can work, but this hint allows the app or
+ * user to force a specific target.
+ *
+ * If the specified target does not exist or is not available, the
+ * dialog-related function calls will fail.
+ *
+ * This hint currently only applies to platforms using the generic "Unix"
+ * dialog implementation, but may be extended to more platforms in the future.
+ * Note that some Unix and Unix-like platforms have their own implementation,
+ * such as macOS and Haiku.
+ *
+ * The variable can be set to the following values:
+ *
+ * - NULL: Select automatically (default, all platforms)
+ * - "portal": Use XDG Portals through DBus (Unix only)
+ * - "zenity": Use the Zenity program (Unix only)
+ *
+ * More options may be added in the future.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_FILE_DIALOG_DRIVER "SDL_FILE_DIALOG_DRIVER"
+
+/**
+ * Override for SDL_GetDisplayUsableBounds().
+ *
+ * If set, this hint will override the expected results for
+ * SDL_GetDisplayUsableBounds() for display index 0. Generally you don't want
+ * to do this, but this allows an embedded system to request that some of the
+ * screen be reserved for other uses when paired with a well-behaved
+ * application.
+ *
+ * The contents of this hint must be 4 comma-separated integers, the first is
+ * the bounds x, then y, width and height, in that order.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_DISPLAY_USABLE_BOUNDS "SDL_DISPLAY_USABLE_BOUNDS"
+
+/**
+ * Disable giving back control to the browser automatically when running with
+ * asyncify.
+ *
+ * With -s ASYNCIFY, SDL calls emscripten_sleep during operations such as
+ * refreshing the screen or polling events.
+ *
+ * This hint only applies to the emscripten platform.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Disable emscripten_sleep calls (if you give back browser control
+ * manually or use asyncify for other purposes).
+ * - "1": Enable emscripten_sleep calls. (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_EMSCRIPTEN_ASYNCIFY "SDL_EMSCRIPTEN_ASYNCIFY"
+
+/**
+ * Specify the CSS selector used for the "default" window/canvas.
+ *
+ * This hint only applies to the emscripten platform.
+ *
+ * The default value is "#canvas"
+ *
+ * This hint should be set before creating a window.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_EMSCRIPTEN_CANVAS_SELECTOR "SDL_EMSCRIPTEN_CANVAS_SELECTOR"
+
+/**
+ * Override the binding element for keyboard inputs for Emscripten builds.
+ *
+ * This hint only applies to the emscripten platform.
+ *
+ * The variable can be one of:
+ *
+ * - "#window": the javascript window object (default)
+ * - "#document": the javascript document object
+ * - "#screen": the javascript window.screen object
+ * - "#canvas": the WebGL canvas element
+ * - any other string without a leading # sign applies to the element on the
+ * page with that ID.
+ *
+ * This hint should be set before creating a window.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT "SDL_EMSCRIPTEN_KEYBOARD_ELEMENT"
+
+/**
+ * A variable that controls whether the on-screen keyboard should be shown
+ * when text input is active.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "auto": The on-screen keyboard will be shown if there is no physical
+ * keyboard attached. (default)
+ * - "0": Do not show the on-screen keyboard.
+ * - "1": Show the on-screen keyboard, if available.
+ *
+ * This hint must be set before SDL_StartTextInput() is called
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_ENABLE_SCREEN_KEYBOARD "SDL_ENABLE_SCREEN_KEYBOARD"
+
+/**
+ * A variable controlling verbosity of the logging of SDL events pushed onto
+ * the internal queue.
+ *
+ * The variable can be set to the following values, from least to most
+ * verbose:
+ *
+ * - "0": Don't log any events. (default)
+ * - "1": Log most events (other than the really spammy ones).
+ * - "2": Include mouse and finger motion events.
+ *
+ * This is generally meant to be used to debug SDL itself, but can be useful
+ * for application developers that need better visibility into what is going
+ * on in the event queue. Logged events are sent through SDL_Log(), which
+ * means by default they appear on stdout on most platforms or maybe
+ * OutputDebugString() on Windows, and can be funneled by the app with
+ * SDL_SetLogOutputFunction(), etc.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_EVENT_LOGGING "SDL_EVENT_LOGGING"
+
+/**
+ * A variable controlling whether raising the window should be done more
+ * forcefully.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Honor the OS policy for raising windows. (default)
+ * - "1": Force the window to be raised, overriding any OS policy.
+ *
+ * At present, this is only an issue under MS Windows, which makes it nearly
+ * impossible to programmatically move a window to the foreground, for
+ * "security" reasons. See http://stackoverflow.com/a/34414846 for a
+ * discussion.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_FORCE_RAISEWINDOW "SDL_FORCE_RAISEWINDOW"
+
+/**
+ * A variable controlling how 3D acceleration is used to accelerate the SDL
+ * screen surface.
+ *
+ * SDL can try to accelerate the SDL screen surface by using streaming
+ * textures with a 3D rendering engine. This variable controls whether and how
+ * this is done.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Disable 3D acceleration
+ * - "1": Enable 3D acceleration, using the default renderer. (default)
+ * - "X": Enable 3D acceleration, using X where X is one of the valid
+ * rendering drivers. (e.g. "direct3d", "opengl", etc.)
+ *
+ * This hint should be set before calling SDL_GetWindowSurface()
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_FRAMEBUFFER_ACCELERATION "SDL_FRAMEBUFFER_ACCELERATION"
+
+/**
+ * A variable that lets you manually hint extra gamecontroller db entries.
+ *
+ * The variable should be newline delimited rows of gamecontroller config
+ * data, see SDL_gamepad.h
+ *
+ * You can update mappings after SDL is initialized with
+ * SDL_GetGamepadMappingForGUID() and SDL_AddGamepadMapping()
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_GAMECONTROLLERCONFIG "SDL_GAMECONTROLLERCONFIG"
+
+/**
+ * A variable that lets you provide a file with extra gamecontroller db
+ * entries.
+ *
+ * The file should contain lines of gamecontroller config data, see
+ * SDL_gamepad.h
+ *
+ * You can update mappings after SDL is initialized with
+ * SDL_GetGamepadMappingForGUID() and SDL_AddGamepadMapping()
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_GAMECONTROLLERCONFIG_FILE "SDL_GAMECONTROLLERCONFIG_FILE"
+
+/**
+ * A variable that overrides the automatic controller type detection.
+ *
+ * The variable should be comma separated entries, in the form: VID/PID=type
+ *
+ * The VID and PID should be hexadecimal with exactly 4 digits, e.g. 0x00fd
+ *
+ * This hint affects what low level protocol is used with the HIDAPI driver.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "Xbox360"
+ * - "XboxOne"
+ * - "PS3"
+ * - "PS4"
+ * - "PS5"
+ * - "SwitchPro"
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_GAMECONTROLLERTYPE "SDL_GAMECONTROLLERTYPE"
+
+/**
+ * A variable containing a list of devices to skip when scanning for game
+ * controllers.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * 0xAAAA/0xBBBB,0xCCCC/0xDDDD
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES "SDL_GAMECONTROLLER_IGNORE_DEVICES"
+
+/**
+ * If set, all devices will be skipped when scanning for game controllers
+ * except for the ones listed in this variable.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * 0xAAAA/0xBBBB,0xCCCC/0xDDDD
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT "SDL_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT"
+
+/**
+ * A variable that controls whether the device's built-in accelerometer and
+ * gyro should be used as sensors for gamepads.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Sensor fusion is disabled
+ * - "1": Sensor fusion is enabled for all controllers that lack sensors
+ *
+ * Or the variable can be a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * 0xAAAA/0xBBBB,0xCCCC/0xDDDD
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint should be set before a gamepad is opened.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_GAMECONTROLLER_SENSOR_FUSION "SDL_GAMECONTROLLER_SENSOR_FUSION"
+
+/**
+ * This variable sets the default text of the TextInput window on GDK
+ * platforms.
+ *
+ * This hint is available only if SDL_GDK_TEXTINPUT defined.
+ *
+ * This hint should be set before calling SDL_StartTextInput()
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT "SDL_GDK_TEXTINPUT_DEFAULT_TEXT"
+
+/**
+ * This variable sets the description of the TextInput window on GDK
+ * platforms.
+ *
+ * This hint is available only if SDL_GDK_TEXTINPUT defined.
+ *
+ * This hint should be set before calling SDL_StartTextInput()
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_GDK_TEXTINPUT_DESCRIPTION "SDL_GDK_TEXTINPUT_DESCRIPTION"
+
+/**
+ * This variable sets the maximum input length of the TextInput window on GDK
+ * platforms.
+ *
+ * The value must be a stringified integer, for example "10" to allow for up
+ * to 10 characters of text input.
+ *
+ * This hint is available only if SDL_GDK_TEXTINPUT defined.
+ *
+ * This hint should be set before calling SDL_StartTextInput()
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_GDK_TEXTINPUT_MAX_LENGTH "SDL_GDK_TEXTINPUT_MAX_LENGTH"
+
+/**
+ * This variable sets the input scope of the TextInput window on GDK
+ * platforms.
+ *
+ * Set this hint to change the XGameUiTextEntryInputScope value that will be
+ * passed to the window creation function. The value must be a stringified
+ * integer, for example "0" for XGameUiTextEntryInputScope::Default.
+ *
+ * This hint is available only if SDL_GDK_TEXTINPUT defined.
+ *
+ * This hint should be set before calling SDL_StartTextInput()
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_GDK_TEXTINPUT_SCOPE "SDL_GDK_TEXTINPUT_SCOPE"
+
+/**
+ * This variable sets the title of the TextInput window on GDK platforms.
+ *
+ * This hint is available only if SDL_GDK_TEXTINPUT defined.
+ *
+ * This hint should be set before calling SDL_StartTextInput()
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_GDK_TEXTINPUT_TITLE "SDL_GDK_TEXTINPUT_TITLE"
+
+/**
+ * A variable to control whether SDL_hid_enumerate() enumerates all HID
+ * devices or only controllers.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": SDL_hid_enumerate() will enumerate all HID devices.
+ * - "1": SDL_hid_enumerate() will only enumerate controllers. (default)
+ *
+ * By default SDL will only enumerate controllers, to reduce risk of hanging
+ * or crashing on devices with bad drivers and avoiding macOS keyboard capture
+ * permission prompts.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS "SDL_HIDAPI_ENUMERATE_ONLY_CONTROLLERS"
+
+/**
+ * A variable containing a list of devices to ignore in SDL_hid_enumerate().
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * For example, to ignore the Shanwan DS3 controller and any Valve controller,
+ * you might use the string "0x2563/0x0523,0x28de/0x0000"
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_HIDAPI_IGNORE_DEVICES "SDL_HIDAPI_IGNORE_DEVICES"
+
+/**
+ * A variable describing what IME UI elements the application can display.
+ *
+ * By default IME UI is handled using native components by the OS where
+ * possible, however this can interfere with or not be visible when exclusive
+ * fullscreen mode is used.
+ *
+ * The variable can be set to a comma separated list containing the following
+ * items:
+ *
+ * - "none" or "0": The application can't render any IME elements, and native
+ * UI should be used. (default)
+ * - "composition": The application handles SDL_EVENT_TEXT_EDITING events and
+ * can render the composition text.
+ * - "candidates": The application handles SDL_EVENT_TEXT_EDITING_CANDIDATES
+ * and can render the candidate list.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_IME_IMPLEMENTED_UI "SDL_IME_IMPLEMENTED_UI"
+
+/**
+ * A variable controlling whether the home indicator bar on iPhone X should be
+ * hidden.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": The indicator bar is not hidden. (default for windowed applications)
+ * - "1": The indicator bar is hidden and is shown when the screen is touched
+ * (useful for movie playback applications).
+ * - "2": The indicator bar is dim and the first swipe makes it visible and
+ * the second swipe performs the "home" action. (default for fullscreen
+ * applications)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_IOS_HIDE_HOME_INDICATOR "SDL_IOS_HIDE_HOME_INDICATOR"
+
+/**
+ * A variable that lets you enable joystick (and gamecontroller) events even
+ * when your app is in the background.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Disable joystick & gamecontroller input events when the application
+ * is in the background. (default)
+ * - "1": Enable joystick & gamecontroller input events when the application
+ * is in the background.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS"
+
+/**
+ * A variable containing a list of arcade stick style controllers.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES "SDL_JOYSTICK_ARCADESTICK_DEVICES"
+
+/**
+ * A variable containing a list of devices that are not arcade stick style
+ * controllers.
+ *
+ * This will override SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES and the built in
+ * device list.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED "SDL_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED"
+
+/**
+ * A variable containing a list of devices that should not be considered
+ * joysticks.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_BLACKLIST_DEVICES "SDL_JOYSTICK_BLACKLIST_DEVICES"
+
+/**
+ * A variable containing a list of devices that should be considered
+ * joysticks.
+ *
+ * This will override SDL_HINT_JOYSTICK_BLACKLIST_DEVICES and the built in
+ * device list.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED "SDL_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED"
+
+/**
+ * A variable containing a comma separated list of devices to open as
+ * joysticks.
+ *
+ * This variable is currently only used by the Linux joystick driver.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_DEVICE "SDL_JOYSTICK_DEVICE"
+
+/**
+ * A variable containing a list of flightstick style controllers.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of @file, in which case the named file
+ * will be loaded and interpreted as the value of the variable.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES "SDL_JOYSTICK_FLIGHTSTICK_DEVICES"
+
+/**
+ * A variable containing a list of devices that are not flightstick style
+ * controllers.
+ *
+ * This will override SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES and the built in
+ * device list.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED "SDL_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED"
+
+/**
+ * A variable containing a list of devices known to have a GameCube form
+ * factor.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_GAMECUBE_DEVICES "SDL_JOYSTICK_GAMECUBE_DEVICES"
+
+/**
+ * A variable containing a list of devices known not to have a GameCube form
+ * factor.
+ *
+ * This will override SDL_HINT_JOYSTICK_GAMECUBE_DEVICES and the built in
+ * device list.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED "SDL_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED"
+
+/**
+ * A variable controlling whether the HIDAPI joystick drivers should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI drivers are not used.
+ * - "1": HIDAPI drivers are used. (default)
+ *
+ * This variable is the default for all drivers, but can be overridden by the
+ * hints for specific drivers below.
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI "SDL_JOYSTICK_HIDAPI"
+
+/**
+ * A variable controlling whether Nintendo Switch Joy-Con controllers will be
+ * combined into a single Pro-like controller when using the HIDAPI driver.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Left and right Joy-Con controllers will not be combined and each
+ * will be a mini-gamepad.
+ * - "1": Left and right Joy-Con controllers will be combined into a single
+ * controller. (default)
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_COMBINE_JOY_CONS "SDL_JOYSTICK_HIDAPI_COMBINE_JOY_CONS"
+
+/**
+ * A variable controlling whether the HIDAPI driver for Nintendo GameCube
+ * controllers should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE "SDL_JOYSTICK_HIDAPI_GAMECUBE"
+
+/**
+ * A variable controlling whether rumble is used to implement the GameCube
+ * controller's 3 rumble modes, Stop(0), Rumble(1), and StopHard(2).
+ *
+ * This is useful for applications that need full compatibility for things
+ * like ADSR envelopes. - Stop is implemented by setting low_frequency_rumble
+ * to 0 and high_frequency_rumble >0 - Rumble is both at any arbitrary value -
+ * StopHard is implemented by setting both low_frequency_rumble and
+ * high_frequency_rumble to 0
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Normal rumble behavior is behavior is used. (default)
+ * - "1": Proper GameCube controller rumble behavior is used.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE "SDL_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE"
+
+/**
+ * A variable controlling whether the HIDAPI driver for Nintendo Switch
+ * Joy-Cons should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS "SDL_JOYSTICK_HIDAPI_JOY_CONS"
+
+/**
+ * A variable controlling whether the Home button LED should be turned on when
+ * a Nintendo Switch Joy-Con controller is opened.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": home button LED is turned off
+ * - "1": home button LED is turned on
+ *
+ * By default the Home button LED state is not changed. This hint can also be
+ * set to a floating point value between 0.0 and 1.0 which controls the
+ * brightness of the Home button LED.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_JOYCON_HOME_LED "SDL_JOYSTICK_HIDAPI_JOYCON_HOME_LED"
+
+/**
+ * A variable controlling whether the HIDAPI driver for Amazon Luna
+ * controllers connected via Bluetooth should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_LUNA "SDL_JOYSTICK_HIDAPI_LUNA"
+
+/**
+ * A variable controlling whether the HIDAPI driver for Nintendo Online
+ * classic controllers should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_NINTENDO_CLASSIC "SDL_JOYSTICK_HIDAPI_NINTENDO_CLASSIC"
+
+/**
+ * A variable controlling whether the HIDAPI driver for PS3 controllers should
+ * be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI on macOS, and "0" on
+ * other platforms.
+ *
+ * For official Sony driver (sixaxis.sys) use
+ * SDL_HINT_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER. See
+ * https://github.com/ViGEm/DsHidMini for an alternative driver on Windows.
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_PS3 "SDL_JOYSTICK_HIDAPI_PS3"
+
+/**
+ * A variable controlling whether the Sony driver (sixaxis.sys) for PS3
+ * controllers (Sixaxis/DualShock 3) should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Sony driver (sixaxis.sys) is not used.
+ * - "1": Sony driver (sixaxis.sys) is used.
+ *
+ * The default value is 0.
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER "SDL_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER"
+
+/**
+ * A variable controlling whether the HIDAPI driver for PS4 controllers should
+ * be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_PS4 "SDL_JOYSTICK_HIDAPI_PS4"
+
+/**
+ * A variable controlling the update rate of the PS4 controller over Bluetooth
+ * when using the HIDAPI driver.
+ *
+ * This defaults to 4 ms, to match the behavior over USB, and to be more
+ * friendly to other Bluetooth devices and older Bluetooth hardware on the
+ * computer. It can be set to "1" (1000Hz), "2" (500Hz) and "4" (250Hz)
+ *
+ * This hint can be set anytime, but only takes effect when extended input
+ * reports are enabled.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL "SDL_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL"
+
+/**
+ * A variable controlling whether extended input reports should be used for
+ * PS4 controllers when using the HIDAPI driver.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": extended reports are not enabled. (default)
+ * - "1": extended reports are enabled.
+ *
+ * Extended input reports allow rumble on Bluetooth PS4 controllers, but break
+ * DirectInput handling for applications that don't use SDL.
+ *
+ * Once extended reports are enabled, they can not be disabled without power
+ * cycling the controller.
+ *
+ * For compatibility with applications written for versions of SDL prior to
+ * the introduction of PS5 controller support, this value will also control
+ * the state of extended reports on PS5 controllers when the
+ * SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE hint is not explicitly set.
+ *
+ * This hint can be enabled anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE "SDL_JOYSTICK_HIDAPI_PS4_RUMBLE"
+
+/**
+ * A variable controlling whether the HIDAPI driver for PS5 controllers should
+ * be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_PS5 "SDL_JOYSTICK_HIDAPI_PS5"
+
+/**
+ * A variable controlling whether the player LEDs should be lit to indicate
+ * which player is associated with a PS5 controller.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": player LEDs are not enabled.
+ * - "1": player LEDs are enabled. (default)
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED "SDL_JOYSTICK_HIDAPI_PS5_PLAYER_LED"
+
+/**
+ * A variable controlling whether extended input reports should be used for
+ * PS5 controllers when using the HIDAPI driver.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": extended reports are not enabled. (default)
+ * - "1": extended reports.
+ *
+ * Extended input reports allow rumble on Bluetooth PS5 controllers, but break
+ * DirectInput handling for applications that don't use SDL.
+ *
+ * Once extended reports are enabled, they can not be disabled without power
+ * cycling the controller.
+ *
+ * For compatibility with applications written for versions of SDL prior to
+ * the introduction of PS5 controller support, this value defaults to the
+ * value of SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE.
+ *
+ * This hint can be enabled anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE "SDL_JOYSTICK_HIDAPI_PS5_RUMBLE"
+
+/**
+ * A variable controlling whether the HIDAPI driver for NVIDIA SHIELD
+ * controllers should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_SHIELD "SDL_JOYSTICK_HIDAPI_SHIELD"
+
+/**
+ * A variable controlling whether the HIDAPI driver for Google Stadia
+ * controllers should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_STADIA "SDL_JOYSTICK_HIDAPI_STADIA"
+
+/**
+ * A variable controlling whether the HIDAPI driver for Bluetooth Steam
+ * Controllers should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used. (default)
+ * - "1": HIDAPI driver is used for Steam Controllers, which requires
+ * Bluetooth access and may prompt the user for permission on iOS and
+ * Android.
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_STEAM "SDL_JOYSTICK_HIDAPI_STEAM"
+
+/**
+ * A variable controlling whether the HIDAPI driver for the Steam Deck builtin
+ * controller should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_STEAMDECK "SDL_JOYSTICK_HIDAPI_STEAMDECK"
+
+/**
+ * A variable controlling whether the HIDAPI driver for Nintendo Switch
+ * controllers should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_SWITCH "SDL_JOYSTICK_HIDAPI_SWITCH"
+
+/**
+ * A variable controlling whether the Home button LED should be turned on when
+ * a Nintendo Switch Pro controller is opened.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Home button LED is turned off.
+ * - "1": Home button LED is turned on.
+ *
+ * By default the Home button LED state is not changed. This hint can also be
+ * set to a floating point value between 0.0 and 1.0 which controls the
+ * brightness of the Home button LED.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED "SDL_JOYSTICK_HIDAPI_SWITCH_HOME_LED"
+
+/**
+ * A variable controlling whether the player LEDs should be lit to indicate
+ * which player is associated with a Nintendo Switch controller.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Player LEDs are not enabled.
+ * - "1": Player LEDs are enabled. (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED "SDL_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED"
+
+/**
+ * A variable controlling whether Nintendo Switch Joy-Con controllers will be
+ * in vertical mode when using the HIDAPI driver.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Left and right Joy-Con controllers will not be in vertical mode.
+ * (default)
+ * - "1": Left and right Joy-Con controllers will be in vertical mode.
+ *
+ * This hint should be set before opening a Joy-Con controller.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS "SDL_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS"
+
+/**
+ * A variable controlling whether the HIDAPI driver for Nintendo Wii and Wii U
+ * controllers should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * This driver doesn't work with the dolphinbar, so the default is SDL_FALSE
+ * for now.
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_WII "SDL_JOYSTICK_HIDAPI_WII"
+
+/**
+ * A variable controlling whether the player LEDs should be lit to indicate
+ * which player is associated with a Wii controller.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Player LEDs are not enabled.
+ * - "1": Player LEDs are enabled. (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_WII_PLAYER_LED "SDL_JOYSTICK_HIDAPI_WII_PLAYER_LED"
+
+/**
+ * A variable controlling whether the HIDAPI driver for XBox controllers
+ * should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is "0" on Windows, otherwise the value of
+ * SDL_HINT_JOYSTICK_HIDAPI
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_XBOX "SDL_JOYSTICK_HIDAPI_XBOX"
+
+/**
+ * A variable controlling whether the HIDAPI driver for XBox 360 controllers
+ * should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360 "SDL_JOYSTICK_HIDAPI_XBOX_360"
+
+/**
+ * A variable controlling whether the player LEDs should be lit to indicate
+ * which player is associated with an Xbox 360 controller.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Player LEDs are not enabled.
+ * - "1": Player LEDs are enabled. (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED "SDL_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED"
+
+/**
+ * A variable controlling whether the HIDAPI driver for XBox 360 wireless
+ * controllers should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX_360
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_WIRELESS "SDL_JOYSTICK_HIDAPI_XBOX_360_WIRELESS"
+
+/**
+ * A variable controlling whether the HIDAPI driver for XBox One controllers
+ * should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": HIDAPI driver is not used.
+ * - "1": HIDAPI driver is used.
+ *
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX.
+ *
+ * This hint should be set before enumerating controllers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE "SDL_JOYSTICK_HIDAPI_XBOX_ONE"
+
+/**
+ * A variable controlling whether the Home button LED should be turned on when
+ * an Xbox One controller is opened.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Home button LED is turned off.
+ * - "1": Home button LED is turned on.
+ *
+ * By default the Home button LED state is not changed. This hint can also be
+ * set to a floating point value between 0.0 and 1.0 which controls the
+ * brightness of the Home button LED. The default brightness is 0.4.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED "SDL_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED"
+
+/**
+ * A variable controlling whether IOKit should be used for controller
+ * handling.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": IOKit is not used.
+ * - "1": IOKit is used. (default)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_IOKIT "SDL_JOYSTICK_IOKIT"
+
+/**
+ * A variable controlling whether to use the classic /dev/input/js* joystick
+ * interface or the newer /dev/input/event* joystick interface on Linux.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Use /dev/input/event* (default)
+ * - "1": Use /dev/input/js*
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_LINUX_CLASSIC "SDL_JOYSTICK_LINUX_CLASSIC"
+
+/**
+ * A variable controlling whether joysticks on Linux adhere to their
+ * HID-defined deadzones or return unfiltered values.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Return unfiltered joystick axis values. (default)
+ * - "1": Return axis values with deadzones taken into account.
+ *
+ * This hint should be set before a controller is opened.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_LINUX_DEADZONES "SDL_JOYSTICK_LINUX_DEADZONES"
+
+/**
+ * A variable controlling whether joysticks on Linux will always treat 'hat'
+ * axis inputs (ABS_HAT0X - ABS_HAT3Y) as 8-way digital hats without checking
+ * whether they may be analog.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Only map hat axis inputs to digital hat outputs if the input axes
+ * appear to actually be digital. (default)
+ * - "1": Always handle the input axes numbered ABS_HAT0X to ABS_HAT3Y as
+ * digital hats.
+ *
+ * This hint should be set before a controller is opened.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS "SDL_JOYSTICK_LINUX_DIGITAL_HATS"
+
+/**
+ * A variable controlling whether digital hats on Linux will apply deadzones
+ * to their underlying input axes or use unfiltered values.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Return digital hat values based on unfiltered input axis values.
+ * - "1": Return digital hat values with deadzones on the input axes taken
+ * into account. (default)
+ *
+ * This hint should be set before a controller is opened.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES "SDL_JOYSTICK_LINUX_HAT_DEADZONES"
+
+/**
+ * A variable controlling whether GCController should be used for controller
+ * handling.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": GCController is not used.
+ * - "1": GCController is used. (default)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_MFI "SDL_JOYSTICK_MFI"
+
+/**
+ * A variable controlling whether the RAWINPUT joystick drivers should be used
+ * for better handling XInput-capable devices.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": RAWINPUT drivers are not used.
+ * - "1": RAWINPUT drivers are used. (default)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_RAWINPUT "SDL_JOYSTICK_RAWINPUT"
+
+/**
+ * A variable controlling whether the RAWINPUT driver should pull correlated
+ * data from XInput.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": RAWINPUT driver will only use data from raw input APIs.
+ * - "1": RAWINPUT driver will also pull data from XInput and
+ * Windows.Gaming.Input, providing better trigger axes, guide button
+ * presses, and rumble support for Xbox controllers. (default)
+ *
+ * This hint should be set before a gamepad is opened.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_RAWINPUT_CORRELATE_XINPUT "SDL_JOYSTICK_RAWINPUT_CORRELATE_XINPUT"
+
+/**
+ * A variable controlling whether the ROG Chakram mice should show up as
+ * joysticks.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": ROG Chakram mice do not show up as joysticks. (default)
+ * - "1": ROG Chakram mice show up as joysticks.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_ROG_CHAKRAM "SDL_JOYSTICK_ROG_CHAKRAM"
+
+/**
+ * A variable controlling whether a separate thread should be used for
+ * handling joystick detection and raw input messages on Windows.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": A separate thread is not used. (default)
+ * - "1": A separate thread is used for handling raw input messages.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_THREAD "SDL_JOYSTICK_THREAD"
+
+/**
+ * A variable containing a list of throttle style controllers.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_THROTTLE_DEVICES "SDL_JOYSTICK_THROTTLE_DEVICES"
+
+/**
+ * A variable containing a list of devices that are not throttle style
+ * controllers.
+ *
+ * This will override SDL_HINT_JOYSTICK_THROTTLE_DEVICES and the built in
+ * device list.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_THROTTLE_DEVICES_EXCLUDED "SDL_JOYSTICK_THROTTLE_DEVICES_EXCLUDED"
+
+/**
+ * A variable controlling whether Windows.Gaming.Input should be used for
+ * controller handling.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": WGI is not used.
+ * - "1": WGI is used. (default)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_WGI "SDL_JOYSTICK_WGI"
+
+/**
+ * A variable containing a list of wheel style controllers.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_WHEEL_DEVICES "SDL_JOYSTICK_WHEEL_DEVICES"
+
+/**
+ * A variable containing a list of devices that are not wheel style
+ * controllers.
+ *
+ * This will override SDL_HINT_JOYSTICK_WHEEL_DEVICES and the built in device
+ * list.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_WHEEL_DEVICES_EXCLUDED "SDL_JOYSTICK_WHEEL_DEVICES_EXCLUDED"
+
+/**
+ * A variable containing a list of devices known to have all axes centered at
+ * zero.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint should be set before a controller is opened.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_ZERO_CENTERED_DEVICES "SDL_JOYSTICK_ZERO_CENTERED_DEVICES"
+
+/**
+ * A variable that controls keycode representation in keyboard events.
+ *
+ * This variable is a comma separated set of options for translating keycodes
+ * in events:
+ *
+ * - "none": Keycode options are cleared, this overrides other options.
+ * - "hide_numpad": The numpad keysyms will be translated into their
+ * non-numpad versions based on the current NumLock state. For example,
+ * SDLK_KP_4 would become SDLK_4 if SDL_KMOD_NUM is set in the event
+ * modifiers, and SDLK_LEFT if it is unset.
+ * - "french_numbers": The number row on French keyboards is inverted, so
+ * pressing the 1 key would yield the keycode SDLK_1, or '1', instead of
+ * SDLK_AMPERSAND, or '&'
+ * - "latin_letters": For keyboards using non-Latin letters, such as Russian
+ * or Thai, the letter keys generate keycodes as though it had an en_US
+ * layout. e.g. pressing the key associated with SDL_SCANCODE_A on a Russian
+ * keyboard would yield 'a' instead of 'ф'.
+ *
+ * The default value for this hint is "french_numbers"
+ *
+ * Some platforms like Emscripten only provide modified keycodes and the
+ * options are not used.
+ *
+ * These options do not affect the return value of SDL_GetKeyFromScancode() or
+ * SDL_GetScancodeFromKey(), they just apply to the keycode included in key
+ * events.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_KEYCODE_OPTIONS "SDL_KEYCODE_OPTIONS"
+
+/**
+ * A variable that controls what KMSDRM device to use.
+ *
+ * SDL might open something like "/dev/dri/cardNN" to access KMSDRM
+ * functionality, where "NN" is a device index number. SDL makes a guess at
+ * the best index to use (usually zero), but the app or user can set this hint
+ * to a number between 0 and 99 to force selection.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_KMSDRM_DEVICE_INDEX "SDL_KMSDRM_DEVICE_INDEX"
+
+/**
+ * A variable that controls whether SDL requires DRM master access in order to
+ * initialize the KMSDRM video backend.
+ *
+ * The DRM subsystem has a concept of a "DRM master" which is a DRM client
+ * that has the ability to set planes, set cursor, etc. When SDL is DRM
+ * master, it can draw to the screen using the SDL rendering APIs. Without DRM
+ * master, SDL is still able to process input and query attributes of attached
+ * displays, but it cannot change display state or draw to the screen
+ * directly.
+ *
+ * In some cases, it can be useful to have the KMSDRM backend even if it
+ * cannot be used for rendering. An app may want to use SDL for input
+ * processing while using another rendering API (such as an MMAL overlay on
+ * Raspberry Pi) or using its own code to render to DRM overlays that SDL
+ * doesn't support.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": SDL will allow usage of the KMSDRM backend without DRM master.
+ * - "1": SDL Will require DRM master to use the KMSDRM backend. (default)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_KMSDRM_REQUIRE_DRM_MASTER "SDL_KMSDRM_REQUIRE_DRM_MASTER"
+
+/**
+ * A variable controlling the default SDL log levels.
+ *
+ * This variable is a comma separated set of category=level tokens that define
+ * the default logging levels for SDL applications.
+ *
+ * The category can be a numeric category, one of "app", "error", "assert",
+ * "system", "audio", "video", "render", "input", "test", or `*` for any
+ * unspecified category.
+ *
+ * The level can be a numeric level, one of "verbose", "debug", "info",
+ * "warn", "error", "critical", or "quiet" to disable that category.
+ *
+ * You can omit the category if you want to set the logging level for all
+ * categories.
+ *
+ * If this hint isn't set, the default log levels are equivalent to:
+ *
+ * `app=info,assert=warn,test=verbose,*=error`
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_LOGGING "SDL_LOGGING"
+
+/**
+ * A variable controlling whether to force the application to become the
+ * foreground process when launched on macOS.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": The application is brought to the foreground when launched.
+ * (default)
+ * - "1": The application may remain in the background when launched.
+ *
+ * This hint should be set before applicationDidFinishLaunching() is called.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MAC_BACKGROUND_APP "SDL_MAC_BACKGROUND_APP"
+
+/**
+ * A variable that determines whether Ctrl+Click should generate a right-click
+ * event on macOS.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Ctrl+Click does not generate a right mouse button click event.
+ * (default)
+ * - "1": Ctrl+Click generated a right mouse button click event.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK "SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK"
+
+/**
+ * A variable controlling whether dispatching OpenGL context updates should
+ * block the dispatching thread until the main thread finishes processing on
+ * macOS.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Dispatching OpenGL context updates will block the dispatching thread
+ * until the main thread finishes processing. (default)
+ * - "1": Dispatching OpenGL context updates will allow the dispatching thread
+ * to continue execution.
+ *
+ * Generally you want the default, but if you have OpenGL code in a background
+ * thread on a Mac, and the main thread hangs because it's waiting for that
+ * background thread, but that background thread is also hanging because it's
+ * waiting for the main thread to do an update, this might fix your issue.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MAC_OPENGL_ASYNC_DISPATCH "SDL_MAC_OPENGL_ASYNC_DISPATCH"
+
+/**
+ * Request SDL_AppIterate() be called at a specific rate.
+ *
+ * This number is in Hz, so "60" means try to iterate 60 times per second.
+ *
+ * On some platforms, or if you are using SDL_main instead of SDL_AppIterate,
+ * this hint is ignored. When the hint can be used, it is allowed to be
+ * changed at any time.
+ *
+ * This defaults to 60, and specifying NULL for the hint's value will restore
+ * the default.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MAIN_CALLBACK_RATE "SDL_MAIN_CALLBACK_RATE"
+
+/**
+ * A variable controlling whether the mouse is captured while mouse buttons
+ * are pressed.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": The mouse is not captured while mouse buttons are pressed.
+ * - "1": The mouse is captured while mouse buttons are pressed.
+ *
+ * By default the mouse is captured while mouse buttons are pressed so if the
+ * mouse is dragged outside the window, the application continues to receive
+ * mouse events until the button is released.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MOUSE_AUTO_CAPTURE "SDL_MOUSE_AUTO_CAPTURE"
+
+/**
+ * A variable setting the double click radius, in pixels.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS "SDL_MOUSE_DOUBLE_CLICK_RADIUS"
+
+/**
+ * A variable setting the double click time, in milliseconds.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MOUSE_DOUBLE_CLICK_TIME "SDL_MOUSE_DOUBLE_CLICK_TIME"
+
+/**
+ * A variable controlling whether warping a hidden mouse cursor will activate
+ * relative mouse mode.
+ *
+ * When this hint is set and the mouse cursor is hidden, SDL will emulate
+ * mouse warps using relative mouse mode. This can provide smoother and more
+ * reliable mouse motion for some older games, which continuously calculate
+ * the distance travelled by the mouse pointer and warp it back to the center
+ * of the window, rather than using relative mouse motion.
+ *
+ * Note that relative mouse mode may have different mouse acceleration
+ * behavior than pointer warps.
+ *
+ * If your game or application needs to warp the mouse cursor while hidden for
+ * other purposes, such as drawing a software cursor, it should disable this
+ * hint.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Attempts to warp the mouse will always be made.
+ * - "1": Some mouse warps will be emulated by forcing relative mouse mode.
+ * (default)
+ *
+ * If not set, this is automatically enabled unless an application uses
+ * relative mouse mode directly.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MOUSE_EMULATE_WARP_WITH_RELATIVE "SDL_MOUSE_EMULATE_WARP_WITH_RELATIVE"
+
+/**
+ * Allow mouse click events when clicking to focus an SDL window.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Ignore mouse clicks that activate a window. (default)
+ * - "1": Generate events for mouse clicks that activate a window.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH "SDL_MOUSE_FOCUS_CLICKTHROUGH"
+
+/**
+ * A variable setting the speed scale for mouse motion, in floating point,
+ * when the mouse is not in relative mode.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MOUSE_NORMAL_SPEED_SCALE "SDL_MOUSE_NORMAL_SPEED_SCALE"
+
+/**
+ * A variable controlling whether relative mouse mode constrains the mouse to
+ * the center of the window.
+ *
+ * Constraining to the center of the window works better for FPS games and
+ * when the application is running over RDP. Constraining to the whole window
+ * works better for 2D games and increases the chance that the mouse will be
+ * in the correct position when using high DPI mice.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Relative mouse mode constrains the mouse to the window.
+ * - "1": Relative mouse mode constrains the mouse to the center of the
+ * window. (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MOUSE_RELATIVE_MODE_CENTER "SDL_MOUSE_RELATIVE_MODE_CENTER"
+
+/**
+ * A variable controlling whether relative mouse mode is implemented using
+ * mouse warping.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Relative mouse mode uses raw input. (default)
+ * - "1": Relative mouse mode uses mouse warping.
+ *
+ * This hint can be set anytime relative mode is not currently enabled.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MOUSE_RELATIVE_MODE_WARP "SDL_MOUSE_RELATIVE_MODE_WARP"
+
+/**
+ * A variable setting the scale for mouse motion, in floating point, when the
+ * mouse is in relative mode.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE "SDL_MOUSE_RELATIVE_SPEED_SCALE"
+
+/**
+ * A variable controlling whether the system mouse acceleration curve is used
+ * for relative mouse motion.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Relative mouse motion will be unscaled. (default)
+ * - "1": Relative mouse motion will be scaled using the system mouse
+ * acceleration curve.
+ *
+ * If SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE is set, that will override the
+ * system speed scale.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MOUSE_RELATIVE_SYSTEM_SCALE "SDL_MOUSE_RELATIVE_SYSTEM_SCALE"
+
+/**
+ * A variable controlling whether a motion event should be generated for mouse
+ * warping in relative mode.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Warping the mouse will not generate a motion event in relative mode
+ * - "1": Warping the mouse will generate a motion event in relative mode
+ *
+ * By default warping the mouse will not generate motion events in relative
+ * mode. This avoids the application having to filter out large relative
+ * motion due to warping.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MOUSE_RELATIVE_WARP_MOTION "SDL_MOUSE_RELATIVE_WARP_MOTION"
+
+/**
+ * A variable controlling whether the hardware cursor stays visible when
+ * relative mode is active.
+ *
+ * This variable can be set to the following values: "0" - The cursor will be
+ * hidden while relative mode is active (default) "1" - The cursor will remain
+ * visible while relative mode is active
+ *
+ * Note that for systems without raw hardware inputs, relative mode is
+ * implemented using warping, so the hardware cursor will visibly warp between
+ * frames if this is enabled on those systems.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MOUSE_RELATIVE_CURSOR_VISIBLE "SDL_MOUSE_RELATIVE_CURSOR_VISIBLE"
+
+/**
+ * Controls how often SDL issues cursor confinement commands to the operating
+ * system while relative mode is active, in case the desired confinement state
+ * became out-of-sync due to interference from other running programs.
+ *
+ * The variable can be integers representing miliseconds between each refresh.
+ * A value of zero means SDL will not automatically refresh the confinement.
+ * The default value varies depending on the operating system, this variable
+ * might not have any effects on inapplicable platforms such as those without
+ * a cursor.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MOUSE_RELATIVE_CLIP_INTERVAL "SDL_MOUSE_RELATIVE_CLIP_INTERVAL"
+
+/**
+ * A variable controlling whether mouse events should generate synthetic touch
+ * events.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Mouse events will not generate touch events. (default for desktop
+ * platforms)
+ * - "1": Mouse events will generate touch events. (default for mobile
+ * platforms, such as Android and iOS)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_MOUSE_TOUCH_EVENTS "SDL_MOUSE_TOUCH_EVENTS"
+
+/**
+ * Tell SDL not to catch the SIGINT or SIGTERM signals on POSIX platforms.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": SDL will install a SIGINT and SIGTERM handler, and when it catches a
+ * signal, convert it into an SDL_EVENT_QUIT event. (default)
+ * - "1": SDL will not install a signal handler at all.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_NO_SIGNAL_HANDLERS "SDL_NO_SIGNAL_HANDLERS"
+
+/**
+ * A variable controlling what driver to use for OpenGL ES contexts.
+ *
+ * On some platforms, currently Windows and X11, OpenGL drivers may support
+ * creating contexts with an OpenGL ES profile. By default SDL uses these
+ * profiles, when available, otherwise it attempts to load an OpenGL ES
+ * library, e.g. that provided by the ANGLE project. This variable controls
+ * whether SDL follows this default behaviour or will always load an OpenGL ES
+ * library.
+ *
+ * Circumstances where this is useful include - Testing an app with a
+ * particular OpenGL ES implementation, e.g ANGLE, or emulator, e.g. those
+ * from ARM, Imagination or Qualcomm. - Resolving OpenGL ES function addresses
+ * at link time by linking with the OpenGL ES library instead of querying them
+ * at run time with SDL_GL_GetProcAddress().
+ *
+ * Caution: for an application to work with the default behaviour across
+ * different OpenGL drivers it must query the OpenGL ES function addresses at
+ * run time using SDL_GL_GetProcAddress().
+ *
+ * This variable is ignored on most platforms because OpenGL ES is native or
+ * not supported.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Use ES profile of OpenGL, if available. (default)
+ * - "1": Load OpenGL ES library using the default library names.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_OPENGL_ES_DRIVER "SDL_OPENGL_ES_DRIVER"
+
+/**
+ * A variable controlling which orientations are allowed on iOS/Android.
+ *
+ * In some circumstances it is necessary to be able to explicitly control
+ * which UI orientations are allowed.
+ *
+ * This variable is a space delimited list of the following values:
+ *
+ * - "LandscapeLeft"
+ * - "LandscapeRight"
+ * - "Portrait"
+ * - "PortraitUpsideDown"
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_ORIENTATIONS "SDL_ORIENTATIONS"
+
+/**
+ * A variable controlling whether pen mouse button emulation triggers only
+ * when the pen touches the tablet surface.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": The pen reports mouse button press/release immediately when the pen
+ * button is pressed/released, and the pen tip touching the surface counts
+ * as left mouse button press.
+ * - "1": Mouse button presses are sent when the pen first touches the tablet
+ * (analogously for releases). Not pressing a pen button simulates mouse
+ * button 1, pressing the first pen button simulates mouse button 2 etc.; it
+ * is not possible to report multiple buttons as pressed at the same time.
+ * (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_PEN_DELAY_MOUSE_BUTTON "SDL_PEN_DELAY_MOUSE_BUTTON"
+
+/**
+ * A variable controlling whether to treat pen movement as separate from mouse
+ * movement.
+ *
+ * By default, pens report both SDL_MouseMotionEvent and SDL_PenMotionEvent
+ * updates (analogously for button presses). This hint allows decoupling mouse
+ * and pen updates.
+ *
+ * This variable toggles between the following behaviour:
+ *
+ * - "0": Pen acts as a mouse with mouse ID SDL_PEN_MOUSEID. (default) Use
+ * case: client application is not pen aware, user wants to use pen instead
+ * of mouse to interact.
+ * - "1": Pen reports mouse clicks and movement events but does not update
+ * SDL-internal mouse state (buttons pressed, current mouse location). Use
+ * case: client application is not pen aware, user frequently alternates
+ * between pen and "real" mouse.
+ * - "2": Pen reports no mouse events. Use case: pen-aware client application
+ * uses this hint to allow user to toggle between pen+mouse mode ("2") and
+ * pen-only mode ("1" or "0").
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_PEN_NOT_MOUSE "SDL_PEN_NOT_MOUSE"
+
+/**
+ * A variable controlling the use of a sentinel event when polling the event
+ * queue.
+ *
+ * When polling for events, SDL_PumpEvents is used to gather new events from
+ * devices. If a device keeps producing new events between calls to
+ * SDL_PumpEvents, a poll loop will become stuck until the new events stop.
+ * This is most noticeable when moving a high frequency mouse.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Disable poll sentinels.
+ * - "1": Enable poll sentinels. (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_POLL_SENTINEL "SDL_POLL_SENTINEL"
+
+/**
+ * Override for SDL_GetPreferredLocales().
+ *
+ * If set, this will be favored over anything the OS might report for the
+ * user's preferred locales. Changing this hint at runtime will not generate a
+ * SDL_EVENT_LOCALE_CHANGED event (but if you can change the hint, you can
+ * push your own event, if you want).
+ *
+ * The format of this hint is a comma-separated list of language and locale,
+ * combined with an underscore, as is a common format: "en_GB". Locale is
+ * optional: "en". So you might have a list like this: "en_GB,jp,es_PT"
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_PREFERRED_LOCALES "SDL_PREFERRED_LOCALES"
+
+/**
+ * A variable that decides whether to send SDL_EVENT_QUIT when closing the
+ * last window.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": SDL will not send an SDL_EVENT_QUIT event when the last window is
+ * requesting to close. Note that in this case, there are still other
+ * legitimate reasons one might get an SDL_EVENT_QUIT event: choosing "Quit"
+ * from the macOS menu bar, sending a SIGINT (ctrl-c) on Unix, etc.
+ * - "1": SDL will send a quit event when the last window is requesting to
+ * close. (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE "SDL_QUIT_ON_LAST_WINDOW_CLOSE"
+
+/**
+ * A variable controlling whether the Direct3D device is initialized for
+ * thread-safe operations.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Thread-safety is not enabled. (default)
+ * - "1": Thread-safety is enabled.
+ *
+ * This hint should be set before creating a renderer.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_RENDER_DIRECT3D_THREADSAFE "SDL_RENDER_DIRECT3D_THREADSAFE"
+
+/**
+ * A variable controlling whether to enable Direct3D 11+'s Debug Layer.
+ *
+ * This variable does not have any effect on the Direct3D 9 based renderer.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Disable Debug Layer use. (default)
+ * - "1": Enable Debug Layer use.
+ *
+ * This hint should be set before creating a renderer.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_RENDER_DIRECT3D11_DEBUG "SDL_RENDER_DIRECT3D11_DEBUG"
+
+/**
+ * A variable controlling whether to enable Vulkan Validation Layers.
+ *
+ * This variable can be set to the following values:
+ *
+ * - "0": Disable Validation Layer use
+ * - "1": Enable Validation Layer use
+ *
+ * By default, SDL does not use Vulkan Validation Layers.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_RENDER_VULKAN_DEBUG "SDL_RENDER_VULKAN_DEBUG"
+
+/**
+ * A variable specifying which render driver to use.
+ *
+ * If the application doesn't pick a specific renderer to use, this variable
+ * specifies the name of the preferred renderer. If the preferred renderer
+ * can't be initialized, the normal default renderer is used.
+ *
+ * This variable is case insensitive and can be set to the following values:
+ *
+ * - "direct3d"
+ * - "direct3d11"
+ * - "direct3d12"
+ * - "opengl"
+ * - "opengles2"
+ * - "opengles"
+ * - "metal"
+ * - "vulkan"
+ * - "software"
+ *
+ * The default varies by platform, but it's the first one in the list that is
+ * available on the current platform.
+ *
+ * This hint should be set before creating a renderer.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_RENDER_DRIVER "SDL_RENDER_DRIVER"
+
+/**
+ * A variable controlling how the 2D render API renders lines.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Use the default line drawing method (Bresenham's line algorithm)
+ * - "1": Use the driver point API using Bresenham's line algorithm (correct,
+ * draws many points)
+ * - "2": Use the driver line API (occasionally misses line endpoints based on
+ * hardware driver quirks
+ * - "3": Use the driver geometry API (correct, draws thicker diagonal lines)
+ *
+ * This hint should be set before creating a renderer.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_RENDER_LINE_METHOD "SDL_RENDER_LINE_METHOD"
+
+/**
+ * A variable controlling whether the Metal render driver select low power
+ * device over default one.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Use the preferred OS device. (default)
+ * - "1": Select a low power device.
+ *
+ * This hint should be set before creating a renderer.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE "SDL_RENDER_METAL_PREFER_LOW_POWER_DEVICE"
+
+/**
+ * A variable controlling whether updates to the SDL screen surface should be
+ * synchronized with the vertical refresh, to avoid tearing.
+ *
+ * This hint overrides the application preference when creating a renderer.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Disable vsync. (default)
+ * - "1": Enable vsync.
+ *
+ * This hint should be set before creating a renderer.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_RENDER_VSYNC "SDL_RENDER_VSYNC"
+
+/**
+ * A variable to control whether the return key on the soft keyboard should
+ * hide the soft keyboard on Android and iOS.
+ *
+ * This hint sets the default value of SDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": The return key will be handled as a key event. (default)
+ * - "1": The return key will hide the keyboard.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_RETURN_KEY_HIDES_IME "SDL_RETURN_KEY_HIDES_IME"
+
+/**
+ * A variable containing a list of ROG gamepad capable mice.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ *
+ * \sa SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED
+ */
+#define SDL_HINT_ROG_GAMEPAD_MICE "SDL_ROG_GAMEPAD_MICE"
+
+/**
+ * A variable containing a list of devices that are not ROG gamepad capable
+ * mice.
+ *
+ * This will override SDL_HINT_ROG_GAMEPAD_MICE and the built in device list.
+ *
+ * The format of the string is a comma separated list of USB VID/PID pairs in
+ * hexadecimal form, e.g.
+ *
+ * `0xAAAA/0xBBBB,0xCCCC/0xDDDD`
+ *
+ * The variable can also take the form of "@file", in which case the named
+ * file will be loaded and interpreted as the value of the variable.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED "SDL_ROG_GAMEPAD_MICE_EXCLUDED"
+
+/**
+ * A variable controlling which Dispmanx layer to use on a Raspberry PI.
+ *
+ * Also known as Z-order. The variable can take a negative or positive value.
+ * The default is 10000.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_RPI_VIDEO_LAYER "SDL_RPI_VIDEO_LAYER"
+
+/**
+ * Specify an "activity name" for screensaver inhibition.
+ *
+ * Some platforms, notably Linux desktops, list the applications which are
+ * inhibiting the screensaver or other power-saving features.
+ *
+ * This hint lets you specify the "activity name" sent to the OS when
+ * SDL_DisableScreenSaver() is used (or the screensaver is automatically
+ * disabled). The contents of this hint are used when the screensaver is
+ * disabled. You should use a string that describes what your program is doing
+ * (and, therefore, why the screensaver is disabled). For example, "Playing a
+ * game" or "Watching a video".
+ *
+ * Setting this to "" or leaving it unset will have SDL use a reasonable
+ * default: "Playing a game" or something similar.
+ *
+ * This hint should be set before calling SDL_DisableScreenSaver()
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME "SDL_SCREENSAVER_INHIBIT_ACTIVITY_NAME"
+
+/**
+ * A variable controlling whether SDL calls dbus_shutdown() on quit.
+ *
+ * This is useful as a debug tool to validate memory leaks, but shouldn't ever
+ * be set in production applications, as other libraries used by the
+ * application might use dbus under the hood and this can cause crashes if
+ * they continue after SDL_Quit().
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": SDL will not call dbus_shutdown() on quit. (default)
+ * - "1": SDL will call dbus_shutdown() on quit.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_SHUTDOWN_DBUS_ON_QUIT "SDL_SHUTDOWN_DBUS_ON_QUIT"
+
+/**
+ * A variable that specifies a backend to use for title storage.
+ *
+ * By default, SDL will try all available storage backends in a reasonable
+ * order until it finds one that can work, but this hint allows the app or
+ * user to force a specific target, such as "pc" if, say, you are on Steam but
+ * want to avoid SteamRemoteStorage for title data.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_STORAGE_TITLE_DRIVER "SDL_STORAGE_TITLE_DRIVER"
+
+/**
+ * A variable that specifies a backend to use for user storage.
+ *
+ * By default, SDL will try all available storage backends in a reasonable
+ * order until it finds one that can work, but this hint allows the app or
+ * user to force a specific target, such as "pc" if, say, you are on Steam but
+ * want to avoid SteamRemoteStorage for user data.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_STORAGE_USER_DRIVER "SDL_STORAGE_USER_DRIVER"
+
+/**
+ * Specifies whether SDL_THREAD_PRIORITY_TIME_CRITICAL should be treated as
+ * realtime.
+ *
+ * On some platforms, like Linux, a realtime priority thread may be subject to
+ * restrictions that require special handling by the application. This hint
+ * exists to let SDL know that the app is prepared to handle said
+ * restrictions.
+ *
+ * On Linux, SDL will apply the following configuration to any thread that
+ * becomes realtime:
+ *
+ * - The SCHED_RESET_ON_FORK bit will be set on the scheduling policy,
+ * - An RLIMIT_RTTIME budget will be configured to the rtkit specified limit.
+ * - Exceeding this limit will result in the kernel sending SIGKILL to the
+ * app, refer to the man pages for more information.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": default platform specific behaviour
+ * - "1": Force SDL_THREAD_PRIORITY_TIME_CRITICAL to a realtime scheduling
+ * policy
+ *
+ * This hint should be set before calling SDL_SetThreadPriority()
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL "SDL_THREAD_FORCE_REALTIME_TIME_CRITICAL"
+
+/**
+ * A string specifying additional information to use with
+ * SDL_SetThreadPriority.
+ *
+ * By default SDL_SetThreadPriority will make appropriate system changes in
+ * order to apply a thread priority. For example on systems using pthreads the
+ * scheduler policy is changed automatically to a policy that works well with
+ * a given priority. Code which has specific requirements can override SDL's
+ * default behavior with this hint.
+ *
+ * pthread hint values are "current", "other", "fifo" and "rr". Currently no
+ * other platform hint values are defined but may be in the future.
+ *
+ * On Linux, the kernel may send SIGKILL to realtime tasks which exceed the
+ * distro configured execution budget for rtkit. This budget can be queried
+ * through RLIMIT_RTTIME after calling SDL_SetThreadPriority().
+ *
+ * This hint should be set before calling SDL_SetThreadPriority()
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_THREAD_PRIORITY_POLICY "SDL_THREAD_PRIORITY_POLICY"
+
+/**
+ * A variable that controls the timer resolution, in milliseconds.
+ *
+ * The higher resolution the timer, the more frequently the CPU services timer
+ * interrupts, and the more precise delays are, but this takes up power and
+ * CPU time. This hint is only used on Windows.
+ *
+ * See this blog post for more information:
+ * http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/
+ *
+ * The default value is "1".
+ *
+ * If this variable is set to "0", the system timer resolution is not set.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_TIMER_RESOLUTION "SDL_TIMER_RESOLUTION"
+
+/**
+ * A variable controlling whether touch events should generate synthetic mouse
+ * events.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Touch events will not generate mouse events.
+ * - "1": Touch events will generate mouse events. (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_TOUCH_MOUSE_EVENTS "SDL_TOUCH_MOUSE_EVENTS"
+
+/**
+ * A variable controlling whether trackpads should be treated as touch
+ * devices.
+ *
+ * On macOS (and possibly other platforms in the future), SDL will report
+ * touches on a trackpad as mouse input, which is generally what users expect
+ * from this device; however, these are often actually full multitouch-capable
+ * touch devices, so it might be preferable to some apps to treat them as
+ * such.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Trackpad will send mouse events. (default)
+ * - "1": Trackpad will send touch events.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_TRACKPAD_IS_TOUCH_ONLY "SDL_TRACKPAD_IS_TOUCH_ONLY"
+
+/**
+ * A variable controlling whether the Android / tvOS remotes should be listed
+ * as joystick devices, instead of sending keyboard events.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Remotes send enter/escape/arrow key events.
+ * - "1": Remotes are available as 2 axis, 2 button joysticks. (default)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_TV_REMOTE_AS_JOYSTICK "SDL_TV_REMOTE_AS_JOYSTICK"
+
+/**
+ * A variable controlling whether the screensaver is enabled.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Disable screensaver. (default)
+ * - "1": Enable screensaver.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_ALLOW_SCREENSAVER "SDL_VIDEO_ALLOW_SCREENSAVER"
+
+/**
+ * Tell the video driver that we only want a double buffer.
+ *
+ * By default, most lowlevel 2D APIs will use a triple buffer scheme that
+ * wastes no CPU time on waiting for vsync after issuing a flip, but
+ * introduces a frame of latency. On the other hand, using a double buffer
+ * scheme instead is recommended for cases where low latency is an important
+ * factor because we save a whole frame of latency.
+ *
+ * We do so by waiting for vsync immediately after issuing a flip, usually
+ * just after eglSwapBuffers call in the backend's *_SwapWindow function.
+ *
+ * This hint is currently supported on the following drivers:
+ *
+ * - Raspberry Pi (raspberrypi)
+ * - Wayland (wayland)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_DOUBLE_BUFFER "SDL_VIDEO_DOUBLE_BUFFER"
+
+/**
+ * A variable that specifies a video backend to use.
+ *
+ * By default, SDL will try all available video backends in a reasonable order
+ * until it finds one that can work, but this hint allows the app or user to
+ * force a specific target, such as "x11" if, say, you are on Wayland but want
+ * to try talking to the X server instead.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_DRIVER "SDL_VIDEO_DRIVER"
+
+/**
+ * If eglGetPlatformDisplay fails, fall back to calling eglGetDisplay.
+ *
+ * The variable can be set to one of the following values:
+ *
+ * - "0": Do not fall back to eglGetDisplay.
+ * - "1": Fall back to eglGetDisplay if eglGetPlatformDisplay fails. (default)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_EGL_ALLOW_GETDISPLAY_FALLBACK "SDL_VIDEO_EGL_ALLOW_GETDISPLAY_FALLBACK"
+
+/**
+ * A variable controlling whether the OpenGL context should be created with
+ * EGL.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Use platform-specific GL context creation API (GLX, WGL, CGL, etc).
+ * (default)
+ * - "1": Use EGL
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_FORCE_EGL "SDL_VIDEO_FORCE_EGL"
+
+/**
+ * A variable that specifies the policy for fullscreen Spaces on macOS.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Disable Spaces support (FULLSCREEN_DESKTOP won't use them and
+ * SDL_WINDOW_RESIZABLE windows won't offer the "fullscreen" button on their
+ * titlebars).
+ * - "1": Enable Spaces support (FULLSCREEN_DESKTOP will use them and
+ * SDL_WINDOW_RESIZABLE windows will offer the "fullscreen" button on their
+ * titlebars). (default)
+ *
+ * This hint should be set before creating a window.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES "SDL_VIDEO_MAC_FULLSCREEN_SPACES"
+
+/**
+ * A variable controlling whether fullscreen windows are minimized when they
+ * lose focus.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Fullscreen windows will not be minimized when they lose focus.
+ * (default)
+ * - "1": Fullscreen windows are minimized when they lose focus.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS "SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS"
+
+/**
+ * A variable controlling whether all window operations will block until
+ * complete.
+ *
+ * Window systems that run asynchronously may not have the results of window
+ * operations that resize or move the window applied immediately upon the
+ * return of the requesting function. Setting this hint will cause such
+ * operations to block after every call until the pending operation has
+ * completed. Setting this to '1' is the equivalent of calling
+ * SDL_SyncWindow() after every function call.
+ *
+ * Be aware that amount of time spent blocking while waiting for window
+ * operations to complete can be quite lengthy, as animations may have to
+ * complete, which can take upwards of multiple seconds in some cases.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Window operations are non-blocking. (default)
+ * - "1": Window operations will block until completed.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS "SDL_VIDEO_SYNC_WINDOW_OPERATIONS"
+
+/**
+ * A variable controlling whether the libdecor Wayland backend is allowed to
+ * be used.
+ *
+ * libdecor is used over xdg-shell when xdg-decoration protocol is
+ * unavailable.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": libdecor use is disabled.
+ * - "1": libdecor use is enabled. (default)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR "SDL_VIDEO_WAYLAND_ALLOW_LIBDECOR"
+
+/**
+ * A variable controlling whether video mode emulation is enabled under
+ * Wayland.
+ *
+ * When this hint is set, a standard set of emulated CVT video modes will be
+ * exposed for use by the application. If it is disabled, the only modes
+ * exposed will be the logical desktop size and, in the case of a scaled
+ * desktop, the native display resolution.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Video mode emulation is disabled.
+ * - "1": Video mode emulation is enabled. (default)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_WAYLAND_MODE_EMULATION "SDL_VIDEO_WAYLAND_MODE_EMULATION"
+
+/**
+ * A variable controlling how modes with a non-native aspect ratio are
+ * displayed under Wayland.
+ *
+ * When this hint is set, the requested scaling will be used when displaying
+ * fullscreen video modes that don't match the display's native aspect ratio.
+ * This is contingent on compositor viewport support.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "aspect" - Video modes will be displayed scaled, in their proper aspect
+ * ratio, with black bars.
+ * - "stretch" - Video modes will be scaled to fill the entire display.
+ * (default)
+ * - "none" - Video modes will be displayed as 1:1 with no scaling.
+ *
+ * This hint should be set before creating a window.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_WAYLAND_MODE_SCALING "SDL_VIDEO_WAYLAND_MODE_SCALING"
+
+/**
+ * A variable controlling whether the libdecor Wayland backend is preferred
+ * over native decorations.
+ *
+ * When this hint is set, libdecor will be used to provide window decorations,
+ * even if xdg-decoration is available. (Note that, by default, libdecor will
+ * use xdg-decoration itself if available).
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": libdecor is enabled only if server-side decorations are unavailable.
+ * (default)
+ * - "1": libdecor is always enabled if available.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_WAYLAND_PREFER_LIBDECOR "SDL_VIDEO_WAYLAND_PREFER_LIBDECOR"
+
+/**
+ * A variable forcing non-DPI-aware Wayland windows to output at 1:1 scaling.
+ *
+ * This must be set before initializing the video subsystem.
+ *
+ * When this hint is set, Wayland windows that are not flagged as being
+ * DPI-aware will be output with scaling designed to force 1:1 pixel mapping.
+ *
+ * This is intended to allow legacy applications to be displayed without
+ * desktop scaling being applied, and has issues with certain display
+ * configurations, as this forces the window to behave in a way that Wayland
+ * desktops were not designed to accommodate:
+ *
+ * - Rounding errors can result with odd window sizes and/or desktop scales,
+ * which can cause the window contents to appear slightly blurry.
+ * - The window may be unusably small on scaled desktops.
+ * - The window may jump in size when moving between displays of different
+ * scale factors.
+ * - Displays may appear to overlap when using a multi-monitor setup with
+ * scaling enabled.
+ * - Possible loss of cursor precision due to the logical size of the window
+ * being reduced.
+ *
+ * New applications should be designed with proper DPI awareness handling
+ * instead of enabling this.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Windows will be scaled normally.
+ * - "1": Windows will be forced to scale to achieve 1:1 output.
+ *
+ * This hint should be set before creating a window.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_WAYLAND_SCALE_TO_DISPLAY "SDL_VIDEO_WAYLAND_SCALE_TO_DISPLAY"
+
+/**
+ * A variable specifying which shader compiler to preload when using the
+ * Chrome ANGLE binaries.
+ *
+ * SDL has EGL and OpenGL ES2 support on Windows via the ANGLE project. It can
+ * use two different sets of binaries, those compiled by the user from source
+ * or those provided by the Chrome browser. In the later case, these binaries
+ * require that SDL loads a DLL providing the shader compiler.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "d3dcompiler_46.dll" - best for Vista or later. (default)
+ * - "d3dcompiler_43.dll" - for XP support.
+ * - "none" - do not load any library, useful if you compiled ANGLE from
+ * source and included the compiler in your binaries.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_WIN_D3DCOMPILER "SDL_VIDEO_WIN_D3DCOMPILER"
+
+/**
+ * A variable controlling whether the X11 _NET_WM_BYPASS_COMPOSITOR hint
+ * should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Disable _NET_WM_BYPASS_COMPOSITOR.
+ * - "1": Enable _NET_WM_BYPASS_COMPOSITOR. (default)
+ *
+ * This hint should be set before creating a window.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR "SDL_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR"
+
+/**
+ * A variable controlling whether the X11 _NET_WM_PING protocol should be
+ * supported.
+ *
+ * By default SDL will use _NET_WM_PING, but for applications that know they
+ * will not always be able to respond to ping requests in a timely manner they
+ * can turn it off to avoid the window manager thinking the app is hung.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Disable _NET_WM_PING.
+ * - "1": Enable _NET_WM_PING. (default)
+ *
+ * This hint should be set before creating a window.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_X11_NET_WM_PING "SDL_VIDEO_X11_NET_WM_PING"
+
+/**
+ * A variable forcing the content scaling factor for X11 displays.
+ *
+ * The variable can be set to a floating point value in the range 1.0-10.0f
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_X11_SCALING_FACTOR "SDL_VIDEO_X11_SCALING_FACTOR"
+
+/**
+ * A variable forcing the visual ID chosen for new X11 windows.
+ *
+ * This hint should be set before creating a window.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_X11_WINDOW_VISUALID "SDL_VIDEO_X11_WINDOW_VISUALID"
+
+/**
+ * A variable controlling whether the X11 XRandR extension should be used.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Disable XRandR.
+ * - "1": Enable XRandR. (default)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VIDEO_X11_XRANDR "SDL_VIDEO_X11_XRANDR"
+
+/**
+ * A variable controlling which touchpad should generate synthetic mouse
+ * events.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Only front touchpad should generate mouse events. (default)
+ * - "1": Only back touchpad should generate mouse events.
+ * - "2": Both touchpads should generate mouse events.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_VITA_TOUCH_MOUSE_DEVICE "SDL_VITA_TOUCH_MOUSE_DEVICE"
+
+/**
+ * A variable controlling how the fact chunk affects the loading of a WAVE
+ * file.
+ *
+ * The fact chunk stores information about the number of samples of a WAVE
+ * file. The Standards Update from Microsoft notes that this value can be used
+ * to 'determine the length of the data in seconds'. This is especially useful
+ * for compressed formats (for which this is a mandatory chunk) if they
+ * produce multiple sample frames per block and truncating the block is not
+ * allowed. The fact chunk can exactly specify how many sample frames there
+ * should be in this case.
+ *
+ * Unfortunately, most application seem to ignore the fact chunk and so SDL
+ * ignores it by default as well.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "truncate" - Use the number of samples to truncate the wave data if the
+ * fact chunk is present and valid.
+ * - "strict" - Like "truncate", but raise an error if the fact chunk is
+ * invalid, not present for non-PCM formats, or if the data chunk doesn't
+ * have that many samples.
+ * - "ignorezero" - Like "truncate", but ignore fact chunk if the number of
+ * samples is zero.
+ * - "ignore" - Ignore fact chunk entirely. (default)
+ *
+ * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO()
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WAVE_FACT_CHUNK "SDL_WAVE_FACT_CHUNK"
+
+/**
+ * A variable controlling how the size of the RIFF chunk affects the loading
+ * of a WAVE file.
+ *
+ * The size of the RIFF chunk (which includes all the sub-chunks of the WAVE
+ * file) is not always reliable. In case the size is wrong, it's possible to
+ * just ignore it and step through the chunks until a fixed limit is reached.
+ *
+ * Note that files that have trailing data unrelated to the WAVE file or
+ * corrupt files may slow down the loading process without a reliable
+ * boundary. By default, SDL stops after 10000 chunks to prevent wasting time.
+ * Use the environment variable SDL_WAVE_CHUNK_LIMIT to adjust this value.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "force" - Always use the RIFF chunk size as a boundary for the chunk
+ * search.
+ * - "ignorezero" - Like "force", but a zero size searches up to 4 GiB.
+ * (default)
+ * - "ignore" - Ignore the RIFF chunk size and always search up to 4 GiB.
+ * - "maximum" - Search for chunks until the end of file. (not recommended)
+ *
+ * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO()
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WAVE_RIFF_CHUNK_SIZE "SDL_WAVE_RIFF_CHUNK_SIZE"
+
+/**
+ * A variable controlling how a truncated WAVE file is handled.
+ *
+ * A WAVE file is considered truncated if any of the chunks are incomplete or
+ * the data chunk size is not a multiple of the block size. By default, SDL
+ * decodes until the first incomplete block, as most applications seem to do.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "verystrict" - Raise an error if the file is truncated.
+ * - "strict" - Like "verystrict", but the size of the RIFF chunk is ignored.
+ * - "dropframe" - Decode until the first incomplete sample frame.
+ * - "dropblock" - Decode until the first incomplete block. (default)
+ *
+ * This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO()
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WAVE_TRUNCATION "SDL_WAVE_TRUNCATION"
+
+/**
+ * A variable controlling whether the window is activated when the
+ * SDL_RaiseWindow function is called.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": The window is not activated when the SDL_RaiseWindow function is
+ * called.
+ * - "1": The window is activated when the SDL_RaiseWindow function is called.
+ * (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINDOW_ACTIVATE_WHEN_RAISED "SDL_WINDOW_ACTIVATE_WHEN_RAISED"
+
+/**
+ * A variable controlling whether the window is activated when the
+ * SDL_ShowWindow function is called.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": The window is not activated when the SDL_ShowWindow function is
+ * called.
+ * - "1": The window is activated when the SDL_ShowWindow function is called.
+ * (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN "SDL_WINDOW_ACTIVATE_WHEN_SHOWN"
+
+/**
+ * If set to "0" then never set the top-most flag on an SDL Window even if the
+ * application requests it.
+ *
+ * This is a debugging aid for developers and not expected to be used by end
+ * users.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": don't allow topmost
+ * - "1": allow topmost (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINDOW_ALLOW_TOPMOST "SDL_WINDOW_ALLOW_TOPMOST"
+
+/**
+ * A variable controlling whether the window frame and title bar are
+ * interactive when the cursor is hidden.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": The window frame is not interactive when the cursor is hidden (no
+ * move, resize, etc).
+ * - "1": The window frame is interactive when the cursor is hidden. (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN "SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN"
+
+/**
+ * A variable controlling whether SDL generates window-close events for Alt+F4
+ * on Windows.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": SDL will only do normal key handling for Alt+F4.
+ * - "1": SDL will generate a window-close event when it sees Alt+F4.
+ * (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINDOWS_CLOSE_ON_ALT_F4 "SDL_WINDOWS_CLOSE_ON_ALT_F4"
+
+/**
+ * A variable controlling whether menus can be opened with their keyboard
+ * shortcut (Alt+mnemonic).
+ *
+ * If the mnemonics are enabled, then menus can be opened by pressing the Alt
+ * key and the corresponding mnemonic (for example, Alt+F opens the File
+ * menu). However, in case an invalid mnemonic is pressed, Windows makes an
+ * audible beep to convey that nothing happened. This is true even if the
+ * window has no menu at all!
+ *
+ * Because most SDL applications don't have menus, and some want to use the
+ * Alt key for other purposes, SDL disables mnemonics (and the beeping) by
+ * default.
+ *
+ * Note: This also affects keyboard events: with mnemonics enabled, when a
+ * menu is opened from the keyboard, you will not receive a KEYUP event for
+ * the mnemonic key, and *might* not receive one for Alt.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Alt+mnemonic does nothing, no beeping. (default)
+ * - "1": Alt+mnemonic opens menus, invalid mnemonics produce a beep.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINDOWS_ENABLE_MENU_MNEMONICS "SDL_WINDOWS_ENABLE_MENU_MNEMONICS"
+
+/**
+ * A variable controlling whether the windows message loop is processed by
+ * SDL.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": The window message loop is not run.
+ * - "1": The window message loop is processed in SDL_PumpEvents(). (default)
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP "SDL_WINDOWS_ENABLE_MESSAGELOOP"
+
+/**
+ * A variable controlling whether raw keyboard events are used on Windows.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": The Windows message loop is used for keyboard events. (default)
+ * - "1": Low latency raw keyboard events are used.
+ *
+ * This hint can be set anytime.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINDOWS_RAW_KEYBOARD "SDL_WINDOWS_RAW_KEYBOARD"
+
+/**
+ * A variable controlling whether SDL uses Critical Sections for mutexes on
+ * Windows.
+ *
+ * On Windows 7 and newer, Slim Reader/Writer Locks are available. They offer
+ * better performance, allocate no kernel resources and use less memory. SDL
+ * will fall back to Critical Sections on older OS versions or if forced to by
+ * this hint.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Use SRW Locks when available, otherwise fall back to Critical
+ * Sections. (default)
+ * - "1": Force the use of Critical Sections in all cases.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINDOWS_FORCE_MUTEX_CRITICAL_SECTIONS "SDL_WINDOWS_FORCE_MUTEX_CRITICAL_SECTIONS"
+
+/**
+ * A variable controlling whether SDL uses Kernel Semaphores on Windows.
+ *
+ * Kernel Semaphores are inter-process and require a context switch on every
+ * interaction. On Windows 8 and newer, the WaitOnAddress API is available.
+ * Using that and atomics to implement semaphores increases performance. SDL
+ * will fall back to Kernel Objects on older OS versions or if forced to by
+ * this hint.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Use Atomics and WaitOnAddress API when available, otherwise fall
+ * back to Kernel Objects. (default)
+ * - "1": Force the use of Kernel Objects in all cases.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL "SDL_WINDOWS_FORCE_SEMAPHORE_KERNEL"
+
+/**
+ * A variable to specify custom icon resource id from RC file on Windows
+ * platform.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINDOWS_INTRESOURCE_ICON "SDL_WINDOWS_INTRESOURCE_ICON"
+#define SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL "SDL_WINDOWS_INTRESOURCE_ICON_SMALL"
+
+/**
+ * A variable controlling whether SDL uses the D3D9Ex API introduced in
+ * Windows Vista, instead of normal D3D9.
+ *
+ * Direct3D 9Ex contains changes to state management that can eliminate device
+ * loss errors during scenarios like Alt+Tab or UAC prompts. D3D9Ex may
+ * require some changes to your application to cope with the new behavior, so
+ * this is disabled by default.
+ *
+ * For more information on Direct3D 9Ex, see:
+ *
+ * - https://docs.microsoft.com/en-us/windows/win32/direct3darticles/graphics-apis-in-windows-vista#direct3d-9ex
+ * - https://docs.microsoft.com/en-us/windows/win32/direct3darticles/direct3d-9ex-improvements
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Use the original Direct3D 9 API. (default)
+ * - "1": Use the Direct3D 9Ex API on Vista and later (and fall back if D3D9Ex
+ * is unavailable)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINDOWS_USE_D3D9EX "SDL_WINDOWS_USE_D3D9EX"
+
+/**
+ * A variable controlling whether SDL will clear the window contents when the
+ * WM_ERASEBKGND message is received.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0"/"never": Never clear the window.
+ * - "1"/"initial": Clear the window when the first WM_ERASEBKGND event fires.
+ * (default)
+ * - "2"/"always": Clear the window on every WM_ERASEBKGND event.
+ *
+ * This hint should be set before creating a window.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINDOWS_ERASE_BACKGROUND_MODE "SDL_WINDOWS_ERASE_BACKGROUND_MODE"
+
+/**
+ * A variable controlling whether back-button-press events on Windows Phone to
+ * be marked as handled.
+ *
+ * Windows Phone devices typically feature a Back button. When pressed, the OS
+ * will emit back-button-press events, which apps are expected to handle in an
+ * appropriate manner. If apps do not explicitly mark these events as
+ * 'Handled', then the OS will invoke its default behavior for unhandled
+ * back-button-press events, which on Windows Phone 8 and 8.1 is to terminate
+ * the app (and attempt to switch to the previous app, or to the device's home
+ * screen).
+ *
+ * Setting the SDL_HINT_WINRT_HANDLE_BACK_BUTTON hint to "1" will cause SDL to
+ * mark back-button-press events as Handled, if and when one is sent to the
+ * app.
+ *
+ * Internally, Windows Phone sends back button events as parameters to special
+ * back-button-press callback functions. Apps that need to respond to
+ * back-button-press events are expected to register one or more callback
+ * functions for such, shortly after being launched (during the app's
+ * initialization phase). After the back button is pressed, the OS will invoke
+ * these callbacks. If the app's callback(s) do not explicitly mark the event
+ * as handled by the time they return, or if the app never registers one of
+ * these callback, the OS will consider the event un-handled, and it will
+ * apply its default back button behavior (terminate the app).
+ *
+ * SDL registers its own back-button-press callback with the Windows Phone OS.
+ * This callback will emit a pair of SDL key-press events (SDL_EVENT_KEY_DOWN
+ * and SDL_EVENT_KEY_UP), each with a scancode of SDL_SCANCODE_AC_BACK, after
+ * which it will check the contents of the hint,
+ * SDL_HINT_WINRT_HANDLE_BACK_BUTTON. If the hint's value is set to "1", the
+ * back button event's Handled property will get set to 'true'. If the hint's
+ * value is set to something else, or if it is unset, SDL will leave the
+ * event's Handled property alone. (By default, the OS sets this property to
+ * 'false', to note.)
+ *
+ * SDL apps can either set SDL_HINT_WINRT_HANDLE_BACK_BUTTON well before a
+ * back button is pressed, or can set it in direct-response to a back button
+ * being pressed.
+ *
+ * In order to get notified when a back button is pressed, SDL apps should
+ * register a callback function with SDL_AddEventWatch(), and have it listen
+ * for SDL_EVENT_KEY_DOWN events that have a scancode of SDL_SCANCODE_AC_BACK.
+ * (Alternatively, SDL_EVENT_KEY_UP events can be listened-for. Listening for
+ * either event type is suitable.) Any value of
+ * SDL_HINT_WINRT_HANDLE_BACK_BUTTON set by such a callback, will be applied
+ * to the OS' current back-button-press event.
+ *
+ * More details on back button behavior in Windows Phone apps can be found at
+ * the following page, on Microsoft's developer site:
+ * http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj247550(v=vs.105).aspx
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINRT_HANDLE_BACK_BUTTON "SDL_WINRT_HANDLE_BACK_BUTTON"
+
+/**
+ * A variable specifying the label text for a WinRT app's privacy policy link.
+ *
+ * Network-enabled WinRT apps must include a privacy policy. On Windows 8,
+ * 8.1, and RT, Microsoft mandates that this policy be available via the
+ * Windows Settings charm. SDL provides code to add a link there, with its
+ * label text being set via the optional hint,
+ * SDL_HINT_WINRT_PRIVACY_POLICY_LABEL.
+ *
+ * Please note that a privacy policy's contents are not set via this hint. A
+ * separate hint, SDL_HINT_WINRT_PRIVACY_POLICY_URL, is used to link to the
+ * actual text of the policy.
+ *
+ * The contents of this hint should be encoded as a UTF8 string.
+ *
+ * The default value is "Privacy Policy".
+ *
+ * For additional information on linking to a privacy policy, see the
+ * documentation for SDL_HINT_WINRT_PRIVACY_POLICY_URL.
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINRT_PRIVACY_POLICY_LABEL "SDL_WINRT_PRIVACY_POLICY_LABEL"
+
+/**
+ * A variable specifying the URL to a WinRT app's privacy policy.
+ *
+ * All network-enabled WinRT apps must make a privacy policy available to its
+ * users. On Windows 8, 8.1, and RT, Microsoft mandates that this policy be
+ * available in the Windows Settings charm, as accessed from within the app.
+ * SDL provides code to add a URL-based link there, which can point to the
+ * app's privacy policy.
+ *
+ * To setup a URL to an app's privacy policy, set
+ * SDL_HINT_WINRT_PRIVACY_POLICY_URL before calling any SDL_Init() functions.
+ * The contents of the hint should be a valid URL. For example,
+ * "http://www.example.com".
+ *
+ * The default value is "", which will prevent SDL from adding a privacy
+ * policy link to the Settings charm. This hint should only be set during app
+ * init.
+ *
+ * The label text of an app's "Privacy Policy" link may be customized via
+ * another hint, SDL_HINT_WINRT_PRIVACY_POLICY_LABEL.
+ *
+ * Please note that on Windows Phone, Microsoft does not provide standard UI
+ * for displaying a privacy policy link, and as such,
+ * SDL_HINT_WINRT_PRIVACY_POLICY_URL will not get used on that platform.
+ * Network-enabled phone apps should display their privacy policy through some
+ * other, in-app means.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_WINRT_PRIVACY_POLICY_URL "SDL_WINRT_PRIVACY_POLICY_URL"
+
+/**
+ * A variable controlling whether X11 windows are marked as override-redirect.
+ *
+ * If set, this _might_ increase framerate at the expense of the desktop not
+ * working as expected. Override-redirect windows aren't noticed by the window
+ * manager at all.
+ *
+ * You should probably only use this for fullscreen windows, and you probably
+ * shouldn't even use it for that. But it's here if you want to try!
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": Do not mark the window as override-redirect. (default)
+ * - "1": Mark the window as override-redirect.
+ *
+ * This hint should be set before creating a window.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_X11_FORCE_OVERRIDE_REDIRECT "SDL_X11_FORCE_OVERRIDE_REDIRECT"
+
+/**
+ * A variable specifying the type of an X11 window.
+ *
+ * During SDL_CreateWindow, SDL uses the _NET_WM_WINDOW_TYPE X11 property to
+ * report to the window manager the type of window it wants to create. This
+ * might be set to various things if SDL_WINDOW_TOOLTIP or
+ * SDL_WINDOW_POPUP_MENU, etc, were specified. For "normal" windows that
+ * haven't set a specific type, this hint can be used to specify a custom
+ * type. For example, a dock window might set this to
+ * "_NET_WM_WINDOW_TYPE_DOCK".
+ *
+ * This hint should be set before creating a window.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_X11_WINDOW_TYPE "SDL_X11_WINDOW_TYPE"
+
+/**
+ * A variable controlling whether XInput should be used for controller
+ * handling.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": XInput is not enabled.
+ * - "1": XInput is enabled. (default)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_XINPUT_ENABLED "SDL_XINPUT_ENABLED"
+
+/**
+ * An enumeration of hint priorities.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ */
+typedef enum SDL_HintPriority
+{
+ SDL_HINT_DEFAULT,
+ SDL_HINT_NORMAL,
+ SDL_HINT_OVERRIDE
+} SDL_HintPriority;
+
+
+/**
+ * Set a hint with a specific priority.
+ *
+ * The priority controls the behavior when setting a hint that already has a
+ * value. Hints will replace existing hints of their priority and lower.
+ * Environment variables are considered to have override priority.
+ *
+ * \param name the hint to set.
+ * \param value the value of the hint variable.
+ * \param priority the SDL_HintPriority level for the hint.
+ * \returns SDL_TRUE if the hint was set, SDL_FALSE otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetHint
+ * \sa SDL_ResetHint
+ * \sa SDL_SetHint
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHintWithPriority(const char *name,
+ const char *value,
+ SDL_HintPriority priority);
+
+/**
+ * Set a hint with normal priority.
+ *
+ * Hints will not be set if there is an existing override hint or environment
+ * variable that takes precedence. You can use SDL_SetHintWithPriority() to
+ * set the hint with override priority instead.
+ *
+ * \param name the hint to set.
+ * \param value the value of the hint variable.
+ * \returns SDL_TRUE if the hint was set, SDL_FALSE otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetHint
+ * \sa SDL_ResetHint
+ * \sa SDL_SetHintWithPriority
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_SetHint(const char *name,
+ const char *value);
+
+/**
+ * Reset a hint to the default value.
+ *
+ * This will reset a hint to the value of the environment variable, or NULL if
+ * the environment isn't set. Callbacks will be called normally with this
+ * change.
+ *
+ * \param name the hint to set.
+ * \returns SDL_TRUE if the hint was set, SDL_FALSE otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetHint
+ * \sa SDL_ResetHints
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ResetHint(const char *name);
+
+/**
+ * Reset all hints to the default values.
+ *
+ * This will reset all hints to the value of the associated environment
+ * variable, or NULL if the environment isn't set. Callbacks will be called
+ * normally with this change.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_ResetHint
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_ResetHints(void);
+
+/**
+ * Get the value of a hint.
+ *
+ * \param name the hint to query.
+ * \returns the string value of a hint or NULL if the hint isn't set.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetHint
+ * \sa SDL_SetHintWithPriority
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetHint(const char *name);
+
+/**
+ * Get the boolean value of a hint variable.
+ *
+ * \param name the name of the hint to get the boolean value from.
+ * \param default_value the value to return if the hint does not exist.
+ * \returns the boolean value of a hint or the provided default value if the
+ * hint does not exist.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetHint
+ * \sa SDL_SetHint
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetHintBoolean(const char *name, SDL_bool default_value);
+
+/**
+ * Type definition of the hint callback function.
+ *
+ * \param userdata what was passed as `userdata` to SDL_AddHintCallback().
+ * \param name what was passed as `name` to SDL_AddHintCallback().
+ * \param oldValue the previous hint value.
+ * \param newValue the new value hint is to be set to.
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ */
+typedef void (SDLCALL *SDL_HintCallback)(void *userdata, const char *name, const char *oldValue, const char *newValue);
+
+/**
+ * Add a function to watch a particular hint.
+ *
+ * \param name the hint to watch.
+ * \param callback an SDL_HintCallback function that will be called when the
+ * hint value changes.
+ * \param userdata a pointer to pass to the callback function.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is **NOT** safe to call this function from two threads at
+ * once.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_DelHintCallback
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_AddHintCallback(const char *name,
+ SDL_HintCallback callback,
+ void *userdata);
+
+/**
+ * Remove a function watching a particular hint.
+ *
+ * \param name the hint being watched.
+ * \param callback an SDL_HintCallback function that will be called when the
+ * hint value changes.
+ * \param userdata a pointer being passed to the callback function.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AddHintCallback
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_DelHintCallback(const char *name,
+ SDL_HintCallback callback,
+ void *userdata);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_hints_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_init.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_init.h
new file mode 100644
index 0000000..6b51816
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_init.h
@@ -0,0 +1,329 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryInit
+ *
+ * SDL subsystem init and quit functions.
+ */
+
+
+#ifndef SDL_init_h_
+#define SDL_init_h_
+
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* As of version 0.5, SDL is loaded dynamically into the application */
+
+/**
+ * Initialization flags for SDL_Init and/or SDL_InitSubSystem
+ *
+ * These are the flags which may be passed to SDL_Init(). You should specify
+ * the subsystems which you will be using in your application.
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ *
+ * \sa SDL_Init
+ * \sa SDL_Quit
+ * \sa SDL_InitSubSystem
+ * \sa SDL_QuitSubSystem
+ * \sa SDL_WasInit
+ */
+typedef Uint32 SDL_InitFlags;
+
+#define SDL_INIT_TIMER 0x00000001u
+#define SDL_INIT_AUDIO 0x00000010u /**< `SDL_INIT_AUDIO` implies `SDL_INIT_EVENTS` */
+#define SDL_INIT_VIDEO 0x00000020u /**< `SDL_INIT_VIDEO` implies `SDL_INIT_EVENTS` */
+#define SDL_INIT_JOYSTICK 0x00000200u /**< `SDL_INIT_JOYSTICK` implies `SDL_INIT_EVENTS`, should be initialized on the same thread as SDL_INIT_VIDEO on Windows if you don't set SDL_HINT_JOYSTICK_THREAD */
+#define SDL_INIT_HAPTIC 0x00001000u
+#define SDL_INIT_GAMEPAD 0x00002000u /**< `SDL_INIT_GAMEPAD` implies `SDL_INIT_JOYSTICK` */
+#define SDL_INIT_EVENTS 0x00004000u
+#define SDL_INIT_SENSOR 0x00008000u /**< `SDL_INIT_SENSOR` implies `SDL_INIT_EVENTS` */
+#define SDL_INIT_CAMERA 0x00010000u /**< `SDL_INIT_CAMERA` implies `SDL_INIT_EVENTS` */
+
+/**
+ * Initialize the SDL library.
+ *
+ * SDL_Init() simply forwards to calling SDL_InitSubSystem(). Therefore, the
+ * two may be used interchangeably. Though for readability of your code
+ * SDL_InitSubSystem() might be preferred.
+ *
+ * The file I/O (for example: SDL_IOFromFile) and threading (SDL_CreateThread)
+ * subsystems are initialized by default. Message boxes
+ * (SDL_ShowSimpleMessageBox) also attempt to work without initializing the
+ * video subsystem, in hopes of being useful in showing an error dialog when
+ * SDL_Init fails. You must specifically initialize other subsystems if you
+ * use them in your application.
+ *
+ * Logging (such as SDL_Log) works without initialization, too.
+ *
+ * `flags` may be any of the following OR'd together:
+ *
+ * - `SDL_INIT_TIMER`: timer subsystem
+ * - `SDL_INIT_AUDIO`: audio subsystem; automatically initializes the events
+ * subsystem
+ * - `SDL_INIT_VIDEO`: video subsystem; automatically initializes the events
+ * subsystem
+ * - `SDL_INIT_JOYSTICK`: joystick subsystem; automatically initializes the
+ * events subsystem
+ * - `SDL_INIT_HAPTIC`: haptic (force feedback) subsystem
+ * - `SDL_INIT_GAMEPAD`: gamepad subsystem; automatically initializes the
+ * joystick subsystem
+ * - `SDL_INIT_EVENTS`: events subsystem
+ * - `SDL_INIT_SENSOR`: sensor subsystem; automatically initializes the events
+ * subsystem
+ * - `SDL_INIT_CAMERA`: camera subsystem; automatically initializes the events
+ * subsystem
+ *
+ * Subsystem initialization is ref-counted, you must call SDL_QuitSubSystem()
+ * for each SDL_InitSubSystem() to correctly shutdown a subsystem manually (or
+ * call SDL_Quit() to force shutdown). If a subsystem is already loaded then
+ * this call will increase the ref-count and return.
+ *
+ * Consider reporting some basic metadata about your application before
+ * calling SDL_Init, using either SDL_SetAppMetadata() or
+ * SDL_SetAppMetadataProperty().
+ *
+ * \param flags subsystem initialization flags.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAppMetadata
+ * \sa SDL_SetAppMetadataProperty
+ * \sa SDL_InitSubSystem
+ * \sa SDL_Quit
+ * \sa SDL_SetMainReady
+ * \sa SDL_WasInit
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_Init(SDL_InitFlags flags);
+
+/**
+ * Compatibility function to initialize the SDL library.
+ *
+ * This function and SDL_Init() are interchangeable.
+ *
+ * \param flags any of the flags used by SDL_Init(); see SDL_Init for details.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_Init
+ * \sa SDL_Quit
+ * \sa SDL_QuitSubSystem
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_InitSubSystem(SDL_InitFlags flags);
+
+/**
+ * Shut down specific SDL subsystems.
+ *
+ * You still need to call SDL_Quit() even if you close all open subsystems
+ * with SDL_QuitSubSystem().
+ *
+ * \param flags any of the flags used by SDL_Init(); see SDL_Init for details.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_InitSubSystem
+ * \sa SDL_Quit
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_QuitSubSystem(SDL_InitFlags flags);
+
+/**
+ * Get a mask of the specified subsystems which are currently initialized.
+ *
+ * \param flags any of the flags used by SDL_Init(); see SDL_Init for details.
+ * \returns a mask of all initialized subsystems if `flags` is 0, otherwise it
+ * returns the initialization status of the specified subsystems.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_Init
+ * \sa SDL_InitSubSystem
+ */
+extern SDL_DECLSPEC SDL_InitFlags SDLCALL SDL_WasInit(SDL_InitFlags flags);
+
+/**
+ * Clean up all initialized subsystems.
+ *
+ * You should call this function even if you have already shutdown each
+ * initialized subsystem with SDL_QuitSubSystem(). It is safe to call this
+ * function even in the case of errors in initialization.
+ *
+ * You can use this function with atexit() to ensure that it is run when your
+ * application is shutdown, but it is not wise to do this from a library or
+ * other dynamically loaded code.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_Init
+ * \sa SDL_QuitSubSystem
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_Quit(void);
+
+/**
+ * Specify basic metadata about your app.
+ *
+ * You can optionally provide metadata about your app to SDL. This is not
+ * required, but strongly encouraged.
+ *
+ * There are several locations where SDL can make use of metadata (an "About"
+ * box in the macOS menu bar, the name of the app can be shown on some audio
+ * mixers, etc). Any piece of metadata can be left as NULL, if a specific
+ * detail doesn't make sense for the app.
+ *
+ * This function should be called as early as possible, before SDL_Init.
+ * Multiple calls to this function are allowed, but various state might not
+ * change once it has been set up with a previous call to this function.
+ *
+ * Passing a NULL removes any previous metadata.
+ *
+ * This is a simplified interface for the most important information. You can
+ * supply significantly more detailed metadata with
+ * SDL_SetAppMetadataProperty().
+ *
+ * \param appname The name of the application ("My Game 2: Bad Guy's
+ * Revenge!").
+ * \param appversion The version of the application ("1.0.0beta5" or a git
+ * hash, or whatever makes sense).
+ * \param appidentifier A unique string in reverse-domain format that
+ * identifies this app ("com.example.mygame2").
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAppMetadataProperty
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetAppMetadata(const char *appname, const char *appversion, const char *appidentifier);
+
+/**
+ * Specify metadata about your app through a set of properties.
+ *
+ * You can optionally provide metadata about your app to SDL. This is not
+ * required, but strongly encouraged.
+ *
+ * There are several locations where SDL can make use of metadata (an "About"
+ * box in the macOS menu bar, the name of the app can be shown on some audio
+ * mixers, etc). Any piece of metadata can be left out, if a specific detail
+ * doesn't make sense for the app.
+ *
+ * This function should be called as early as possible, before SDL_Init.
+ * Multiple calls to this function are allowed, but various state might not
+ * change once it has been set up with a previous call to this function.
+ *
+ * Once set, this metadata can be read using SDL_GetMetadataProperty().
+ *
+ * These are the supported properties:
+ *
+ * - `SDL_PROP_APP_METADATA_NAME_STRING`: The human-readable name of the
+ * application, like "My Game 2: Bad Guy's Revenge!". This will show up
+ * anywhere the OS shows the name of the application separately from window
+ * titles, such as volume control applets, etc. This defaults to "SDL
+ * Application".
+ * - SDL_PROP_APP_METADATA_VERSION_STRING`: The version of the app that is
+ * running; there are no rules on format, so "1.0.3beta2" and "April 22nd,
+ * 2024" and a git hash are all valid options. This has no default.
+ * - `SDL_PROP_APP_METADATA_IDENTIFIER_STRING`: A unique string that
+ * identifies this app. This must be in reverse-domain format, like
+ * "com.example.mygame2". This string is used by desktop compositors to
+ * identify and group windows together, as well as match applications with
+ * associated desktop settings and icons. If you plan to package your
+ * application in a container such as Flatpak, the app ID should match the
+ * name of your Flatpak container as well. This has no default.
+ * - SDL_PROP_APP_METADATA_CREATOR_STRING`: The human-readable name of the
+ * creator/developer/maker of this app, like "MojoWorkshop, LLC"
+ * - SDL_PROP_APP_METADATA_COPYRIGHT_STRING`: The human-readable copyright
+ * notice, like "Copyright (c) 2024 MojoWorkshop, LLC" or whatnot. Keep this
+ * to one line, don't paste a copy of a whole software license in here. This
+ * has no default.
+ * - SDL_PROP_APP_METADATA_URL_STRING`: A URL to the app on the web. Maybe a
+ * product page, or a storefront, or even a GitHub repository, for user's
+ * further information This has no default.
+ * - SDL_PROP_APP_METADATA_TYPE_STRING`: The type of application this is.
+ * Currently this string can be "game" for a video game, "mediaplayer" for a
+ * media player, or generically "application" if nothing else applies.
+ * Future versions of SDL might add new types. This defaults to
+ * "application".
+ *
+ * \param name the name of the metadata property to set.
+ * \param value the value of the property, or NULL to remove that property.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetAppMetadataProperty
+ * \sa SDL_SetAppMetadata
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetAppMetadataProperty(const char *name, const char *value);
+
+#define SDL_PROP_APP_METADATA_NAME_STRING "SDL.app.metadata.name"
+#define SDL_PROP_APP_METADATA_VERSION_STRING "SDL.app.metadata.version"
+#define SDL_PROP_APP_METADATA_IDENTIFIER_STRING "SDL.app.metadata.identifier"
+#define SDL_PROP_APP_METADATA_CREATOR_STRING "SDL.app.metadata.creator"
+#define SDL_PROP_APP_METADATA_COPYRIGHT_STRING "SDL.app.metadata.copyright"
+#define SDL_PROP_APP_METADATA_URL_STRING "SDL.app.metadata.url"
+#define SDL_PROP_APP_METADATA_TYPE_STRING "SDL.app.metadata.type"
+
+/**
+ * Get metadata about your app.
+ *
+ * This returns metadata previously set using SDL_SetAppMetadata() or
+ * SDL_SetAppMetadataProperty(). See SDL_SetAppMetadataProperty() for the list
+ * of available properties and their meanings.
+ *
+ * \param name the name of the metadata property to get.
+ * \returns the current value of the metadata property, or the default if it
+ * is not set, NULL for properties with no default.
+ *
+ * \threadsafety It is safe to call this function from any thread, although
+ * the string returned is not protected and could potentially be
+ * freed if you call SDL_SetAppMetadataProperty() to set that
+ * property from another thread.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetAppMetadata
+ * \sa SDL_SetAppMetadataProperty
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetAppMetadataProperty(const char *name);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_init_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_intrin.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_intrin.h
new file mode 100644
index 0000000..efba11d
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_intrin.h
@@ -0,0 +1,159 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/*
+ * Header file for CPU intrinsics for SDL
+ */
+
+#ifndef SDL_intrin_h_
+#define SDL_intrin_h_
+
+#include
+
+/* Need to do this here because intrin.h has C++ code in it */
+/* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */
+#if defined(_MSC_VER) && (_MSC_VER >= 1500) && (defined(_M_IX86) || defined(_M_X64))
+#ifdef __clang__
+/* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version,
+ so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */
+#ifndef __PRFCHWINTRIN_H
+#define __PRFCHWINTRIN_H
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_m_prefetch(void *__P)
+{
+ __builtin_prefetch (__P, 0, 3 /* _MM_HINT_T0 */);
+}
+#endif /* __PRFCHWINTRIN_H */
+#endif /* __clang__ */
+#include
+
+#elif defined(__MINGW64_VERSION_MAJOR)
+#include
+#if defined(__ARM_NEON) && !defined(SDL_DISABLE_NEON)
+# define SDL_NEON_INTRINSICS 1
+# include
+#endif
+
+#else
+/* altivec.h redefining bool causes a number of problems, see bugs 3993 and 4392, so you need to explicitly define SDL_ENABLE_ALTIVEC to have it included. */
+#if defined(__ALTIVEC__) && defined(SDL_ENABLE_ALTIVEC)
+#define SDL_ALTIVEC_INTRINSICS 1
+#include
+#endif
+#ifndef SDL_DISABLE_NEON
+# ifdef __ARM_NEON
+# define SDL_NEON_INTRINSICS 1
+# include
+# elif defined(SDL_PLATFORM_WINDOWS)
+/* Visual Studio doesn't define __ARM_ARCH, but _M_ARM (if set, always 7), and _M_ARM64 (if set, always 1). */
+# ifdef _M_ARM
+# define SDL_NEON_INTRINSICS 1
+# include
+# include
+# define __ARM_NEON 1 /* Set __ARM_NEON so that it can be used elsewhere, at compile time */
+# endif
+# if defined (_M_ARM64)
+# define SDL_NEON_INTRINSICS 1
+# include
+# include
+# define __ARM_NEON 1 /* Set __ARM_NEON so that it can be used elsewhere, at compile time */
+# define __ARM_ARCH 8
+# endif
+# endif
+#endif
+#endif /* compiler version */
+
+#if defined(__clang__) && defined(__has_attribute)
+# if __has_attribute(target)
+# define SDL_HAS_TARGET_ATTRIBS
+# endif
+#elif defined(__GNUC__) && (__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) /* gcc >= 4.9 */
+# define SDL_HAS_TARGET_ATTRIBS
+#elif defined(__ICC) && __ICC >= 1600
+# define SDL_HAS_TARGET_ATTRIBS
+#endif
+
+#ifdef SDL_HAS_TARGET_ATTRIBS
+# define SDL_TARGETING(x) __attribute__((target(x)))
+#else
+# define SDL_TARGETING(x)
+#endif
+
+#ifdef __loongarch64
+# ifndef SDL_DISABLE_LSX
+# define SDL_LSX_INTRINSICS 1
+# include
+# endif
+# ifndef SDL_DISABLE_LASX
+# define SDL_LASX_INTRINSICS 1
+# include
+# endif
+#endif
+
+#if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)
+# if ((defined(_MSC_VER) && !defined(_M_X64)) || defined(__MMX__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_MMX)
+# define SDL_MMX_INTRINSICS 1
+# include
+# endif
+# if (defined(_MSC_VER) || defined(__SSE__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE)
+# define SDL_SSE_INTRINSICS 1
+# include
+# endif
+# if (defined(_MSC_VER) || defined(__SSE2__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE2)
+# define SDL_SSE2_INTRINSICS 1
+# include
+# endif
+# if (defined(_MSC_VER) || defined(__SSE3__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE3)
+# define SDL_SSE3_INTRINSICS 1
+# include
+# endif
+# if (defined(_MSC_VER) || defined(__SSE4_1__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE4_1)
+# define SDL_SSE4_1_INTRINSICS 1
+# include
+# endif
+# if (defined(_MSC_VER) || defined(__SSE4_2__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE4_2)
+# define SDL_SSE4_2_INTRINSICS 1
+# include
+# endif
+# if defined(__clang__) && (defined(_MSC_VER) || defined(__SCE__)) && !defined(__AVX__) && !defined(SDL_DISABLE_AVX)
+# define SDL_DISABLE_AVX /* see https://reviews.llvm.org/D20291 and https://reviews.llvm.org/D79194 */
+# endif
+# if (defined(_MSC_VER) || defined(__AVX__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(_M_ARM64EC) && !defined(SDL_DISABLE_AVX)
+# define SDL_AVX_INTRINSICS 1
+# include
+# endif
+# if defined(__clang__) && (defined(_MSC_VER) || defined(__SCE__)) && !defined(__AVX2__) && !defined(SDL_DISABLE_AVX2)
+# define SDL_DISABLE_AVX2 /* see https://reviews.llvm.org/D20291 and https://reviews.llvm.org/D79194 */
+# endif
+# if (defined(_MSC_VER) || defined(__AVX2__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(_M_ARM64EC) && !defined(SDL_DISABLE_AVX2)
+# define SDL_AVX2_INTRINSICS 1
+# include
+# endif
+# if defined(__clang__) && (defined(_MSC_VER) || defined(__SCE__)) && !defined(__AVX512F__) && !defined(SDL_DISABLE_AVX512F)
+# define SDL_DISABLE_AVX512F /* see https://reviews.llvm.org/D20291 and https://reviews.llvm.org/D79194 */
+# endif
+# if (defined(_MSC_VER) || defined(__AVX512F__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(_M_ARM64EC) && !defined(SDL_DISABLE_AVX512F)
+# define SDL_AVX512F_INTRINSICS 1
+# include
+# endif
+#endif /* defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86) */
+
+#endif /* SDL_intrin_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_iostream.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_iostream.h
new file mode 100644
index 0000000..430cd3e
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_iostream.h
@@ -0,0 +1,1070 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* WIKI CATEGORY: IOStream */
+
+/**
+ * # CategoryIOStream
+ *
+ * SDL provides an abstract interface for reading and writing data streams. It
+ * offers implementations for files, memory, etc, and the app can provideo
+ * their own implementations, too.
+ *
+ * SDL_IOStream is not related to the standard C++ iostream class, other than
+ * both are abstract interfaces to read/write data.
+ */
+
+#ifndef SDL_iostream_h_
+#define SDL_iostream_h_
+
+#include
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * SDL_IOStream status, set by a read or write operation.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ */
+typedef enum SDL_IOStatus
+{
+ SDL_IO_STATUS_READY, /**< Everything is ready (no errors and not EOF). */
+ SDL_IO_STATUS_ERROR, /**< Read or write I/O error */
+ SDL_IO_STATUS_EOF, /**< End of file */
+ SDL_IO_STATUS_NOT_READY, /**< Non blocking I/O, not ready */
+ SDL_IO_STATUS_READONLY, /**< Tried to write a read-only buffer */
+ SDL_IO_STATUS_WRITEONLY /**< Tried to read a write-only buffer */
+} SDL_IOStatus;
+
+/**
+ * Possible `whence` values for SDL_IOStream seeking.
+ *
+ * These map to the same "whence" concept that `fseek` or `lseek` use in the
+ * standard C runtime.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ */
+typedef enum SDL_IOWhence
+{
+ SDL_IO_SEEK_SET, /**< Seek from the beginning of data */
+ SDL_IO_SEEK_CUR, /**< Seek relative to current read point */
+ SDL_IO_SEEK_END, /**< Seek relative to the end of data */
+} SDL_IOWhence;
+
+/**
+ * The function pointers that drive an SDL_IOStream.
+ *
+ * Applications can provide this struct to SDL_OpenIO() to create their own
+ * implementation of SDL_IOStream. This is not necessarily required, as SDL
+ * already offers several common types of I/O streams, via functions like
+ * SDL_IOFromFile() and SDL_IOFromMem().
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_IOStreamInterface
+{
+ /**
+ * Return the number of bytes in this SDL_IOStream
+ *
+ * \return the total size of the data stream, or -1 on error.
+ */
+ Sint64 (SDLCALL *size)(void *userdata);
+
+ /**
+ * Seek to `offset` relative to `whence`, one of stdio's whence values:
+ * SDL_IO_SEEK_SET, SDL_IO_SEEK_CUR, SDL_IO_SEEK_END
+ *
+ * \return the final offset in the data stream, or -1 on error.
+ */
+ Sint64 (SDLCALL *seek)(void *userdata, Sint64 offset, SDL_IOWhence whence);
+
+ /**
+ * Read up to `size` bytes from the data stream to the area pointed
+ * at by `ptr`.
+ *
+ * On an incomplete read, you should set `*status` to a value from the
+ * SDL_IOStatus enum. You do not have to explicitly set this on
+ * a complete, successful read.
+ *
+ * \return the number of bytes read
+ */
+ size_t (SDLCALL *read)(void *userdata, void *ptr, size_t size, SDL_IOStatus *status);
+
+ /**
+ * Write exactly `size` bytes from the area pointed at by `ptr`
+ * to data stream.
+ *
+ * On an incomplete write, you should set `*status` to a value from the
+ * SDL_IOStatus enum. You do not have to explicitly set this on
+ * a complete, successful write.
+ *
+ * \return the number of bytes written
+ */
+ size_t (SDLCALL *write)(void *userdata, const void *ptr, size_t size, SDL_IOStatus *status);
+
+ /**
+ * Close and free any allocated resources.
+ *
+ * The SDL_IOStream is still destroyed even if this fails, so clean up anything
+ * even if flushing to disk returns an error.
+ *
+ * \return 0 if successful or -1 on write error when flushing data.
+ */
+ int (SDLCALL *close)(void *userdata);
+} SDL_IOStreamInterface;
+
+
+/**
+ * The read/write operation structure.
+ *
+ * This operates as an opaque handle. There are several APIs to create various
+ * types of I/O streams, or an app can supply an SDL_IOStreamInterface to
+ * SDL_OpenIO() to provide their own stream implementation behind this
+ * struct's abstract interface.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_IOStream SDL_IOStream;
+
+
+/**
+ * \name IOFrom functions
+ *
+ * Functions to create SDL_IOStream structures from various data streams.
+ */
+/* @{ */
+
+/**
+ * Use this function to create a new SDL_IOStream structure for reading from
+ * and/or writing to a named file.
+ *
+ * The `mode` string is treated roughly the same as in a call to the C
+ * library's fopen(), even if SDL doesn't happen to use fopen() behind the
+ * scenes.
+ *
+ * Available `mode` strings:
+ *
+ * - "r": Open a file for reading. The file must exist.
+ * - "w": Create an empty file for writing. If a file with the same name
+ * already exists its content is erased and the file is treated as a new
+ * empty file.
+ * - "a": Append to a file. Writing operations append data at the end of the
+ * file. The file is created if it does not exist.
+ * - "r+": Open a file for update both reading and writing. The file must
+ * exist.
+ * - "w+": Create an empty file for both reading and writing. If a file with
+ * the same name already exists its content is erased and the file is
+ * treated as a new empty file.
+ * - "a+": Open a file for reading and appending. All writing operations are
+ * performed at the end of the file, protecting the previous content to be
+ * overwritten. You can reposition (fseek, rewind) the internal pointer to
+ * anywhere in the file for reading, but writing operations will move it
+ * back to the end of file. The file is created if it does not exist.
+ *
+ * **NOTE**: In order to open a file as a binary file, a "b" character has to
+ * be included in the `mode` string. This additional "b" character can either
+ * be appended at the end of the string (thus making the following compound
+ * modes: "rb", "wb", "ab", "r+b", "w+b", "a+b") or be inserted between the
+ * letter and the "+" sign for the mixed modes ("rb+", "wb+", "ab+").
+ * Additional characters may follow the sequence, although they should have no
+ * effect. For example, "t" is sometimes appended to make explicit the file is
+ * a text file.
+ *
+ * This function supports Unicode filenames, but they must be encoded in UTF-8
+ * format, regardless of the underlying operating system.
+ *
+ * In Android, SDL_IOFromFile() can be used to open content:// URIs. As a
+ * fallback, SDL_IOFromFile() will transparently open a matching filename in
+ * the app's `assets`.
+ *
+ * Closing the SDL_IOStream will close SDL's internal file handle.
+ *
+ * The following properties may be set at creation time by SDL:
+ *
+ * - `SDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER`: a pointer, that can be cast
+ * to a win32 `HANDLE`, that this SDL_IOStream is using to access the
+ * filesystem. If the program isn't running on Windows, or SDL used some
+ * other method to access the filesystem, this property will not be set.
+ * - `SDL_PROP_IOSTREAM_STDIO_FILE_POINTER`: a pointer, that can be cast to a
+ * stdio `FILE *`, that this SDL_IOStream is using to access the filesystem.
+ * If SDL used some other method to access the filesystem, this property
+ * will not be set. PLEASE NOTE that if SDL is using a different C runtime
+ * than your app, trying to use this pointer will almost certainly result in
+ * a crash! This is mostly a problem on Windows; make sure you build SDL and
+ * your app with the same compiler and settings to avoid it.
+ * - `SDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER`: a pointer, that can be cast
+ * to an Android NDK `AAsset *`, that this SDL_IOStream is using to access
+ * the filesystem. If SDL used some other method to access the filesystem,
+ * this property will not be set.
+ *
+ * \param file a UTF-8 string representing the filename to open.
+ * \param mode an ASCII string representing the mode to be used for opening
+ * the file.
+ * \returns a pointer to the SDL_IOStream structure that is created or NULL on
+ * failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_CloseIO
+ * \sa SDL_ReadIO
+ * \sa SDL_SeekIO
+ * \sa SDL_TellIO
+ * \sa SDL_WriteIO
+ */
+extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromFile(const char *file, const char *mode);
+
+#define SDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER "SDL.iostream.windows.handle"
+#define SDL_PROP_IOSTREAM_STDIO_FILE_POINTER "SDL.iostream.stdio.file"
+#define SDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER "SDL.iostream.android.aasset"
+
+/**
+ * Use this function to prepare a read-write memory buffer for use with
+ * SDL_IOStream.
+ *
+ * This function sets up an SDL_IOStream struct based on a memory area of a
+ * certain size, for both read and write access.
+ *
+ * This memory buffer is not copied by the SDL_IOStream; the pointer you
+ * provide must remain valid until you close the stream. Closing the stream
+ * will not free the original buffer.
+ *
+ * If you need to make sure the SDL_IOStream never writes to the memory
+ * buffer, you should use SDL_IOFromConstMem() with a read-only buffer of
+ * memory instead.
+ *
+ * \param mem a pointer to a buffer to feed an SDL_IOStream stream.
+ * \param size the buffer size, in bytes.
+ * \returns a pointer to a new SDL_IOStream structure or NULL on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_IOFromConstMem
+ * \sa SDL_CloseIO
+ * \sa SDL_ReadIO
+ * \sa SDL_SeekIO
+ * \sa SDL_TellIO
+ * \sa SDL_WriteIO
+ */
+extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromMem(void *mem, size_t size);
+
+/**
+ * Use this function to prepare a read-only memory buffer for use with
+ * SDL_IOStream.
+ *
+ * This function sets up an SDL_IOStream struct based on a memory area of a
+ * certain size. It assumes the memory area is not writable.
+ *
+ * Attempting to write to this SDL_IOStream stream will report an error
+ * without writing to the memory buffer.
+ *
+ * This memory buffer is not copied by the SDL_IOStream; the pointer you
+ * provide must remain valid until you close the stream. Closing the stream
+ * will not free the original buffer.
+ *
+ * If you need to write to a memory buffer, you should use SDL_IOFromMem()
+ * with a writable buffer of memory instead.
+ *
+ * \param mem a pointer to a read-only buffer to feed an SDL_IOStream stream.
+ * \param size the buffer size, in bytes.
+ * \returns a pointer to a new SDL_IOStream structure or NULL on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_IOFromMem
+ * \sa SDL_CloseIO
+ * \sa SDL_ReadIO
+ * \sa SDL_SeekIO
+ * \sa SDL_TellIO
+ */
+extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromConstMem(const void *mem, size_t size);
+
+/**
+ * Use this function to create an SDL_IOStream that is backed by dynamically
+ * allocated memory.
+ *
+ * This supports the following properties to provide access to the memory and
+ * control over allocations:
+ *
+ * - `SDL_PROP_IOSTREAM_DYNAMIC_MEMORY_POINTER`: a pointer to the internal
+ * memory of the stream. This can be set to NULL to transfer ownership of
+ * the memory to the application, which should free the memory with
+ * SDL_free(). If this is done, the next operation on the stream must be
+ * SDL_CloseIO().
+ * - `SDL_PROP_IOSTREAM_DYNAMIC_CHUNKSIZE_NUMBER`: memory will be allocated in
+ * multiples of this size, defaulting to 1024.
+ *
+ * \returns a pointer to a new SDL_IOStream structure or NULL on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_CloseIO
+ * \sa SDL_ReadIO
+ * \sa SDL_SeekIO
+ * \sa SDL_TellIO
+ * \sa SDL_WriteIO
+ */
+extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromDynamicMem(void);
+
+#define SDL_PROP_IOSTREAM_DYNAMIC_MEMORY_POINTER "SDL.iostream.dynamic.memory"
+#define SDL_PROP_IOSTREAM_DYNAMIC_CHUNKSIZE_NUMBER "SDL.iostream.dynamic.chunksize"
+
+/* @} *//* IOFrom functions */
+
+
+/**
+ * Create a custom SDL_IOStream.
+ *
+ * Applications do not need to use this function unless they are providing
+ * their own SDL_IOStream implementation. If you just need an SDL_IOStream to
+ * read/write a common data source, you should use the built-in
+ * implementations in SDL, like SDL_IOFromFile() or SDL_IOFromMem(), etc.
+ *
+ * You must free the returned pointer with SDL_CloseIO().
+ *
+ * This function makes a copy of `iface` and the caller does not need to keep
+ * this data around after this call.
+ *
+ * \param iface the function pointers that implement this SDL_IOStream.
+ * \param userdata the app-controlled pointer that is passed to iface's
+ * functions when called.
+ * \returns a pointer to the allocated memory on success or NULL on failure;
+ * call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_CloseIO
+ * \sa SDL_IOFromConstMem
+ * \sa SDL_IOFromFile
+ * \sa SDL_IOFromMem
+ */
+extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_OpenIO(const SDL_IOStreamInterface *iface, void *userdata);
+
+/**
+ * Close and free an allocated SDL_IOStream structure.
+ *
+ * SDL_CloseIO() closes and cleans up the SDL_IOStream stream. It releases any
+ * resources used by the stream and frees the SDL_IOStream itself. This
+ * returns 0 on success, or -1 if the stream failed to flush to its output
+ * (e.g. to disk).
+ *
+ * Note that if this fails to flush the stream to disk, this function reports
+ * an error, but the SDL_IOStream is still invalid once this function returns.
+ *
+ * \param context SDL_IOStream structure to close.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenIO
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_CloseIO(SDL_IOStream *context);
+
+/**
+ * Get the properties associated with an SDL_IOStream.
+ *
+ * \param context a pointer to an SDL_IOStream structure.
+ * \returns a valid property ID on success or 0 on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetIOProperties(SDL_IOStream *context);
+
+/**
+ * Query the stream status of an SDL_IOStream.
+ *
+ * This information can be useful to decide if a short read or write was due
+ * to an error, an EOF, or a non-blocking operation that isn't yet ready to
+ * complete.
+ *
+ * An SDL_IOStream's status is only expected to change after a SDL_ReadIO or
+ * SDL_WriteIO call; don't expect it to change if you just call this query
+ * function in a tight loop.
+ *
+ * \param context the SDL_IOStream to query.
+ * \returns an SDL_IOStatus enum with the current state.
+ *
+ * \threadsafety This function should not be called at the same time that
+ * another thread is operating on the same SDL_IOStream.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_IOStatus SDLCALL SDL_GetIOStatus(SDL_IOStream *context);
+
+/**
+ * Use this function to get the size of the data stream in an SDL_IOStream.
+ *
+ * \param context the SDL_IOStream to get the size of the data stream from.
+ * \returns the size of the data stream in the SDL_IOStream on success or a
+ * negative error code on failure; call SDL_GetError() for more
+ * information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetIOSize(SDL_IOStream *context);
+
+/**
+ * Seek within an SDL_IOStream data stream.
+ *
+ * This function seeks to byte `offset`, relative to `whence`.
+ *
+ * `whence` may be any of the following values:
+ *
+ * - `SDL_IO_SEEK_SET`: seek from the beginning of data
+ * - `SDL_IO_SEEK_CUR`: seek relative to current read point
+ * - `SDL_IO_SEEK_END`: seek relative to the end of data
+ *
+ * If this stream can not seek, it will return -1.
+ *
+ * \param context a pointer to an SDL_IOStream structure.
+ * \param offset an offset in bytes, relative to `whence` location; can be
+ * negative.
+ * \param whence any of `SDL_IO_SEEK_SET`, `SDL_IO_SEEK_CUR`,
+ * `SDL_IO_SEEK_END`.
+ * \returns the final offset in the data stream after the seek or a negative
+ * error code on failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_TellIO
+ */
+extern SDL_DECLSPEC Sint64 SDLCALL SDL_SeekIO(SDL_IOStream *context, Sint64 offset, SDL_IOWhence whence);
+
+/**
+ * Determine the current read/write offset in an SDL_IOStream data stream.
+ *
+ * SDL_TellIO is actually a wrapper function that calls the SDL_IOStream's
+ * `seek` method, with an offset of 0 bytes from `SDL_IO_SEEK_CUR`, to
+ * simplify application development.
+ *
+ * \param context an SDL_IOStream data stream object from which to get the
+ * current offset.
+ * \returns the current offset in the stream, or -1 if the information can not
+ * be determined.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SeekIO
+ */
+extern SDL_DECLSPEC Sint64 SDLCALL SDL_TellIO(SDL_IOStream *context);
+
+/**
+ * Read from a data source.
+ *
+ * This function reads up `size` bytes from the data source to the area
+ * pointed at by `ptr`. This function may read less bytes than requested. It
+ * will return zero when the data stream is completely read, or on error. To
+ * determine if there was an error or all data was read, call
+ * SDL_GetIOStatus().
+ *
+ * \param context a pointer to an SDL_IOStream structure.
+ * \param ptr a pointer to a buffer to read data into.
+ * \param size the number of bytes to read from the data source.
+ * \returns the number of bytes read, or 0 on end of file or other failure;
+ * call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_WriteIO
+ * \sa SDL_GetIOStatus
+ */
+extern SDL_DECLSPEC size_t SDLCALL SDL_ReadIO(SDL_IOStream *context, void *ptr, size_t size);
+
+/**
+ * Write to an SDL_IOStream data stream.
+ *
+ * This function writes exactly `size` bytes from the area pointed at by `ptr`
+ * to the stream. If this fails for any reason, it'll return less than `size`
+ * to demonstrate how far the write progressed. On success, it returns `size`.
+ *
+ * On error, this function still attempts to write as much as possible, so it
+ * might return a positive value less than the requested write size.
+ *
+ * The caller can use SDL_GetIOStatus() to determine if the problem is
+ * recoverable, such as a non-blocking write that can simply be retried later,
+ * or a fatal error.
+ *
+ * \param context a pointer to an SDL_IOStream structure.
+ * \param ptr a pointer to a buffer containing data to write.
+ * \param size the number of bytes to write.
+ * \returns the number of bytes written, which will be less than `size` on
+ * failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_IOprintf
+ * \sa SDL_ReadIO
+ * \sa SDL_SeekIO
+ * \sa SDL_GetIOStatus
+ */
+extern SDL_DECLSPEC size_t SDLCALL SDL_WriteIO(SDL_IOStream *context, const void *ptr, size_t size);
+
+/**
+ * Print to an SDL_IOStream data stream.
+ *
+ * This function does formatted printing to the stream.
+ *
+ * \param context a pointer to an SDL_IOStream structure.
+ * \param fmt a printf() style format string.
+ * \param ... additional parameters matching % tokens in the `fmt` string, if
+ * any.
+ * \returns the number of bytes written or 0 on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_IOvprintf
+ * \sa SDL_WriteIO
+ */
+extern SDL_DECLSPEC size_t SDLCALL SDL_IOprintf(SDL_IOStream *context, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2);
+
+/**
+ * Print to an SDL_IOStream data stream.
+ *
+ * This function does formatted printing to the stream.
+ *
+ * \param context a pointer to an SDL_IOStream structure.
+ * \param fmt a printf() style format string.
+ * \param ap a variable argument list.
+ * \returns the number of bytes written or 0 on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_IOprintf
+ * \sa SDL_WriteIO
+ */
+extern SDL_DECLSPEC size_t SDLCALL SDL_IOvprintf(SDL_IOStream *context, SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(2);
+
+/**
+ * Load all the data from an SDL data stream.
+ *
+ * The data is allocated with a zero byte at the end (null terminated) for
+ * convenience. This extra byte is not included in the value reported via
+ * `datasize`.
+ *
+ * The data should be freed with SDL_free().
+ *
+ * \param src the SDL_IOStream to read all available data from.
+ * \param datasize if not NULL, will store the number of bytes read.
+ * \param closeio if SDL_TRUE, calls SDL_CloseIO() on `src` before returning,
+ * even in the case of an error.
+ * \returns the data or NULL on failure; call SDL_GetError() for more
+ * information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_LoadFile
+ */
+extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile_IO(SDL_IOStream *src, size_t *datasize, SDL_bool closeio);
+
+/**
+ * Load all the data from a file path.
+ *
+ * The data is allocated with a zero byte at the end (null terminated) for
+ * convenience. This extra byte is not included in the value reported via
+ * `datasize`.
+ *
+ * The data should be freed with SDL_free().
+ *
+ * \param file the path to read all available data from.
+ * \param datasize if not NULL, will store the number of bytes read.
+ * \returns the data or NULL on failure; call SDL_GetError() for more
+ * information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_LoadFile_IO
+ */
+extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile(const char *file, size_t *datasize);
+
+/**
+ * \name Read endian functions
+ *
+ * Read an item of the specified endianness and return in native format.
+ */
+/* @{ */
+
+/**
+ * Use this function to read a byte from an SDL_IOStream.
+ *
+ * \param src the SDL_IOStream to read from.
+ * \param value a pointer filled in with the data read.
+ * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU8(SDL_IOStream *src, Uint8 *value);
+
+/**
+ * Use this function to read a signed byte from an SDL_IOStream.
+ *
+ * \param src the SDL_IOStream to read from.
+ * \param value a pointer filled in with the data read.
+ * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS8(SDL_IOStream *src, Sint8 *value);
+
+/**
+ * Use this function to read 16 bits of little-endian data from an
+ * SDL_IOStream and return in native format.
+ *
+ * SDL byteswaps the data only if necessary, so the data returned will be in
+ * the native byte order.
+ *
+ * \param src the stream from which to read data.
+ * \param value a pointer filled in with the data read.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU16LE(SDL_IOStream *src, Uint16 *value);
+
+/**
+ * Use this function to read 16 bits of little-endian data from an
+ * SDL_IOStream and return in native format.
+ *
+ * SDL byteswaps the data only if necessary, so the data returned will be in
+ * the native byte order.
+ *
+ * \param src the stream from which to read data.
+ * \param value a pointer filled in with the data read.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS16LE(SDL_IOStream *src, Sint16 *value);
+
+/**
+ * Use this function to read 16 bits of big-endian data from an SDL_IOStream
+ * and return in native format.
+ *
+ * SDL byteswaps the data only if necessary, so the data returned will be in
+ * the native byte order.
+ *
+ * \param src the stream from which to read data.
+ * \param value a pointer filled in with the data read.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU16BE(SDL_IOStream *src, Uint16 *value);
+
+/**
+ * Use this function to read 16 bits of big-endian data from an SDL_IOStream
+ * and return in native format.
+ *
+ * SDL byteswaps the data only if necessary, so the data returned will be in
+ * the native byte order.
+ *
+ * \param src the stream from which to read data.
+ * \param value a pointer filled in with the data read.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS16BE(SDL_IOStream *src, Sint16 *value);
+
+/**
+ * Use this function to read 32 bits of little-endian data from an
+ * SDL_IOStream and return in native format.
+ *
+ * SDL byteswaps the data only if necessary, so the data returned will be in
+ * the native byte order.
+ *
+ * \param src the stream from which to read data.
+ * \param value a pointer filled in with the data read.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU32LE(SDL_IOStream *src, Uint32 *value);
+
+/**
+ * Use this function to read 32 bits of little-endian data from an
+ * SDL_IOStream and return in native format.
+ *
+ * SDL byteswaps the data only if necessary, so the data returned will be in
+ * the native byte order.
+ *
+ * \param src the stream from which to read data.
+ * \param value a pointer filled in with the data read.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS32LE(SDL_IOStream *src, Sint32 *value);
+
+/**
+ * Use this function to read 32 bits of big-endian data from an SDL_IOStream
+ * and return in native format.
+ *
+ * SDL byteswaps the data only if necessary, so the data returned will be in
+ * the native byte order.
+ *
+ * \param src the stream from which to read data.
+ * \param value a pointer filled in with the data read.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU32BE(SDL_IOStream *src, Uint32 *value);
+
+/**
+ * Use this function to read 32 bits of big-endian data from an SDL_IOStream
+ * and return in native format.
+ *
+ * SDL byteswaps the data only if necessary, so the data returned will be in
+ * the native byte order.
+ *
+ * \param src the stream from which to read data.
+ * \param value a pointer filled in with the data read.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS32BE(SDL_IOStream *src, Sint32 *value);
+
+/**
+ * Use this function to read 64 bits of little-endian data from an
+ * SDL_IOStream and return in native format.
+ *
+ * SDL byteswaps the data only if necessary, so the data returned will be in
+ * the native byte order.
+ *
+ * \param src the stream from which to read data.
+ * \param value a pointer filled in with the data read.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU64LE(SDL_IOStream *src, Uint64 *value);
+
+/**
+ * Use this function to read 64 bits of little-endian data from an
+ * SDL_IOStream and return in native format.
+ *
+ * SDL byteswaps the data only if necessary, so the data returned will be in
+ * the native byte order.
+ *
+ * \param src the stream from which to read data.
+ * \param value a pointer filled in with the data read.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS64LE(SDL_IOStream *src, Sint64 *value);
+
+/**
+ * Use this function to read 64 bits of big-endian data from an SDL_IOStream
+ * and return in native format.
+ *
+ * SDL byteswaps the data only if necessary, so the data returned will be in
+ * the native byte order.
+ *
+ * \param src the stream from which to read data.
+ * \param value a pointer filled in with the data read.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadU64BE(SDL_IOStream *src, Uint64 *value);
+
+/**
+ * Use this function to read 64 bits of big-endian data from an SDL_IOStream
+ * and return in native format.
+ *
+ * SDL byteswaps the data only if necessary, so the data returned will be in
+ * the native byte order.
+ *
+ * \param src the stream from which to read data.
+ * \param value a pointer filled in with the data read.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ReadS64BE(SDL_IOStream *src, Sint64 *value);
+/* @} *//* Read endian functions */
+
+/**
+ * \name Write endian functions
+ *
+ * Write an item of native format to the specified endianness.
+ */
+/* @{ */
+
+/**
+ * Use this function to write a byte to an SDL_IOStream.
+ *
+ * \param dst the SDL_IOStream to write to.
+ * \param value the byte value to write.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU8(SDL_IOStream *dst, Uint8 value);
+
+/**
+ * Use this function to write a signed byte to an SDL_IOStream.
+ *
+ * \param dst the SDL_IOStream to write to.
+ * \param value the byte value to write.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS8(SDL_IOStream *dst, Sint8 value);
+
+/**
+ * Use this function to write 16 bits in native format to an SDL_IOStream as
+ * little-endian data.
+ *
+ * SDL byteswaps the data only if necessary, so the application always
+ * specifies native format, and the data written will be in little-endian
+ * format.
+ *
+ * \param dst the stream to which data will be written.
+ * \param value the data to be written, in native format.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU16LE(SDL_IOStream *dst, Uint16 value);
+
+/**
+ * Use this function to write 16 bits in native format to an SDL_IOStream as
+ * little-endian data.
+ *
+ * SDL byteswaps the data only if necessary, so the application always
+ * specifies native format, and the data written will be in little-endian
+ * format.
+ *
+ * \param dst the stream to which data will be written.
+ * \param value the data to be written, in native format.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS16LE(SDL_IOStream *dst, Sint16 value);
+
+/**
+ * Use this function to write 16 bits in native format to an SDL_IOStream as
+ * big-endian data.
+ *
+ * SDL byteswaps the data only if necessary, so the application always
+ * specifies native format, and the data written will be in big-endian format.
+ *
+ * \param dst the stream to which data will be written.
+ * \param value the data to be written, in native format.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU16BE(SDL_IOStream *dst, Uint16 value);
+
+/**
+ * Use this function to write 16 bits in native format to an SDL_IOStream as
+ * big-endian data.
+ *
+ * SDL byteswaps the data only if necessary, so the application always
+ * specifies native format, and the data written will be in big-endian format.
+ *
+ * \param dst the stream to which data will be written.
+ * \param value the data to be written, in native format.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS16BE(SDL_IOStream *dst, Sint16 value);
+
+/**
+ * Use this function to write 32 bits in native format to an SDL_IOStream as
+ * little-endian data.
+ *
+ * SDL byteswaps the data only if necessary, so the application always
+ * specifies native format, and the data written will be in little-endian
+ * format.
+ *
+ * \param dst the stream to which data will be written.
+ * \param value the data to be written, in native format.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU32LE(SDL_IOStream *dst, Uint32 value);
+
+/**
+ * Use this function to write 32 bits in native format to an SDL_IOStream as
+ * little-endian data.
+ *
+ * SDL byteswaps the data only if necessary, so the application always
+ * specifies native format, and the data written will be in little-endian
+ * format.
+ *
+ * \param dst the stream to which data will be written.
+ * \param value the data to be written, in native format.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS32LE(SDL_IOStream *dst, Sint32 value);
+
+/**
+ * Use this function to write 32 bits in native format to an SDL_IOStream as
+ * big-endian data.
+ *
+ * SDL byteswaps the data only if necessary, so the application always
+ * specifies native format, and the data written will be in big-endian format.
+ *
+ * \param dst the stream to which data will be written.
+ * \param value the data to be written, in native format.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU32BE(SDL_IOStream *dst, Uint32 value);
+
+/**
+ * Use this function to write 32 bits in native format to an SDL_IOStream as
+ * big-endian data.
+ *
+ * SDL byteswaps the data only if necessary, so the application always
+ * specifies native format, and the data written will be in big-endian format.
+ *
+ * \param dst the stream to which data will be written.
+ * \param value the data to be written, in native format.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS32BE(SDL_IOStream *dst, Sint32 value);
+
+/**
+ * Use this function to write 64 bits in native format to an SDL_IOStream as
+ * little-endian data.
+ *
+ * SDL byteswaps the data only if necessary, so the application always
+ * specifies native format, and the data written will be in little-endian
+ * format.
+ *
+ * \param dst the stream to which data will be written.
+ * \param value the data to be written, in native format.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU64LE(SDL_IOStream *dst, Uint64 value);
+
+/**
+ * Use this function to write 64 bits in native format to an SDL_IOStream as
+ * little-endian data.
+ *
+ * SDL byteswaps the data only if necessary, so the application always
+ * specifies native format, and the data written will be in little-endian
+ * format.
+ *
+ * \param dst the stream to which data will be written.
+ * \param value the data to be written, in native format.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS64LE(SDL_IOStream *dst, Sint64 value);
+
+/**
+ * Use this function to write 64 bits in native format to an SDL_IOStream as
+ * big-endian data.
+ *
+ * SDL byteswaps the data only if necessary, so the application always
+ * specifies native format, and the data written will be in big-endian format.
+ *
+ * \param dst the stream to which data will be written.
+ * \param value the data to be written, in native format.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteU64BE(SDL_IOStream *dst, Uint64 value);
+
+/**
+ * Use this function to write 64 bits in native format to an SDL_IOStream as
+ * big-endian data.
+ *
+ * SDL byteswaps the data only if necessary, so the application always
+ * specifies native format, and the data written will be in big-endian format.
+ *
+ * \param dst the stream to which data will be written.
+ * \param value the data to be written, in native format.
+ * \returns SDL_TRUE on successful write or SDL_FALSE on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_WriteS64BE(SDL_IOStream *dst, Sint64 value);
+
+/* @} *//* Write endian functions */
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_iostream_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_joystick.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_joystick.h
new file mode 100644
index 0000000..1a17076
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_joystick.h
@@ -0,0 +1,1197 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryJoystick
+ *
+ * SDL joystick support.
+ *
+ * This is the lower-level joystick handling. If you want the simpler option,
+ * where what buttons does what is well-defined, you should use the gamepad
+ * API instead.
+ *
+ * The term "instance_id" is the current instantiation of a joystick device in
+ * the system, if the joystick is removed and then re-inserted then it will
+ * get a new instance_id, instance_id's are monotonically increasing
+ * identifiers of a joystick plugged in.
+ *
+ * The term "player_index" is the number assigned to a player on a specific
+ * controller. For XInput controllers this returns the XInput user index. Many
+ * joysticks will not be able to supply this information.
+ *
+ * SDL_GUID is used as a stable 128-bit identifier for a joystick device that
+ * does not change over time. It identifies class of the device (a X360 wired
+ * controller for example). This identifier is platform dependent.
+ *
+ * In order to use these functions, SDL_Init() must have been called with the
+ * SDL_INIT_JOYSTICK flag. This causes SDL to scan the system for joysticks,
+ * and load appropriate drivers.
+ *
+ * If you would like to receive joystick updates while the application is in
+ * the background, you should set the following hint before calling
+ * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS
+ */
+
+#ifndef SDL_joystick_h_
+#define SDL_joystick_h_
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef SDL_THREAD_SAFETY_ANALYSIS
+/*
+ * This is not an exported symbol from SDL, this is only in the headers to
+ * help Clang's thread safety analysis tools to function. Do not attempt
+ * to access this symbol from your app, it will not work!
+ */
+extern SDL_Mutex *SDL_joystick_lock;
+#endif
+
+/**
+ * The joystick structure used to identify an SDL joystick.
+ *
+ * This is opaque data.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ */
+typedef struct SDL_Joystick SDL_Joystick;
+
+/**
+ * This is a unique ID for a joystick for the time it is connected to the
+ * system, and is never reused for the lifetime of the application.
+ *
+ * If the joystick is disconnected and reconnected, it will get a new ID.
+ *
+ * The ID value starts at 1 and increments from there. The value 0 is an
+ * invalid ID.
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ */
+typedef Uint32 SDL_JoystickID;
+
+/**
+ * An enum of some common joystick types.
+ *
+ * In some cases, SDL can identify a low-level joystick as being a certain
+ * type of device, and will report it through SDL_GetJoystickType (or
+ * SDL_GetJoystickTypeForID).
+ *
+ * This is by no means a complete list of everything that can be plugged into
+ * a computer.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ */
+typedef enum SDL_JoystickType
+{
+ SDL_JOYSTICK_TYPE_UNKNOWN,
+ SDL_JOYSTICK_TYPE_GAMEPAD,
+ SDL_JOYSTICK_TYPE_WHEEL,
+ SDL_JOYSTICK_TYPE_ARCADE_STICK,
+ SDL_JOYSTICK_TYPE_FLIGHT_STICK,
+ SDL_JOYSTICK_TYPE_DANCE_PAD,
+ SDL_JOYSTICK_TYPE_GUITAR,
+ SDL_JOYSTICK_TYPE_DRUM_KIT,
+ SDL_JOYSTICK_TYPE_ARCADE_PAD,
+ SDL_JOYSTICK_TYPE_THROTTLE
+} SDL_JoystickType;
+
+/**
+ * Possible connection states for a joystick device.
+ *
+ * This is used by SDL_GetJoystickConnectionState to report how a device is
+ * connected to the system.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ */
+typedef enum SDL_JoystickConnectionState
+{
+ SDL_JOYSTICK_CONNECTION_INVALID = -1,
+ SDL_JOYSTICK_CONNECTION_UNKNOWN,
+ SDL_JOYSTICK_CONNECTION_WIRED,
+ SDL_JOYSTICK_CONNECTION_WIRELESS
+} SDL_JoystickConnectionState;
+
+/**
+ * The largest value an SDL_Joystick's axis can report.
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_JOYSTICK_AXIS_MIN
+ */
+#define SDL_JOYSTICK_AXIS_MAX 32767
+
+/**
+ * The smallest value an SDL_Joystick's axis can report.
+ *
+ * This is a negative number!
+ *
+ * \since This macro is available since SDL 3.0.0.
+ *
+ * \sa SDL_JOYSTICK_AXIS_MAX
+ */
+#define SDL_JOYSTICK_AXIS_MIN -32768
+
+
+/* Set max recognized G-force from accelerometer
+ See src/joystick/uikit/SDL_sysjoystick.m for notes on why this is needed
+ */
+#define SDL_IPHONE_MAX_GFORCE 5.0
+
+
+/* Function prototypes */
+
+/**
+ * Locking for atomic access to the joystick API.
+ *
+ * The SDL joystick functions are thread-safe, however you can lock the
+ * joysticks while processing to guarantee that the joystick list won't change
+ * and joystick and gamepad events will not be delivered.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_LockJoysticks(void) SDL_ACQUIRE(SDL_joystick_lock);
+
+/**
+ * Unlocking for atomic access to the joystick API.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_UnlockJoysticks(void) SDL_RELEASE(SDL_joystick_lock);
+
+/**
+ * Return whether a joystick is currently connected.
+ *
+ * \returns SDL_TRUE if a joystick is connected, SDL_FALSE otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoysticks
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasJoystick(void);
+
+/**
+ * Get a list of currently connected joysticks.
+ *
+ * \param count a pointer filled in with the number of joysticks returned, may
+ * be NULL.
+ * \returns a 0 terminated array of joystick instance IDs or NULL on failure;
+ * call SDL_GetError() for more information. This should be freed
+ * with SDL_free() when it is no longer needed.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasJoystick
+ * \sa SDL_OpenJoystick
+ */
+extern SDL_DECLSPEC SDL_JoystickID * SDLCALL SDL_GetJoysticks(int *count);
+
+/**
+ * Get the implementation dependent name of a joystick.
+ *
+ * This can be called before any joysticks are opened.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the name of the selected joystick. If no name can be found, this
+ * function returns NULL; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickName
+ * \sa SDL_GetJoysticks
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickNameForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the implementation dependent path of a joystick.
+ *
+ * This can be called before any joysticks are opened.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the path of the selected joystick. If no path can be found, this
+ * function returns NULL; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickPath
+ * \sa SDL_GetJoysticks
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickPathForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the player index of a joystick.
+ *
+ * This can be called before any joysticks are opened.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the player index of a joystick, or -1 if it's not available.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickPlayerIndex
+ * \sa SDL_GetJoysticks
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetJoystickPlayerIndexForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the implementation-dependent GUID of a joystick.
+ *
+ * This can be called before any joysticks are opened.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the GUID of the selected joystick. If called with an invalid
+ * instance_id, this function returns a zero GUID.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickGUID
+ * \sa SDL_GUIDToString
+ */
+extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetJoystickGUIDForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the USB vendor ID of a joystick, if available.
+ *
+ * This can be called before any joysticks are opened. If the vendor ID isn't
+ * available this function returns 0.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the USB vendor ID of the selected joystick. If called with an
+ * invalid instance_id, this function returns 0.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickVendor
+ * \sa SDL_GetJoysticks
+ */
+extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickVendorForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the USB product ID of a joystick, if available.
+ *
+ * This can be called before any joysticks are opened. If the product ID isn't
+ * available this function returns 0.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the USB product ID of the selected joystick. If called with an
+ * invalid instance_id, this function returns 0.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickProduct
+ * \sa SDL_GetJoysticks
+ */
+extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the product version of a joystick, if available.
+ *
+ * This can be called before any joysticks are opened. If the product version
+ * isn't available this function returns 0.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the product version of the selected joystick. If called with an
+ * invalid instance_id, this function returns 0.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickProductVersion
+ * \sa SDL_GetJoysticks
+ */
+extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductVersionForID(SDL_JoystickID instance_id);
+
+/**
+ * Get the type of a joystick, if available.
+ *
+ * This can be called before any joysticks are opened.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns the SDL_JoystickType of the selected joystick. If called with an
+ * invalid instance_id, this function returns
+ * `SDL_JOYSTICK_TYPE_UNKNOWN`.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickType
+ * \sa SDL_GetJoysticks
+ */
+extern SDL_DECLSPEC SDL_JoystickType SDLCALL SDL_GetJoystickTypeForID(SDL_JoystickID instance_id);
+
+/**
+ * Open a joystick for use.
+ *
+ * The joystick subsystem must be initialized before a joystick can be opened
+ * for use.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns a joystick identifier or NULL on failure; call SDL_GetError() for
+ * more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_CloseJoystick
+ */
+extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_OpenJoystick(SDL_JoystickID instance_id);
+
+/**
+ * Get the SDL_Joystick associated with an instance ID, if it has been opened.
+ *
+ * \param instance_id the instance ID to get the SDL_Joystick for.
+ * \returns an SDL_Joystick on success or NULL on failure or if it hasn't been
+ * opened yet; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetJoystickFromID(SDL_JoystickID instance_id);
+
+/**
+ * Get the SDL_Joystick associated with a player index.
+ *
+ * \param player_index the player index to get the SDL_Joystick for.
+ * \returns an SDL_Joystick on success or NULL on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickPlayerIndex
+ * \sa SDL_SetJoystickPlayerIndex
+ */
+extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetJoystickFromPlayerIndex(int player_index);
+
+/**
+ * The structure that describes a virtual joystick touchpad.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_VirtualJoystickDesc
+ */
+typedef struct SDL_VirtualJoystickTouchpadDesc
+{
+ Uint16 nfingers; /**< the number of simultaneous fingers on this touchpad */
+ Uint16 padding[3];
+} SDL_VirtualJoystickTouchpadDesc;
+
+/**
+ * The structure that describes a virtual joystick sensor.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_VirtualJoystickDesc
+ */
+typedef struct SDL_VirtualJoystickSensorDesc
+{
+ SDL_SensorType type; /**< the type of this sensor */
+ float rate; /**< the update frequency of this sensor, may be 0.0f */
+} SDL_VirtualJoystickSensorDesc;
+
+/**
+ * The structure that describes a virtual joystick.
+ *
+ * All elements of this structure are optional and can be left 0.
+ *
+ * \since This struct is available since SDL 3.0.0.
+ *
+ * \sa SDL_AttachVirtualJoystick
+ * \sa SDL_VirtualJoystickSensorDesc
+ * \sa SDL_VirtualJoystickTouchpadDesc
+ */
+typedef struct SDL_VirtualJoystickDesc
+{
+ Uint16 type; /**< `SDL_JoystickType` */
+ Uint16 padding; /**< unused */
+ Uint16 vendor_id; /**< the USB vendor ID of this joystick */
+ Uint16 product_id; /**< the USB product ID of this joystick */
+ Uint16 naxes; /**< the number of axes on this joystick */
+ Uint16 nbuttons; /**< the number of buttons on this joystick */
+ Uint16 nballs; /**< the number of balls on this joystick */
+ Uint16 nhats; /**< the number of hats on this joystick */
+ Uint16 ntouchpads; /**< the number of touchpads on this joystick, requires `touchpads` to point at valid descriptions */
+ Uint16 nsensors; /**< the number of sensors on this joystick, requires `sensors` to point at valid descriptions */
+ Uint16 padding2[2]; /**< unused */
+ Uint32 button_mask; /**< A mask of which buttons are valid for this controller
+ e.g. (1 << SDL_GAMEPAD_BUTTON_SOUTH) */
+ Uint32 axis_mask; /**< A mask of which axes are valid for this controller
+ e.g. (1 << SDL_GAMEPAD_AXIS_LEFTX) */
+ const char *name; /**< the name of the joystick */
+ const SDL_VirtualJoystickTouchpadDesc *touchpads; /**< A pointer to an array of touchpad descriptions, required if `ntouchpads` is > 0 */
+ const SDL_VirtualJoystickSensorDesc *sensors; /**< A pointer to an array of sensor descriptions, required if `nsensors` is > 0 */
+
+ void *userdata; /**< User data pointer passed to callbacks */
+ void (SDLCALL *Update)(void *userdata); /**< Called when the joystick state should be updated */
+ void (SDLCALL *SetPlayerIndex)(void *userdata, int player_index); /**< Called when the player index is set */
+ int (SDLCALL *Rumble)(void *userdata, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble); /**< Implements SDL_RumbleJoystick() */
+ int (SDLCALL *RumbleTriggers)(void *userdata, Uint16 left_rumble, Uint16 right_rumble); /**< Implements SDL_RumbleJoystickTriggers() */
+ int (SDLCALL *SetLED)(void *userdata, Uint8 red, Uint8 green, Uint8 blue); /**< Implements SDL_SetJoystickLED() */
+ int (SDLCALL *SendEffect)(void *userdata, const void *data, int size); /**< Implements SDL_SendJoystickEffect() */
+ int (SDLCALL *SetSensorsEnabled)(void *userdata, SDL_bool enabled); /**< Implements SDL_SetGamepadSensorEnabled() */
+} SDL_VirtualJoystickDesc;
+
+/**
+ * Attach a new virtual joystick.
+ *
+ * \param desc joystick description.
+ * \returns the joystick instance ID, or 0 on failure; call SDL_GetError() for
+ * more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_DetachVirtualJoystick
+ */
+extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_AttachVirtualJoystick(const SDL_VirtualJoystickDesc *desc);
+
+/**
+ * Detach a virtual joystick.
+ *
+ * \param instance_id the joystick instance ID, previously returned from
+ * SDL_AttachVirtualJoystick().
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_AttachVirtualJoystick
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_DetachVirtualJoystick(SDL_JoystickID instance_id);
+
+/**
+ * Query whether or not a joystick is virtual.
+ *
+ * \param instance_id the joystick instance ID.
+ * \returns SDL_TRUE if the joystick is virtual, SDL_FALSE otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_IsJoystickVirtual(SDL_JoystickID instance_id);
+
+/**
+ * Set the state of an axis on an opened virtual joystick.
+ *
+ * Please note that values set here will not be applied until the next call to
+ * SDL_UpdateJoysticks, which can either be called directly, or can be called
+ * indirectly through various other SDL APIs, including, but not limited to
+ * the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout,
+ * SDL_WaitEvent.
+ *
+ * Note that when sending trigger axes, you should scale the value to the full
+ * range of Sint16. For example, a trigger at rest would have the value of
+ * `SDL_JOYSTICK_AXIS_MIN`.
+ *
+ * \param joystick the virtual joystick on which to set state.
+ * \param axis the index of the axis on the virtual joystick to update.
+ * \param value the new value for the specified axis.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetJoystickVirtualAxis(SDL_Joystick *joystick, int axis, Sint16 value);
+
+/**
+ * Generate ball motion on an opened virtual joystick.
+ *
+ * Please note that values set here will not be applied until the next call to
+ * SDL_UpdateJoysticks, which can either be called directly, or can be called
+ * indirectly through various other SDL APIs, including, but not limited to
+ * the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout,
+ * SDL_WaitEvent.
+ *
+ * \param joystick the virtual joystick on which to set state.
+ * \param ball the index of the ball on the virtual joystick to update.
+ * \param xrel the relative motion on the X axis.
+ * \param yrel the relative motion on the Y axis.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetJoystickVirtualBall(SDL_Joystick *joystick, int ball, Sint16 xrel, Sint16 yrel);
+
+/**
+ * Set the state of a button on an opened virtual joystick.
+ *
+ * Please note that values set here will not be applied until the next call to
+ * SDL_UpdateJoysticks, which can either be called directly, or can be called
+ * indirectly through various other SDL APIs, including, but not limited to
+ * the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout,
+ * SDL_WaitEvent.
+ *
+ * \param joystick the virtual joystick on which to set state.
+ * \param button the index of the button on the virtual joystick to update.
+ * \param value the new value for the specified button.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetJoystickVirtualButton(SDL_Joystick *joystick, int button, Uint8 value);
+
+/**
+ * Set the state of a hat on an opened virtual joystick.
+ *
+ * Please note that values set here will not be applied until the next call to
+ * SDL_UpdateJoysticks, which can either be called directly, or can be called
+ * indirectly through various other SDL APIs, including, but not limited to
+ * the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout,
+ * SDL_WaitEvent.
+ *
+ * \param joystick the virtual joystick on which to set state.
+ * \param hat the index of the hat on the virtual joystick to update.
+ * \param value the new value for the specified hat.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetJoystickVirtualHat(SDL_Joystick *joystick, int hat, Uint8 value);
+
+/**
+ * Set touchpad finger state on an opened virtual joystick.
+ *
+ * Please note that values set here will not be applied until the next call to
+ * SDL_UpdateJoysticks, which can either be called directly, or can be called
+ * indirectly through various other SDL APIs, including, but not limited to
+ * the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout,
+ * SDL_WaitEvent.
+ *
+ * \param joystick the virtual joystick on which to set state.
+ * \param touchpad the index of the touchpad on the virtual joystick to
+ * update.
+ * \param finger the index of the finger on the touchpad to set.
+ * \param state `SDL_PRESSED` if the finger is pressed, `SDL_RELEASED` if the
+ * finger is released.
+ * \param x the x coordinate of the finger on the touchpad, normalized 0 to 1,
+ * with the origin in the upper left.
+ * \param y the y coordinate of the finger on the touchpad, normalized 0 to 1,
+ * with the origin in the upper left.
+ * \param pressure the pressure of the finger.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetJoystickVirtualTouchpad(SDL_Joystick *joystick, int touchpad, int finger, Uint8 state, float x, float y, float pressure);
+
+/**
+ * Send a sensor update for an opened virtual joystick.
+ *
+ * Please note that values set here will not be applied until the next call to
+ * SDL_UpdateJoysticks, which can either be called directly, or can be called
+ * indirectly through various other SDL APIs, including, but not limited to
+ * the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout,
+ * SDL_WaitEvent.
+ *
+ * \param joystick the virtual joystick on which to set state.
+ * \param type the type of the sensor on the virtual joystick to update.
+ * \param sensor_timestamp a 64-bit timestamp in nanoseconds associated with
+ * the sensor reading.
+ * \param data the data associated with the sensor reading.
+ * \param num_values the number of values pointed to by `data`.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SendJoystickVirtualSensorData(SDL_Joystick *joystick, SDL_SensorType type, Uint64 sensor_timestamp, const float *data, int num_values);
+
+/**
+ * Get the properties associated with a joystick.
+ *
+ * The following read-only properties are provided by SDL:
+ *
+ * - `SDL_PROP_JOYSTICK_CAP_MONO_LED_BOOLEAN`: true if this joystick has an
+ * LED that has adjustable brightness
+ * - `SDL_PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN`: true if this joystick has an LED
+ * that has adjustable color
+ * - `SDL_PROP_JOYSTICK_CAP_PLAYER_LED_BOOLEAN`: true if this joystick has a
+ * player LED
+ * - `SDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN`: true if this joystick has
+ * left/right rumble
+ * - `SDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN`: true if this joystick has
+ * simple trigger rumble
+ *
+ * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick().
+ * \returns a valid property ID on success or 0 on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetJoystickProperties(SDL_Joystick *joystick);
+
+#define SDL_PROP_JOYSTICK_CAP_MONO_LED_BOOLEAN "SDL.joystick.cap.mono_led"
+#define SDL_PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN "SDL.joystick.cap.rgb_led"
+#define SDL_PROP_JOYSTICK_CAP_PLAYER_LED_BOOLEAN "SDL.joystick.cap.player_led"
+#define SDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN "SDL.joystick.cap.rumble"
+#define SDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN "SDL.joystick.cap.trigger_rumble"
+
+/**
+ * Get the implementation dependent name of a joystick.
+ *
+ * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick().
+ * \returns the name of the selected joystick. If no name can be found, this
+ * function returns NULL; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickNameForID
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickName(SDL_Joystick *joystick);
+
+/**
+ * Get the implementation dependent path of a joystick.
+ *
+ * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick().
+ * \returns the path of the selected joystick. If no path can be found, this
+ * function returns NULL; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickPathForID
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickPath(SDL_Joystick *joystick);
+
+/**
+ * Get the player index of an opened joystick.
+ *
+ * For XInput controllers this returns the XInput user index. Many joysticks
+ * will not be able to supply this information.
+ *
+ * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick().
+ * \returns the player index, or -1 if it's not available.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetJoystickPlayerIndex
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetJoystickPlayerIndex(SDL_Joystick *joystick);
+
+/**
+ * Set the player index of an opened joystick.
+ *
+ * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick().
+ * \param player_index player index to assign to this joystick, or -1 to clear
+ * the player index and turn off player LEDs.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickPlayerIndex
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetJoystickPlayerIndex(SDL_Joystick *joystick, int player_index);
+
+/**
+ * Get the implementation-dependent GUID for the joystick.
+ *
+ * This function requires an open joystick.
+ *
+ * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick().
+ * \returns the GUID of the given joystick. If called on an invalid index,
+ * this function returns a zero GUID; call SDL_GetError() for more
+ * information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickGUIDForID
+ * \sa SDL_GUIDToString
+ */
+extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetJoystickGUID(SDL_Joystick *joystick);
+
+/**
+ * Get the USB vendor ID of an opened joystick, if available.
+ *
+ * If the vendor ID isn't available this function returns 0.
+ *
+ * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick().
+ * \returns the USB vendor ID of the selected joystick, or 0 if unavailable.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickVendorForID
+ */
+extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickVendor(SDL_Joystick *joystick);
+
+/**
+ * Get the USB product ID of an opened joystick, if available.
+ *
+ * If the product ID isn't available this function returns 0.
+ *
+ * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick().
+ * \returns the USB product ID of the selected joystick, or 0 if unavailable.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickProductForID
+ */
+extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProduct(SDL_Joystick *joystick);
+
+/**
+ * Get the product version of an opened joystick, if available.
+ *
+ * If the product version isn't available this function returns 0.
+ *
+ * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick().
+ * \returns the product version of the selected joystick, or 0 if unavailable.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickProductVersionForID
+ */
+extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductVersion(SDL_Joystick *joystick);
+
+/**
+ * Get the firmware version of an opened joystick, if available.
+ *
+ * If the firmware version isn't available this function returns 0.
+ *
+ * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick().
+ * \returns the firmware version of the selected joystick, or 0 if
+ * unavailable.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickFirmwareVersion(SDL_Joystick *joystick);
+
+/**
+ * Get the serial number of an opened joystick, if available.
+ *
+ * Returns the serial number of the joystick, or NULL if it is not available.
+ *
+ * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick().
+ * \returns the serial number of the selected joystick, or NULL if
+ * unavailable.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickSerial(SDL_Joystick *joystick);
+
+/**
+ * Get the type of an opened joystick.
+ *
+ * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick().
+ * \returns the SDL_JoystickType of the selected joystick.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickTypeForID
+ */
+extern SDL_DECLSPEC SDL_JoystickType SDLCALL SDL_GetJoystickType(SDL_Joystick *joystick);
+
+/**
+ * Get the device information encoded in a SDL_GUID structure.
+ *
+ * \param guid the SDL_GUID you wish to get info about.
+ * \param vendor a pointer filled in with the device VID, or 0 if not
+ * available.
+ * \param product a pointer filled in with the device PID, or 0 if not
+ * available.
+ * \param version a pointer filled in with the device version, or 0 if not
+ * available.
+ * \param crc16 a pointer filled in with a CRC used to distinguish different
+ * products with the same VID/PID, or 0 if not available.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickGUIDForID
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_GetJoystickGUIDInfo(SDL_GUID guid, Uint16 *vendor, Uint16 *product, Uint16 *version, Uint16 *crc16);
+
+/**
+ * Get the status of a specified joystick.
+ *
+ * \param joystick the joystick to query.
+ * \returns SDL_TRUE if the joystick has been opened, SDL_FALSE if it has not;
+ * call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_JoystickConnected(SDL_Joystick *joystick);
+
+/**
+ * Get the instance ID of an opened joystick.
+ *
+ * \param joystick an SDL_Joystick structure containing joystick information.
+ * \returns the instance ID of the specified joystick on success or 0 on
+ * failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetJoystickID(SDL_Joystick *joystick);
+
+/**
+ * Get the number of general axis controls on a joystick.
+ *
+ * Often, the directional pad on a game controller will either look like 4
+ * separate buttons or a POV hat, and not axes, but all of this is up to the
+ * device and platform.
+ *
+ * \param joystick an SDL_Joystick structure containing joystick information.
+ * \returns the number of axis controls/number of axes on success or a
+ * negative error code on failure; call SDL_GetError() for more
+ * information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickAxis
+ * \sa SDL_GetNumJoystickBalls
+ * \sa SDL_GetNumJoystickButtons
+ * \sa SDL_GetNumJoystickHats
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickAxes(SDL_Joystick *joystick);
+
+/**
+ * Get the number of trackballs on a joystick.
+ *
+ * Joystick trackballs have only relative motion events associated with them
+ * and their state cannot be polled.
+ *
+ * Most joysticks do not have trackballs.
+ *
+ * \param joystick an SDL_Joystick structure containing joystick information.
+ * \returns the number of trackballs on success or a negative error code on
+ * failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickBall
+ * \sa SDL_GetNumJoystickAxes
+ * \sa SDL_GetNumJoystickButtons
+ * \sa SDL_GetNumJoystickHats
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickBalls(SDL_Joystick *joystick);
+
+/**
+ * Get the number of POV hats on a joystick.
+ *
+ * \param joystick an SDL_Joystick structure containing joystick information.
+ * \returns the number of POV hats on success or a negative error code on
+ * failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickHat
+ * \sa SDL_GetNumJoystickAxes
+ * \sa SDL_GetNumJoystickBalls
+ * \sa SDL_GetNumJoystickButtons
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickHats(SDL_Joystick *joystick);
+
+/**
+ * Get the number of buttons on a joystick.
+ *
+ * \param joystick an SDL_Joystick structure containing joystick information.
+ * \returns the number of buttons on success or a negative error code on
+ * failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetJoystickButton
+ * \sa SDL_GetNumJoystickAxes
+ * \sa SDL_GetNumJoystickBalls
+ * \sa SDL_GetNumJoystickHats
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickButtons(SDL_Joystick *joystick);
+
+/**
+ * Set the state of joystick event processing.
+ *
+ * If joystick events are disabled, you must call SDL_UpdateJoysticks()
+ * yourself and check the state of the joystick when you want joystick
+ * information.
+ *
+ * \param enabled whether to process joystick events or not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_JoystickEventsEnabled
+ * \sa SDL_UpdateJoysticks
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_SetJoystickEventsEnabled(SDL_bool enabled);
+
+/**
+ * Query the state of joystick event processing.
+ *
+ * If joystick events are disabled, you must call SDL_UpdateJoysticks()
+ * yourself and check the state of the joystick when you want joystick
+ * information.
+ *
+ * \returns SDL_TRUE if joystick events are being processed, SDL_FALSE
+ * otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetJoystickEventsEnabled
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_JoystickEventsEnabled(void);
+
+/**
+ * Update the current state of the open joysticks.
+ *
+ * This is called automatically by the event loop if any joystick events are
+ * enabled.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_UpdateJoysticks(void);
+
+/**
+ * Get the current state of an axis control on a joystick.
+ *
+ * SDL makes no promises about what part of the joystick any given axis refers
+ * to. Your game should have some sort of configuration UI to let users
+ * specify what each axis should be bound to. Alternately, SDL's higher-level
+ * Game Controller API makes a great effort to apply order to this lower-level
+ * interface, so you know that a specific axis is the "left thumb stick," etc.
+ *
+ * The value returned by SDL_GetJoystickAxis() is a signed integer (-32768 to
+ * 32767) representing the current position of the axis. It may be necessary
+ * to impose certain tolerances on these values to account for jitter.
+ *
+ * \param joystick an SDL_Joystick structure containing joystick information.
+ * \param axis the axis to query; the axis indices start at index 0.
+ * \returns a 16-bit signed integer representing the current position of the
+ * axis or 0 on failure; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetNumJoystickAxes
+ */
+extern SDL_DECLSPEC Sint16 SDLCALL SDL_GetJoystickAxis(SDL_Joystick *joystick, int axis);
+
+/**
+ * Get the initial state of an axis control on a joystick.
+ *
+ * The state is a value ranging from -32768 to 32767.
+ *
+ * The axis indices start at index 0.
+ *
+ * \param joystick an SDL_Joystick structure containing joystick information.
+ * \param axis the axis to query; the axis indices start at index 0.
+ * \param state upon return, the initial value is supplied here.
+ * \returns SDL_TRUE if this axis has any initial value, or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_GetJoystickAxisInitialState(SDL_Joystick *joystick, int axis, Sint16 *state);
+
+/**
+ * Get the ball axis change since the last poll.
+ *
+ * Trackballs can only return relative motion since the last call to
+ * SDL_GetJoystickBall(), these motion deltas are placed into `dx` and `dy`.
+ *
+ * Most joysticks do not have trackballs.
+ *
+ * \param joystick the SDL_Joystick to query.
+ * \param ball the ball index to query; ball indices start at index 0.
+ * \param dx stores the difference in the x axis position since the last poll.
+ * \param dy stores the difference in the y axis position since the last poll.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetNumJoystickBalls
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetJoystickBall(SDL_Joystick *joystick, int ball, int *dx, int *dy);
+
+/**
+ * Get the current state of a POV hat on a joystick.
+ *
+ * The returned value will be one of the `SDL_HAT_*` values.
+ *
+ * \param joystick an SDL_Joystick structure containing joystick information.
+ * \param hat the hat index to get the state from; indices start at index 0.
+ * \returns the current hat position.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetNumJoystickHats
+ */
+extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetJoystickHat(SDL_Joystick *joystick, int hat);
+
+#define SDL_HAT_CENTERED 0x00u
+#define SDL_HAT_UP 0x01u
+#define SDL_HAT_RIGHT 0x02u
+#define SDL_HAT_DOWN 0x04u
+#define SDL_HAT_LEFT 0x08u
+#define SDL_HAT_RIGHTUP (SDL_HAT_RIGHT|SDL_HAT_UP)
+#define SDL_HAT_RIGHTDOWN (SDL_HAT_RIGHT|SDL_HAT_DOWN)
+#define SDL_HAT_LEFTUP (SDL_HAT_LEFT|SDL_HAT_UP)
+#define SDL_HAT_LEFTDOWN (SDL_HAT_LEFT|SDL_HAT_DOWN)
+
+/**
+ * Get the current state of a button on a joystick.
+ *
+ * \param joystick an SDL_Joystick structure containing joystick information.
+ * \param button the button index to get the state from; indices start at
+ * index 0.
+ * \returns 1 if the specified button is pressed, 0 otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetNumJoystickButtons
+ */
+extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetJoystickButton(SDL_Joystick *joystick, int button);
+
+/**
+ * Start a rumble effect.
+ *
+ * Each call to this function cancels any previous rumble effect, and calling
+ * it with 0 intensity stops any rumbling.
+ *
+ * This function requires you to process SDL events or call
+ * SDL_UpdateJoysticks() to update rumble state.
+ *
+ * \param joystick the joystick to vibrate.
+ * \param low_frequency_rumble the intensity of the low frequency (left)
+ * rumble motor, from 0 to 0xFFFF.
+ * \param high_frequency_rumble the intensity of the high frequency (right)
+ * rumble motor, from 0 to 0xFFFF.
+ * \param duration_ms the duration of the rumble effect, in milliseconds.
+ * \returns 0, or -1 if rumble isn't supported on this joystick.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_RumbleJoystick(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms);
+
+/**
+ * Start a rumble effect in the joystick's triggers.
+ *
+ * Each call to this function cancels any previous trigger rumble effect, and
+ * calling it with 0 intensity stops any rumbling.
+ *
+ * Note that this is rumbling of the _triggers_ and not the game controller as
+ * a whole. This is currently only supported on Xbox One controllers. If you
+ * want the (more common) whole-controller rumble, use SDL_RumbleJoystick()
+ * instead.
+ *
+ * This function requires you to process SDL events or call
+ * SDL_UpdateJoysticks() to update rumble state.
+ *
+ * \param joystick the joystick to vibrate.
+ * \param left_rumble the intensity of the left trigger rumble motor, from 0
+ * to 0xFFFF.
+ * \param right_rumble the intensity of the right trigger rumble motor, from 0
+ * to 0xFFFF.
+ * \param duration_ms the duration of the rumble effect, in milliseconds.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_RumbleJoystick
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_RumbleJoystickTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms);
+
+/**
+ * Update a joystick's LED color.
+ *
+ * An example of a joystick LED is the light on the back of a PlayStation 4's
+ * DualShock 4 controller.
+ *
+ * For joysticks with a single color LED, the maximum of the RGB values will
+ * be used as the LED brightness.
+ *
+ * \param joystick the joystick to update.
+ * \param red the intensity of the red LED.
+ * \param green the intensity of the green LED.
+ * \param blue the intensity of the blue LED.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetJoystickLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue);
+
+/**
+ * Send a joystick specific effect packet.
+ *
+ * \param joystick the joystick to affect.
+ * \param data the data to send to the joystick.
+ * \param size the size of the data to send to the joystick.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SendJoystickEffect(SDL_Joystick *joystick, const void *data, int size);
+
+/**
+ * Close a joystick previously opened with SDL_OpenJoystick().
+ *
+ * \param joystick the joystick device to close.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_OpenJoystick
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_CloseJoystick(SDL_Joystick *joystick);
+
+/**
+ * Get the connection state of a joystick.
+ *
+ * \param joystick the joystick to query.
+ * \returns the connection state on success or
+ * `SDL_JOYSTICK_CONNECTION_INVALID` on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetJoystickConnectionState(SDL_Joystick *joystick);
+
+/**
+ * Get the battery state of a joystick.
+ *
+ * You should never take a battery status as absolute truth. Batteries
+ * (especially failing batteries) are delicate hardware, and the values
+ * reported here are best estimates based on what that hardware reports. It's
+ * not uncommon for older batteries to lose stored power much faster than it
+ * reports, or completely drain when reporting it has 20 percent left, etc.
+ *
+ * \param joystick the joystick to query.
+ * \param percent a pointer filled in with the percentage of battery life
+ * left, between 0 and 100, or NULL to ignore. This will be
+ * filled in with -1 we can't determine a value or there is no
+ * battery.
+ * \returns the current battery state or `SDL_POWERSTATE_ERROR` on failure;
+ * call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetJoystickPowerInfo(SDL_Joystick *joystick, int *percent);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_joystick_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_keyboard.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_keyboard.h
new file mode 100644
index 0000000..07bce75
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_keyboard.h
@@ -0,0 +1,587 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryKeyboard
+ *
+ * SDL keyboard management.
+ */
+
+#ifndef SDL_keyboard_h_
+#define SDL_keyboard_h_
+
+#include
+#include
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * This is a unique ID for a keyboard for the time it is connected to the
+ * system, and is never reused for the lifetime of the application.
+ *
+ * If the keyboard is disconnected and reconnected, it will get a new ID.
+ *
+ * The ID value starts at 1 and increments from there. The value 0 is an
+ * invalid ID.
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ */
+typedef Uint32 SDL_KeyboardID;
+
+/* Function prototypes */
+
+/**
+ * Return whether a keyboard is currently connected.
+ *
+ * \returns SDL_TRUE if a keyboard is connected, SDL_FALSE otherwise.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetKeyboards
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasKeyboard(void);
+
+/**
+ * Get a list of currently connected keyboards.
+ *
+ * Note that this will include any device or virtual driver that includes
+ * keyboard functionality, including some mice, KVM switches, motherboard
+ * power buttons, etc. You should wait for input from a device before you
+ * consider it actively in use.
+ *
+ * \param count a pointer filled in with the number of keyboards returned, may
+ * be NULL.
+ * \returns a 0 terminated array of keyboards instance IDs or NULL on failure;
+ * call SDL_GetError() for more information. This should be freed
+ * with SDL_free() when it is no longer needed.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetKeyboardNameForID
+ * \sa SDL_HasKeyboard
+ */
+extern SDL_DECLSPEC SDL_KeyboardID * SDLCALL SDL_GetKeyboards(int *count);
+
+/**
+ * Get the name of a keyboard.
+ *
+ * This function returns "" if the keyboard doesn't have a name.
+ *
+ * \param instance_id the keyboard instance ID.
+ * \returns the name of the selected keyboard or NULL on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetKeyboards
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetKeyboardNameForID(SDL_KeyboardID instance_id);
+
+/**
+ * Query the window which currently has keyboard focus.
+ *
+ * \returns the window with keyboard focus.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void);
+
+/**
+ * Get a snapshot of the current state of the keyboard.
+ *
+ * The pointer returned is a pointer to an internal SDL array. It will be
+ * valid for the whole lifetime of the application and should not be freed by
+ * the caller.
+ *
+ * A array element with a value of 1 means that the key is pressed and a value
+ * of 0 means that it is not. Indexes into this array are obtained by using
+ * SDL_Scancode values.
+ *
+ * Use SDL_PumpEvents() to update the state array.
+ *
+ * This function gives you the current state after all events have been
+ * processed, so if a key or button has been pressed and released before you
+ * process events, then the pressed state will never show up in the
+ * SDL_GetKeyboardState() calls.
+ *
+ * Note: This function doesn't take into account whether shift has been
+ * pressed or not.
+ *
+ * \param numkeys if non-NULL, receives the length of the returned array.
+ * \returns a pointer to an array of key states.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_PumpEvents
+ * \sa SDL_ResetKeyboard
+ */
+extern SDL_DECLSPEC const Uint8 * SDLCALL SDL_GetKeyboardState(int *numkeys);
+
+/**
+ * Clear the state of the keyboard.
+ *
+ * This function will generate key up events for all pressed keys.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetKeyboardState
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_ResetKeyboard(void);
+
+/**
+ * Get the current key modifier state for the keyboard.
+ *
+ * \returns an OR'd combination of the modifier keys for the keyboard. See
+ * SDL_Keymod for details.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetKeyboardState
+ * \sa SDL_SetModState
+ */
+extern SDL_DECLSPEC SDL_Keymod SDLCALL SDL_GetModState(void);
+
+/**
+ * Set the current key modifier state for the keyboard.
+ *
+ * The inverse of SDL_GetModState(), SDL_SetModState() allows you to impose
+ * modifier key states on your application. Simply pass your desired modifier
+ * states into `modstate`. This value may be a bitwise, OR'd combination of
+ * SDL_Keymod values.
+ *
+ * This does not change the keyboard state, only the key modifier flags that
+ * SDL reports.
+ *
+ * \param modstate the desired SDL_Keymod for the keyboard.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetModState
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_SetModState(SDL_Keymod modstate);
+
+/**
+ * Get the key code corresponding to the given scancode according to a default
+ * en_US keyboard layout.
+ *
+ * See SDL_Keycode for details.
+ *
+ * \param scancode the desired SDL_Scancode to query.
+ * \param modstate the modifier state to use when translating the scancode to
+ * a keycode.
+ * \returns the SDL_Keycode that corresponds to the given SDL_Scancode.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetKeyName
+ * \sa SDL_GetScancodeFromKey
+ */
+extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetDefaultKeyFromScancode(SDL_Scancode scancode, SDL_Keymod modstate);
+
+/**
+ * Get the key code corresponding to the given scancode according to the
+ * current keyboard layout.
+ *
+ * See SDL_Keycode for details.
+ *
+ * \param scancode the desired SDL_Scancode to query.
+ * \param modstate the modifier state to use when translating the scancode to
+ * a keycode.
+ * \returns the SDL_Keycode that corresponds to the given SDL_Scancode.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetDefaultKeyFromScancode
+ * \sa SDL_GetKeyName
+ * \sa SDL_GetScancodeFromKey
+ */
+extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scancode, SDL_Keymod modstate);
+
+/**
+ * Get the scancode corresponding to the given key code according to a default
+ * en_US keyboard layout.
+ *
+ * Note that there may be multiple scancode+modifier states that can generate
+ * this keycode, this will just return the first one found.
+ *
+ * \param key the desired SDL_Keycode to query.
+ * \param modstate a pointer to the modifier state that would be used when the
+ * scancode generates this key, may be NULL.
+ * \returns the SDL_Scancode that corresponds to the given SDL_Keycode.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetScancodeFromKey
+ * \sa SDL_GetScancodeName
+ */
+extern SDL_DECLSPEC SDL_Scancode SDLCALL SDL_GetDefaultScancodeFromKey(SDL_Keycode key, SDL_Keymod *modstate);
+
+/**
+ * Get the scancode corresponding to the given key code according to the
+ * current keyboard layout.
+ *
+ * Note that there may be multiple scancode+modifier states that can generate
+ * this keycode, this will just return the first one found.
+ *
+ * \param key the desired SDL_Keycode to query.
+ * \param modstate a pointer to the modifier state that would be used when the
+ * scancode generates this key, may be NULL.
+ * \returns the SDL_Scancode that corresponds to the given SDL_Keycode.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetDefaultScancodeFromKey
+ * \sa SDL_GetKeyFromScancode
+ * \sa SDL_GetScancodeName
+ */
+extern SDL_DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromKey(SDL_Keycode key, SDL_Keymod *modstate);
+
+/**
+ * Set a human-readable name for a scancode.
+ *
+ * \param scancode the desired SDL_Scancode.
+ * \param name the name to use for the scancode, encoded as UTF-8. The string
+ * is not copied, so the pointer given to this function must stay
+ * valid while SDL is being used.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetScancodeName
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetScancodeName(SDL_Scancode scancode, const char *name);
+
+/**
+ * Get a human-readable name for a scancode.
+ *
+ * **Warning**: The returned name is by design not stable across platforms,
+ * e.g. the name for `SDL_SCANCODE_LGUI` is "Left GUI" under Linux but "Left
+ * Windows" under Microsoft Windows, and some scancodes like
+ * `SDL_SCANCODE_NONUSBACKSLASH` don't have any name at all. There are even
+ * scancodes that share names, e.g. `SDL_SCANCODE_RETURN` and
+ * `SDL_SCANCODE_RETURN2` (both called "Return"). This function is therefore
+ * unsuitable for creating a stable cross-platform two-way mapping between
+ * strings and scancodes.
+ *
+ * \param scancode the desired SDL_Scancode to query.
+ * \returns a pointer to the name for the scancode. If the scancode doesn't
+ * have a name this function returns an empty string ("").
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetScancodeFromKey
+ * \sa SDL_GetScancodeFromName
+ * \sa SDL_SetScancodeName
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetScancodeName(SDL_Scancode scancode);
+
+/**
+ * Get a scancode from a human-readable name.
+ *
+ * \param name the human-readable scancode name.
+ * \returns the SDL_Scancode, or `SDL_SCANCODE_UNKNOWN` if the name wasn't
+ * recognized; call SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetKeyFromName
+ * \sa SDL_GetScancodeFromKey
+ * \sa SDL_GetScancodeName
+ */
+extern SDL_DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromName(const char *name);
+
+/**
+ * Get a human-readable name for a key.
+ *
+ * Both lowercase and uppercase alphabetic keycodes have uppercase names, e.g.
+ * SDL_Keycode 'a' and 'A' both have the name "A".
+ *
+ * If the key doesn't have a name, this function returns an empty string ("").
+ *
+ * \param key the desired SDL_Keycode to query.
+ * \returns a UTF-8 encoded string of the key name.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetKeyFromName
+ * \sa SDL_GetKeyFromScancode
+ * \sa SDL_GetScancodeFromKey
+ */
+extern SDL_DECLSPEC const char * SDLCALL SDL_GetKeyName(SDL_Keycode key);
+
+/**
+ * Get a key code from a human-readable name.
+ *
+ * \param name the human-readable key name.
+ * \returns key code, or `SDLK_UNKNOWN` if the name wasn't recognized; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetKeyFromScancode
+ * \sa SDL_GetKeyName
+ * \sa SDL_GetScancodeFromName
+ */
+extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromName(const char *name);
+
+/**
+ * Start accepting Unicode text input events in a window.
+ *
+ * This function will enable text input (SDL_EVENT_TEXT_INPUT and
+ * SDL_EVENT_TEXT_EDITING events) in the specified window. Please use this
+ * function paired with SDL_StopTextInput().
+ *
+ * Text input events are not received by default.
+ *
+ * On some platforms using this function shows the screen keyboard.
+ *
+ * \param window the window to enable text input.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetTextInputArea
+ * \sa SDL_StartTextInputWithProperties
+ * \sa SDL_StopTextInput
+ * \sa SDL_TextInputActive
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_StartTextInput(SDL_Window *window);
+
+/**
+ * Text input type.
+ *
+ * These are the valid values for SDL_PROP_TEXTINPUT_TYPE_NUMBER. Not every
+ * value is valid on every platform, but where a value isn't supported, a
+ * reasonable fallback will be used.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ *
+ * \sa SDL_StartTextInputWithProperties
+ */
+typedef enum SDL_TextInputType
+{
+ SDL_TEXTINPUT_TYPE_TEXT, /**< The input is text */
+ SDL_TEXTINPUT_TYPE_TEXT_NAME, /**< The input is a person's name */
+ SDL_TEXTINPUT_TYPE_TEXT_EMAIL, /**< The input is an e-mail address */
+ SDL_TEXTINPUT_TYPE_TEXT_USERNAME, /**< The input is a username */
+ SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_HIDDEN, /**< The input is a secure password that is hidden */
+ SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_VISIBLE, /**< The input is a secure password that is visible */
+ SDL_TEXTINPUT_TYPE_NUMBER, /**< The input is a number */
+ SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_HIDDEN, /**< The input is a secure PIN that is hidden */
+ SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_VISIBLE /**< The input is a secure PIN that is visible */
+} SDL_TextInputType;
+
+/**
+ * Auto capitalization type.
+ *
+ * These are the valid values for
+ * SDL_PROP_TEXTINPUT_AUTOCAPITALIZATION_NUMBER. Not every value is valid on
+ * every platform, but where a value isn't supported, a reasonable fallback
+ * will be used.
+ *
+ * \since This enum is available since SDL 3.0.0.
+ *
+ * \sa SDL_StartTextInputWithProperties
+ */
+typedef enum SDL_Capitalization
+{
+ SDL_CAPITALIZE_NONE, /**< No auto-capitalization will be done */
+ SDL_CAPITALIZE_SENTENCES, /**< The first letter of sentences will be capitalized */
+ SDL_CAPITALIZE_WORDS, /**< The first letter of words will be capitalized */
+ SDL_CAPITALIZE_LETTERS /**< All letters will be capitalized */
+} SDL_Capitalization;
+
+/**
+ * Start accepting Unicode text input events in a window, with properties
+ * describing the input.
+ *
+ * This function will enable text input (SDL_EVENT_TEXT_INPUT and
+ * SDL_EVENT_TEXT_EDITING events) in the specified window. Please use this
+ * function paired with SDL_StopTextInput().
+ *
+ * Text input events are not received by default.
+ *
+ * On some platforms using this function shows the screen keyboard.
+ *
+ * These are the supported properties:
+ *
+ * - `SDL_PROP_TEXTINPUT_TYPE_NUMBER` - an SDL_TextInputType value that
+ * describes text being input, defaults to SDL_TEXTINPUT_TYPE_TEXT.
+ * - `SDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER` - an SDL_Capitalization value
+ * that describes how text should be capitalized, defaults to
+ * SDL_CAPITALIZE_SENTENCES for normal text entry, SDL_CAPITALIZE_WORDS for
+ * SDL_TEXTINPUT_TYPE_TEXT_NAME, and SDL_CAPITALIZE_NONE for e-mail
+ * addresses, usernames, and passwords.
+ * - `SDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN` - true to enable auto completion
+ * and auto correction, defaults to SDL_TRUE.
+ * - `SDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN` - true if multiple lines of text
+ * are allowed. This defaults to SDL_TRUE if SDL_HINT_RETURN_KEY_HIDES_IME
+ * is "0" or is not set, and defaults to SDL_FALSE if
+ * SDL_HINT_RETURN_KEY_HIDES_IME is "1".
+ *
+ * On Android you can directly specify the input type:
+ *
+ * - `SDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER` - the text input type to
+ * use, overriding other properties. This is documented at
+ * https://developer.android.com/reference/android/text/InputType
+ *
+ * \param window the window to enable text input.
+ * \param props the properties to use.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetTextInputArea
+ * \sa SDL_StartTextInput
+ * \sa SDL_StopTextInput
+ * \sa SDL_TextInputActive
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_StartTextInputWithProperties(SDL_Window *window, SDL_PropertiesID props);
+
+#define SDL_PROP_TEXTINPUT_TYPE_NUMBER "SDL.textinput.type"
+#define SDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER "SDL.textinput.capitalization"
+#define SDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN "SDL.textinput.autocorrect"
+#define SDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN "SDL.textinput.multiline"
+#define SDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER "SDL.textinput.android.inputtype"
+
+/**
+ * Check whether or not Unicode text input events are enabled for a window.
+ *
+ * \param window the window to check.
+ * \returns SDL_TRUE if text input events are enabled else SDL_FALSE.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_StartTextInput
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_TextInputActive(SDL_Window *window);
+
+/**
+ * Stop receiving any text input events in a window.
+ *
+ * If SDL_StartTextInput() showed the screen keyboard, this function will hide
+ * it.
+ *
+ * \param window the window to disable text input.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_StartTextInput
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_StopTextInput(SDL_Window *window);
+
+/**
+ * Dismiss the composition window/IME without disabling the subsystem.
+ *
+ * \param window the window to affect.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_StartTextInput
+ * \sa SDL_StopTextInput
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_ClearComposition(SDL_Window *window);
+
+/**
+ * Set the area used to type Unicode text input.
+ *
+ * Native input methods may place a window with word suggestions near the
+ * cursor, without covering the text being entered.
+ *
+ * \param window the window for which to set the text input area.
+ * \param rect the SDL_Rect representing the text input area, in window
+ * coordinates, or NULL to clear it.
+ * \param cursor the offset of the current cursor location relative to
+ * `rect->x`, in window coordinates.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetTextInputArea
+ * \sa SDL_StartTextInput
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_SetTextInputArea(SDL_Window *window, const SDL_Rect *rect, int cursor);
+
+/**
+ * Get the area used to type Unicode text input.
+ *
+ * This returns the values previously set by SDL_SetTextInputArea().
+ *
+ * \param window the window for which to query the text input area.
+ * \param rect a pointer to an SDL_Rect filled in with the text input area,
+ * may be NULL.
+ * \param cursor a pointer to the offset of the current cursor location
+ * relative to `rect->x`, may be NULL.
+ * \returns 0 on success or a negative error code on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_SetTextInputArea
+ */
+extern SDL_DECLSPEC int SDLCALL SDL_GetTextInputArea(SDL_Window *window, SDL_Rect *rect, int *cursor);
+
+/**
+ * Check whether the platform has screen keyboard support.
+ *
+ * \returns SDL_TRUE if the platform has some screen keyboard support or
+ * SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_StartTextInput
+ * \sa SDL_ScreenKeyboardShown
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasScreenKeyboardSupport(void);
+
+/**
+ * Check whether the screen keyboard is shown for given window.
+ *
+ * \param window the window for which screen keyboard should be queried.
+ * \returns SDL_TRUE if screen keyboard is shown or SDL_FALSE if not.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_HasScreenKeyboardSupport
+ */
+extern SDL_DECLSPEC SDL_bool SDLCALL SDL_ScreenKeyboardShown(SDL_Window *window);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_keyboard_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_keycode.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_keycode.h
new file mode 100644
index 0000000..2d03a3d
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_keycode.h
@@ -0,0 +1,326 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryKeycode
+ *
+ * Defines constants which identify keyboard keys and modifiers.
+ */
+
+#ifndef SDL_keycode_h_
+#define SDL_keycode_h_
+
+#include
+#include
+
+/**
+ * The SDL virtual key representation.
+ *
+ * Values of this type are used to represent keyboard keys using the current
+ * layout of the keyboard. These values include Unicode values representing
+ * the unmodified character that would be generated by pressing the key, or an
+ * `SDLK_*` constant for those keys that do not generate characters.
+ *
+ * A special exception is the number keys at the top of the keyboard which map
+ * to SDLK_0...SDLK_9 on AZERTY layouts.
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ */
+typedef Uint32 SDL_Keycode;
+
+#define SDLK_SCANCODE_MASK (1u<<30)
+#define SDL_SCANCODE_TO_KEYCODE(X) (X | SDLK_SCANCODE_MASK)
+#define SDLK_UNKNOWN 0x00000000u /* 0 */
+#define SDLK_RETURN 0x0000000du /* '\r' */
+#define SDLK_ESCAPE 0x0000001bu /* '\x1B' */
+#define SDLK_BACKSPACE 0x00000008u /* '\b' */
+#define SDLK_TAB 0x00000009u /* '\t' */
+#define SDLK_SPACE 0x00000020u /* ' ' */
+#define SDLK_EXCLAIM 0x00000021u /* '!' */
+#define SDLK_DBLAPOSTROPHE 0x00000022u /* '"' */
+#define SDLK_HASH 0x00000023u /* '#' */
+#define SDLK_DOLLAR 0x00000024u /* '$' */
+#define SDLK_PERCENT 0x00000025u /* '%' */
+#define SDLK_AMPERSAND 0x00000026u /* '&' */
+#define SDLK_APOSTROPHE 0x00000027u /* '\'' */
+#define SDLK_LEFTPAREN 0x00000028u /* '(' */
+#define SDLK_RIGHTPAREN 0x00000029u /* ')' */
+#define SDLK_ASTERISK 0x0000002au /* '*' */
+#define SDLK_PLUS 0x0000002bu /* '+' */
+#define SDLK_COMMA 0x0000002cu /* ',' */
+#define SDLK_MINUS 0x0000002du /* '-' */
+#define SDLK_PERIOD 0x0000002eu /* '.' */
+#define SDLK_SLASH 0x0000002fu /* '/' */
+#define SDLK_0 0x00000030u /* '0' */
+#define SDLK_1 0x00000031u /* '1' */
+#define SDLK_2 0x00000032u /* '2' */
+#define SDLK_3 0x00000033u /* '3' */
+#define SDLK_4 0x00000034u /* '4' */
+#define SDLK_5 0x00000035u /* '5' */
+#define SDLK_6 0x00000036u /* '6' */
+#define SDLK_7 0x00000037u /* '7' */
+#define SDLK_8 0x00000038u /* '8' */
+#define SDLK_9 0x00000039u /* '9' */
+#define SDLK_COLON 0x0000003au /* ':' */
+#define SDLK_SEMICOLON 0x0000003bu /* ';' */
+#define SDLK_LESS 0x0000003cu /* '<' */
+#define SDLK_EQUALS 0x0000003du /* '=' */
+#define SDLK_GREATER 0x0000003eu /* '>' */
+#define SDLK_QUESTION 0x0000003fu /* '?' */
+#define SDLK_AT 0x00000040u /* '@' */
+#define SDLK_LEFTBRACKET 0x0000005bu /* '[' */
+#define SDLK_BACKSLASH 0x0000005cu /* '\\' */
+#define SDLK_RIGHTBRACKET 0x0000005du /* ']' */
+#define SDLK_CARET 0x0000005eu /* '^' */
+#define SDLK_UNDERSCORE 0x0000005fu /* '_' */
+#define SDLK_GRAVE 0x00000060u /* '`' */
+#define SDLK_A 0x00000061u /* 'a' */
+#define SDLK_B 0x00000062u /* 'b' */
+#define SDLK_C 0x00000063u /* 'c' */
+#define SDLK_D 0x00000064u /* 'd' */
+#define SDLK_E 0x00000065u /* 'e' */
+#define SDLK_F 0x00000066u /* 'f' */
+#define SDLK_G 0x00000067u /* 'g' */
+#define SDLK_H 0x00000068u /* 'h' */
+#define SDLK_I 0x00000069u /* 'i' */
+#define SDLK_J 0x0000006au /* 'j' */
+#define SDLK_K 0x0000006bu /* 'k' */
+#define SDLK_L 0x0000006cu /* 'l' */
+#define SDLK_M 0x0000006du /* 'm' */
+#define SDLK_N 0x0000006eu /* 'n' */
+#define SDLK_O 0x0000006fu /* 'o' */
+#define SDLK_P 0x00000070u /* 'p' */
+#define SDLK_Q 0x00000071u /* 'q' */
+#define SDLK_R 0x00000072u /* 'r' */
+#define SDLK_S 0x00000073u /* 's' */
+#define SDLK_T 0x00000074u /* 't' */
+#define SDLK_U 0x00000075u /* 'u' */
+#define SDLK_V 0x00000076u /* 'v' */
+#define SDLK_W 0x00000077u /* 'w' */
+#define SDLK_X 0x00000078u /* 'x' */
+#define SDLK_Y 0x00000079u /* 'y' */
+#define SDLK_Z 0x0000007au /* 'z' */
+#define SDLK_LEFTBRACE 0x0000007bu /* '{' */
+#define SDLK_PIPE 0x0000007cu /* '|' */
+#define SDLK_RIGHTBRACE 0x0000007du /* '}' */
+#define SDLK_TILDE 0x0000007eu /* '~' */
+#define SDLK_DELETE 0x0000007fu /* '\x7F' */
+#define SDLK_PLUSMINUS 0x000000b1u /* '±' */
+#define SDLK_CAPSLOCK 0x40000039u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK) */
+#define SDLK_F1 0x4000003au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1) */
+#define SDLK_F2 0x4000003bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2) */
+#define SDLK_F3 0x4000003cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3) */
+#define SDLK_F4 0x4000003du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4) */
+#define SDLK_F5 0x4000003eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5) */
+#define SDLK_F6 0x4000003fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6) */
+#define SDLK_F7 0x40000040u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7) */
+#define SDLK_F8 0x40000041u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8) */
+#define SDLK_F9 0x40000042u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9) */
+#define SDLK_F10 0x40000043u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10) */
+#define SDLK_F11 0x40000044u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11) */
+#define SDLK_F12 0x40000045u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12) */
+#define SDLK_PRINTSCREEN 0x40000046u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRINTSCREEN) */
+#define SDLK_SCROLLLOCK 0x40000047u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SCROLLLOCK) */
+#define SDLK_PAUSE 0x40000048u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAUSE) */
+#define SDLK_INSERT 0x40000049u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT) */
+#define SDLK_HOME 0x4000004au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME) */
+#define SDLK_PAGEUP 0x4000004bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP) */
+#define SDLK_END 0x4000004du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END) */
+#define SDLK_PAGEDOWN 0x4000004eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN) */
+#define SDLK_RIGHT 0x4000004fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT) */
+#define SDLK_LEFT 0x40000050u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT) */
+#define SDLK_DOWN 0x40000051u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN) */
+#define SDLK_UP 0x40000052u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP) */
+#define SDLK_NUMLOCKCLEAR 0x40000053u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_NUMLOCKCLEAR) */
+#define SDLK_KP_DIVIDE 0x40000054u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DIVIDE) */
+#define SDLK_KP_MULTIPLY 0x40000055u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MULTIPLY) */
+#define SDLK_KP_MINUS 0x40000056u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MINUS) */
+#define SDLK_KP_PLUS 0x40000057u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUS) */
+#define SDLK_KP_ENTER 0x40000058u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_ENTER) */
+#define SDLK_KP_1 0x40000059u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_1) */
+#define SDLK_KP_2 0x4000005au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_2) */
+#define SDLK_KP_3 0x4000005bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_3) */
+#define SDLK_KP_4 0x4000005cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_4) */
+#define SDLK_KP_5 0x4000005du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_5) */
+#define SDLK_KP_6 0x4000005eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_6) */
+#define SDLK_KP_7 0x4000005fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_7) */
+#define SDLK_KP_8 0x40000060u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_8) */
+#define SDLK_KP_9 0x40000061u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_9) */
+#define SDLK_KP_0 0x40000062u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0) */
+#define SDLK_KP_PERIOD 0x40000063u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERIOD) */
+#define SDLK_APPLICATION 0x40000065u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APPLICATION) */
+#define SDLK_POWER 0x40000066u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_POWER) */
+#define SDLK_KP_EQUALS 0x40000067u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALS) */
+#define SDLK_F13 0x40000068u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F13) */
+#define SDLK_F14 0x40000069u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F14) */
+#define SDLK_F15 0x4000006au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F15) */
+#define SDLK_F16 0x4000006bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F16) */
+#define SDLK_F17 0x4000006cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F17) */
+#define SDLK_F18 0x4000006du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F18) */
+#define SDLK_F19 0x4000006eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F19) */
+#define SDLK_F20 0x4000006fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F20) */
+#define SDLK_F21 0x40000070u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F21) */
+#define SDLK_F22 0x40000071u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F22) */
+#define SDLK_F23 0x40000072u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F23) */
+#define SDLK_F24 0x40000073u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F24) */
+#define SDLK_EXECUTE 0x40000074u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXECUTE) */
+#define SDLK_HELP 0x40000075u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HELP) */
+#define SDLK_MENU 0x40000076u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MENU) */
+#define SDLK_SELECT 0x40000077u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SELECT) */
+#define SDLK_STOP 0x40000078u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_STOP) */
+#define SDLK_AGAIN 0x40000079u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AGAIN) */
+#define SDLK_UNDO 0x4000007au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UNDO) */
+#define SDLK_CUT 0x4000007bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CUT) */
+#define SDLK_COPY 0x4000007cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COPY) */
+#define SDLK_PASTE 0x4000007du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PASTE) */
+#define SDLK_FIND 0x4000007eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FIND) */
+#define SDLK_MUTE 0x4000007fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MUTE) */
+#define SDLK_VOLUMEUP 0x40000080u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEUP) */
+#define SDLK_VOLUMEDOWN 0x40000081u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEDOWN) */
+#define SDLK_KP_COMMA 0x40000085u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COMMA) */
+#define SDLK_KP_EQUALSAS400 0x40000086u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALSAS400) */
+#define SDLK_ALTERASE 0x40000099u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ALTERASE) */
+#define SDLK_SYSREQ 0x4000009au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SYSREQ) */
+#define SDLK_CANCEL 0x4000009bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CANCEL) */
+#define SDLK_CLEAR 0x4000009cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEAR) */
+#define SDLK_PRIOR 0x4000009du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRIOR) */
+#define SDLK_RETURN2 0x4000009eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RETURN2) */
+#define SDLK_SEPARATOR 0x4000009fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SEPARATOR) */
+#define SDLK_OUT 0x400000a0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OUT) */
+#define SDLK_OPER 0x400000a1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OPER) */
+#define SDLK_CLEARAGAIN 0x400000a2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEARAGAIN) */
+#define SDLK_CRSEL 0x400000a3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CRSEL) */
+#define SDLK_EXSEL 0x400000a4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXSEL) */
+#define SDLK_KP_00 0x400000b0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_00) */
+#define SDLK_KP_000 0x400000b1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_000) */
+#define SDLK_THOUSANDSSEPARATOR 0x400000b2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_THOUSANDSSEPARATOR) */
+#define SDLK_DECIMALSEPARATOR 0x400000b3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DECIMALSEPARATOR) */
+#define SDLK_CURRENCYUNIT 0x400000b4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYUNIT) */
+#define SDLK_CURRENCYSUBUNIT 0x400000b5u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYSUBUNIT) */
+#define SDLK_KP_LEFTPAREN 0x400000b6u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTPAREN) */
+#define SDLK_KP_RIGHTPAREN 0x400000b7u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTPAREN) */
+#define SDLK_KP_LEFTBRACE 0x400000b8u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTBRACE) */
+#define SDLK_KP_RIGHTBRACE 0x400000b9u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTBRACE) */
+#define SDLK_KP_TAB 0x400000bau /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_TAB) */
+#define SDLK_KP_BACKSPACE 0x400000bbu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BACKSPACE) */
+#define SDLK_KP_A 0x400000bcu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_A) */
+#define SDLK_KP_B 0x400000bdu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_B) */
+#define SDLK_KP_C 0x400000beu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_C) */
+#define SDLK_KP_D 0x400000bfu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_D) */
+#define SDLK_KP_E 0x400000c0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_E) */
+#define SDLK_KP_F 0x400000c1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_F) */
+#define SDLK_KP_XOR 0x400000c2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_XOR) */
+#define SDLK_KP_POWER 0x400000c3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_POWER) */
+#define SDLK_KP_PERCENT 0x400000c4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERCENT) */
+#define SDLK_KP_LESS 0x400000c5u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LESS) */
+#define SDLK_KP_GREATER 0x400000c6u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_GREATER) */
+#define SDLK_KP_AMPERSAND 0x400000c7u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AMPERSAND) */
+#define SDLK_KP_DBLAMPERSAND 0x400000c8u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLAMPERSAND) */
+#define SDLK_KP_VERTICALBAR 0x400000c9u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_VERTICALBAR) */
+#define SDLK_KP_DBLVERTICALBAR 0x400000cau /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLVERTICALBAR) */
+#define SDLK_KP_COLON 0x400000cbu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COLON) */
+#define SDLK_KP_HASH 0x400000ccu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HASH) */
+#define SDLK_KP_SPACE 0x400000cdu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_SPACE) */
+#define SDLK_KP_AT 0x400000ceu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AT) */
+#define SDLK_KP_EXCLAM 0x400000cfu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EXCLAM) */
+#define SDLK_KP_MEMSTORE 0x400000d0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSTORE) */
+#define SDLK_KP_MEMRECALL 0x400000d1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMRECALL) */
+#define SDLK_KP_MEMCLEAR 0x400000d2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMCLEAR) */
+#define SDLK_KP_MEMADD 0x400000d3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMADD) */
+#define SDLK_KP_MEMSUBTRACT 0x400000d4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSUBTRACT) */
+#define SDLK_KP_MEMMULTIPLY 0x400000d5u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMMULTIPLY) */
+#define SDLK_KP_MEMDIVIDE 0x400000d6u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMDIVIDE) */
+#define SDLK_KP_PLUSMINUS 0x400000d7u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUSMINUS) */
+#define SDLK_KP_CLEAR 0x400000d8u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEAR) */
+#define SDLK_KP_CLEARENTRY 0x400000d9u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEARENTRY) */
+#define SDLK_KP_BINARY 0x400000dau /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BINARY) */
+#define SDLK_KP_OCTAL 0x400000dbu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_OCTAL) */
+#define SDLK_KP_DECIMAL 0x400000dcu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DECIMAL) */
+#define SDLK_KP_HEXADECIMAL 0x400000ddu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HEXADECIMAL) */
+#define SDLK_LCTRL 0x400000e0u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LCTRL) */
+#define SDLK_LSHIFT 0x400000e1u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LSHIFT) */
+#define SDLK_LALT 0x400000e2u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LALT) */
+#define SDLK_LGUI 0x400000e3u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LGUI) */
+#define SDLK_RCTRL 0x400000e4u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RCTRL) */
+#define SDLK_RSHIFT 0x400000e5u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RSHIFT) */
+#define SDLK_RALT 0x400000e6u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RALT) */
+#define SDLK_RGUI 0x400000e7u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RGUI) */
+#define SDLK_MODE 0x40000101u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MODE) */
+#define SDLK_SLEEP 0x40000102u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP) */
+#define SDLK_WAKE 0x40000103u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_WAKE) */
+#define SDLK_CHANNEL_INCREMENT 0x40000104u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_INCREMENT) */
+#define SDLK_CHANNEL_DECREMENT 0x40000105u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_DECREMENT) */
+#define SDLK_MEDIA_PLAY 0x40000106u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY) */
+#define SDLK_MEDIA_PAUSE 0x40000107u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PAUSE) */
+#define SDLK_MEDIA_RECORD 0x40000108u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_RECORD) */
+#define SDLK_MEDIA_FAST_FORWARD 0x40000109u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_FAST_FORWARD) */
+#define SDLK_MEDIA_REWIND 0x4000010au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_REWIND) */
+#define SDLK_MEDIA_NEXT_TRACK 0x4000010bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_NEXT_TRACK) */
+#define SDLK_MEDIA_PREVIOUS_TRACK 0x4000010cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PREVIOUS_TRACK) */
+#define SDLK_MEDIA_STOP 0x4000010du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_STOP) */
+#define SDLK_MEDIA_EJECT 0x4000010eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_EJECT) */
+#define SDLK_MEDIA_PLAY_PAUSE 0x4000010fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY_PAUSE) */
+#define SDLK_MEDIA_SELECT 0x40000110u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_SELECT) */
+#define SDLK_AC_NEW 0x40000111u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_NEW) */
+#define SDLK_AC_OPEN 0x40000112u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_OPEN) */
+#define SDLK_AC_CLOSE 0x40000113u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_CLOSE) */
+#define SDLK_AC_EXIT 0x40000114u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_EXIT) */
+#define SDLK_AC_SAVE 0x40000115u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SAVE) */
+#define SDLK_AC_PRINT 0x40000116u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PRINT) */
+#define SDLK_AC_PROPERTIES 0x40000117u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PROPERTIES) */
+#define SDLK_AC_SEARCH 0x40000118u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SEARCH) */
+#define SDLK_AC_HOME 0x40000119u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_HOME) */
+#define SDLK_AC_BACK 0x4000011au /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BACK) */
+#define SDLK_AC_FORWARD 0x4000011bu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_FORWARD) */
+#define SDLK_AC_STOP 0x4000011cu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_STOP) */
+#define SDLK_AC_REFRESH 0x4000011du /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_REFRESH) */
+#define SDLK_AC_BOOKMARKS 0x4000011eu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BOOKMARKS) */
+#define SDLK_SOFTLEFT 0x4000011fu /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTLEFT) */
+#define SDLK_SOFTRIGHT 0x40000120u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTRIGHT) */
+#define SDLK_CALL 0x40000121u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALL) */
+#define SDLK_ENDCALL 0x40000122u /* SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ENDCALL) */
+
+/**
+ * Valid key modifiers (possibly OR'd together).
+ *
+ * \since This datatype is available since SDL 3.0.0.
+ */
+typedef Uint16 SDL_Keymod;
+
+#define SDL_KMOD_NONE 0x0000u /**< no modifier is applicable. */
+#define SDL_KMOD_LSHIFT 0x0001u /**< the left Shift key is down. */
+#define SDL_KMOD_RSHIFT 0x0002u /**< the right Shift key is down. */
+#define SDL_KMOD_LCTRL 0x0040u /**< the left Ctrl (Control) key is down. */
+#define SDL_KMOD_RCTRL 0x0080u /**< the right Ctrl (Control) key is down. */
+#define SDL_KMOD_LALT 0x0100u /**< the left Alt key is down. */
+#define SDL_KMOD_RALT 0x0200u /**< the right Alt key is down. */
+#define SDL_KMOD_LGUI 0x0400u /**< the left GUI key (often the Windows key) is down. */
+#define SDL_KMOD_RGUI 0x0800u /**< the right GUI key (often the Windows key) is down. */
+#define SDL_KMOD_NUM 0x1000u /**< the Num Lock key (may be located on an extended keypad) is down. */
+#define SDL_KMOD_CAPS 0x2000u /**< the Caps Lock key is down. */
+#define SDL_KMOD_MODE 0x4000u /**< the !AltGr key is down. */
+#define SDL_KMOD_SCROLL 0x8000u /**< the Scroll Lock key is down. */
+#define SDL_KMOD_CTRL (SDL_KMOD_LCTRL | SDL_KMOD_RCTRL) /**< Any Ctrl key is down. */
+#define SDL_KMOD_SHIFT (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT) /**< Any Shift key is down. */
+#define SDL_KMOD_ALT (SDL_KMOD_LALT | SDL_KMOD_RALT) /**< Any Alt key is down. */
+#define SDL_KMOD_GUI (SDL_KMOD_LGUI | SDL_KMOD_RGUI) /**< Any GUI key is down. */
+
+#endif /* SDL_keycode_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_loadso.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_loadso.h
new file mode 100644
index 0000000..ab34a38
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_loadso.h
@@ -0,0 +1,112 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* WIKI CATEGORY: SharedObject */
+
+/**
+ * # CategorySharedObject
+ *
+ * System-dependent library loading routines.
+ *
+ * Some things to keep in mind:
+ *
+ * - These functions only work on C function names. Other languages may have
+ * name mangling and intrinsic language support that varies from compiler to
+ * compiler.
+ * - Make sure you declare your function pointers with the same calling
+ * convention as the actual library function. Your code will crash
+ * mysteriously if you do not do this.
+ * - Avoid namespace collisions. If you load a symbol from the library, it is
+ * not defined whether or not it goes into the global symbol namespace for
+ * the application. If it does and it conflicts with symbols in your code or
+ * other shared libraries, you will not get the results you expect. :)
+ */
+
+#ifndef SDL_loadso_h_
+#define SDL_loadso_h_
+
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Dynamically load a shared object.
+ *
+ * \param sofile a system-dependent name of the object file.
+ * \returns an opaque pointer to the object handle or NULL on failure; call
+ * SDL_GetError() for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_LoadFunction
+ * \sa SDL_UnloadObject
+ */
+extern SDL_DECLSPEC void * SDLCALL SDL_LoadObject(const char *sofile);
+
+/**
+ * Look up the address of the named function in a shared object.
+ *
+ * This function pointer is no longer valid after calling SDL_UnloadObject().
+ *
+ * This function can only look up C function names. Other languages may have
+ * name mangling and intrinsic language support that varies from compiler to
+ * compiler.
+ *
+ * Make sure you declare your function pointers with the same calling
+ * convention as the actual library function. Your code will crash
+ * mysteriously if you do not do this.
+ *
+ * If the requested function doesn't exist, NULL is returned.
+ *
+ * \param handle a valid shared object handle returned by SDL_LoadObject().
+ * \param name the name of the function to look up.
+ * \returns a pointer to the function or NULL on failure; call SDL_GetError()
+ * for more information.
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_LoadObject
+ */
+extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_LoadFunction(void *handle, const char *name);
+
+/**
+ * Unload a shared object from memory.
+ *
+ * \param handle a valid shared object handle returned by SDL_LoadObject().
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_LoadObject
+ */
+extern SDL_DECLSPEC void SDLCALL SDL_UnloadObject(void *handle);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+#include
+
+#endif /* SDL_loadso_h_ */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_locale.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_locale.h
new file mode 100644
index 0000000..85d7750
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_locale.h
@@ -0,0 +1,111 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryLocale
+ *
+ * SDL locale services.
+ */
+
+#ifndef SDL_locale_h
+#define SDL_locale_h
+
+#include
+#include
+
+#include
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+extern "C" {
+/* *INDENT-ON* */
+#endif
+
+/**
+ * A struct to provide locale data.
+ *
+ * Locale data is split into a spoken language, like English, and an optional
+ * country, like Canada. The language will be in ISO-639 format (so English
+ * would be "en"), and the country, if not NULL, will be an ISO-3166 country
+ * code (so Canada would be "CA").
+ *
+ * \since This function is available since SDL 3.0.0.
+ *
+ * \sa SDL_GetPreferredLocales
+ */
+typedef struct SDL_Locale
+{
+ const char *language; /**< A language name, like "en" for English. */
+ const char *country; /**< A country, like "US" for America. Can be NULL. */
+} SDL_Locale;
+
+/**
+ * Report the user's preferred locale.
+ *
+ * Returned language strings are in the format xx, where 'xx' is an ISO-639
+ * language specifier (such as "en" for English, "de" for German, etc).
+ * Country strings are in the format YY, where "YY" is an ISO-3166 country
+ * code (such as "US" for the United States, "CA" for Canada, etc). Country
+ * might be NULL if there's no specific guidance on them (so you might get {
+ * "en", "US" } for American English, but { "en", NULL } means "English
+ * language, generically"). Language strings are never NULL, except to
+ * terminate the array.
+ *
+ * Please note that not all of these strings are 2 characters; some are three
+ * or more.
+ *
+ * The returned list of locales are in the order of the user's preference. For
+ * example, a German citizen that is fluent in US English and knows enough
+ * Japanese to navigate around Tokyo might have a list like: { "de", "en_US",
+ * "jp", NULL }. Someone from England might prefer British English (where
+ * "color" is spelled "colour", etc), but will settle for anything like it: {
+ * "en_GB", "en", NULL }.
+ *
+ * This function returns NULL on error, including when the platform does not
+ * supply this information at all.
+ *
+ * This might be a "slow" call that has to query the operating system. It's
+ * best to ask for this once and save the results. However, this list can
+ * change, usually because the user has changed a system preference outside of
+ * your program; SDL will send an SDL_EVENT_LOCALE_CHANGED event in this case,
+ * if possible, and you can call this function again to get an updated copy of
+ * preferred locales.
+ *
+ * \param count a pointer filled in with the number of locales returned, may
+ * be NULL.
+ * \returns a NULL terminated array of locale pointers, or NULL on failure;
+ * call SDL_GetError() for more information. This is a single
+ * allocation that should be freed with SDL_free() when it is no
+ * longer needed.
+ *
+ * \since This function is available since SDL 3.0.0.
+ */
+extern SDL_DECLSPEC SDL_Locale ** SDLCALL SDL_GetPreferredLocales(int *count);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+}
+/* *INDENT-ON* */
+#endif
+#include
+
+#endif /* SDL_locale_h */
diff --git a/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_log.h b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_log.h
new file mode 100644
index 0000000..171cce8
--- /dev/null
+++ b/Frameworks/SDL3.xcframework/ios-arm64/SDL3.framework/Headers/SDL_log.h
@@ -0,0 +1,407 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2024 Sam Lantinga
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ * # CategoryLog
+ *
+ * Simple log messages with priorities and categories. A message’s
+ * SDL_LogPriority signifies how important the message is. A message's
+ * SDL_LogCategory signifies from what domain it belongs to. Every category
+ * has a minimum priority specified: when a message belongs to that category,
+ * it will only be sent out if it has that minimum priority or higher.
+ *
+ * SDL's own logs are sent below the default priority threshold, so they are
+ * quiet by default. If you're debugging SDL you might want:
+ *
+ * SDL_SetLogPriorities(SDL_LOG_PRIORITY_WARN);
+ *
+ * Here's where the messages go on different platforms:
+ *
+ * - Windows: debug output stream
+ * - Android: log output
+ * - Others: standard error output (stderr)
+ */
+
+#ifndef SDL_log_h_
+#define SDL_log_h_
+
+#include