early-access version 1667

This commit is contained in:
pineappleEA 2021-05-09 11:30:38 +02:00
parent 5e268d25d7
commit 5dbb928ff2
1069 changed files with 38272 additions and 14437 deletions

View file

@ -292,7 +292,7 @@ if (ENABLE_SDL2)
target_link_libraries(SDL2 INTERFACE "${SDL2_LIBRARY}") target_link_libraries(SDL2 INTERFACE "${SDL2_LIBRARY}")
target_include_directories(SDL2 INTERFACE "${SDL2_INCLUDE_DIR}") target_include_directories(SDL2 INTERFACE "${SDL2_INCLUDE_DIR}")
else() else()
find_package(SDL2 2.0.14 QUIET) find_package(SDL2 2.0.15 QUIET)
if (SDL2_FOUND) if (SDL2_FOUND)
# Some installations don't set SDL2_LIBRARIES # Some installations don't set SDL2_LIBRARIES
@ -305,7 +305,7 @@ if (ENABLE_SDL2)
add_library(SDL2 INTERFACE) add_library(SDL2 INTERFACE)
target_link_libraries(SDL2 INTERFACE "${SDL2_LIBRARIES}") target_link_libraries(SDL2 INTERFACE "${SDL2_LIBRARIES}")
else() else()
message(STATUS "SDL2 2.0.14 or newer not found, falling back to externals.") message(STATUS "SDL2 2.0.15 or newer not found, falling back to externals.")
endif() endif()
endif() endif()
endif() endif()

View file

@ -1,7 +1,7 @@
yuzu emulator early access yuzu emulator early access
============= =============
This is the source code for early-access 1666. This is the source code for early-access 1667.
## Legal Notice ## Legal Notice

View file

@ -47,7 +47,10 @@ target_include_directories(unicorn-headers INTERFACE ./unicorn/include)
# SDL2 # SDL2
if (NOT SDL2_FOUND AND ENABLE_SDL2) if (NOT SDL2_FOUND AND ENABLE_SDL2)
set(SDL_STATIC ON)
set(SDL_SHARED OFF)
add_subdirectory(SDL EXCLUDE_FROM_ALL) add_subdirectory(SDL EXCLUDE_FROM_ALL)
add_library(SDL2 ALIAS SDL2-static)
endif() endif()
# SoundTouch # SoundTouch

View file

@ -0,0 +1,7 @@
<!--- Provide a general summary of your changes in the Title above -->
## Description
<!--- Describe your changes in detail -->
## Existing Issue(s)
<!--- If it fixes an open issue, please link to the issue here. -->

57
externals/SDL/.github/workflows/main.yml vendored Executable file
View file

@ -0,0 +1,57 @@
name: Build
on: [push, pull_request]
jobs:
Build:
name: ${{ matrix.platform.name }}
runs-on: ${{ matrix.platform.os }}
strategy:
matrix:
platform:
- { name: Windows, os: windows-latest }
- { name: Linux, os: ubuntu-20.04, flags: -GNinja }
- { name: MacOS, os: macos-latest }
steps:
- name: Setup Linux dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install wayland-protocols \
pkg-config \
ninja-build \
libasound2-dev \
libdbus-1-dev \
libegl1-mesa-dev \
libgl1-mesa-dev \
libgles2-mesa-dev \
libglu1-mesa-dev \
libibus-1.0-dev \
libpulse-dev \
libsdl2-2.0-0 \
libsndio-dev \
libudev-dev \
libwayland-dev \
libwayland-client++0 \
wayland-scanner++ \
libwayland-cursor++0 \
libx11-dev \
libxcursor-dev \
libxext-dev \
libxi-dev \
libxinerama-dev \
libxkbcommon-dev \
libxrandr-dev \
libxss-dev \
libxt-dev \
libxv-dev \
libxxf86vm-dev \
libdrm-dev \
libgbm-dev\
libpulse-dev
- uses: actions/checkout@v2
- name: Configure CMake
run: cmake -B build ${{ matrix.platform.flags }}
- name: Build
run: cmake --build build/

168
externals/SDL/.gitignore vendored Executable file
View file

@ -0,0 +1,168 @@
aclocal.m4
autom4te*
config.cache
config.log
config.status
libtool
Makefile
Makefile.rules
sdl2-config
sdl2-config.cmake
sdl2-config-version.cmake
sdl2.pc
SDL2.spec
build
gen
Build
buildbot
*.so
*.so.*
*.dll
*.exe
*.o
*.obj
*.lib
*.a
*.la
*.dSYM
*,e1f
*,ff8
*.lnk
*.err
*.exp
*.map
*.orig
*~
*.swp
*.tmp
*.rej
# for CMake
CMakeFiles/
CMakeCache.txt
cmake_install.cmake
cmake_uninstall.cmake
SDL2ConfigVersion.cmake
.ninja_*
*.ninja
# for CLion
.idea
cmake-build-*
# for Xcode
*.mode1*
*.perspective*
*.pbxuser
(^|/)build($|/)
.DS_Store
xcuserdata
*.xcworkspace
# for Visual C++
.vs
Debug
Release
*.user
*.ncb
*.suo
*.sdf
VisualC/tests/loopwave/sample.wav
VisualC/tests/testautomation/CompareSurfaces0001_Reference.bmp
VisualC/tests/testautomation/CompareSurfaces0001_TestOutput.bmp
VisualC/tests/testgamecontroller/axis.bmp
VisualC/tests/testgamecontroller/button.bmp
VisualC/tests/testgamecontroller/controllermap.bmp
VisualC/tests/testoverlay2/moose.dat
VisualC/tests/testrendertarget/icon.bmp
VisualC/tests/testrendertarget/sample.bmp
VisualC/tests/testscale/icon.bmp
VisualC/tests/testscale/sample.bmp
VisualC/tests/testsprite2/icon.bmp
VisualC/visualtest/icon.bmp
VisualC/visualtest/testquit.actions
VisualC/visualtest/testquit.config
VisualC/visualtest/testquit.exe
VisualC/visualtest/testquit.parameters
VisualC/visualtest/testsprite2.exe
VisualC/visualtest/testsprite2_sample.actions
VisualC/visualtest/testsprite2_sample.config
VisualC/visualtest/testsprite2_sample.parameters
# for Android
android-project/local.properties
test/checkkeys
test/controllermap
test/loopwave
test/loopwavequeue
test/testatomic
test/testaudiocapture
test/testaudiohotplug
test/testaudioinfo
test/testautomation
test/testbounds
test/testcustomcursor
test/testdisplayinfo
test/testdraw2
test/testdrawchessboard
test/testdropfile
test/testerror
test/testevdev
test/testfile
test/testfilesystem
test/testgamecontroller
test/testgesture
test/testgl2
test/testgles
test/testgles2
test/testhaptic
test/testhittesting
test/testhotplug
test/testiconv
test/testime
test/testintersections
test/testjoystick
test/testkeys
test/testloadso
test/testlocale
test/testlock
test/testmessage
test/testmultiaudio
test/testnative
test/testoverlay2
test/testplatform
test/testpower
test/testqsort
test/testrelative
test/testrendercopyex
test/testrendertarget
test/testresample
test/testrumble
test/testscale
test/testsem
test/testsensor
test/testshader
test/testshape
test/testsprite2
test/testspriteminimal
test/teststreaming
test/testthread
test/testtimer
test/testurl
test/testver
test/testviewport
test/testvulkan
test/testwm2
test/testyuv
test/torturethread
builddir/
debian/*.debhelper.log
debian/*.substvars
debian/*.tar.gz
debian/.debhelper/
debian/files
debian/libsdl*/
debian/tmp/

View file

@ -20,6 +20,7 @@ LOCAL_SRC_FILES := \
$(wildcard $(LOCAL_PATH)/src/audio/*.c) \ $(wildcard $(LOCAL_PATH)/src/audio/*.c) \
$(wildcard $(LOCAL_PATH)/src/audio/android/*.c) \ $(wildcard $(LOCAL_PATH)/src/audio/android/*.c) \
$(wildcard $(LOCAL_PATH)/src/audio/dummy/*.c) \ $(wildcard $(LOCAL_PATH)/src/audio/dummy/*.c) \
$(wildcard $(LOCAL_PATH)/src/audio/aaudio/*.c) \
$(wildcard $(LOCAL_PATH)/src/audio/openslES/*.c) \ $(wildcard $(LOCAL_PATH)/src/audio/openslES/*.c) \
$(LOCAL_PATH)/src/atomic/SDL_atomic.c.arm \ $(LOCAL_PATH)/src/atomic/SDL_atomic.c.arm \
$(LOCAL_PATH)/src/atomic/SDL_spinlock.c.arm \ $(LOCAL_PATH)/src/atomic/SDL_spinlock.c.arm \

View file

@ -1,7 +1,7 @@
Bugs are now managed in the SDL bug tracker, here: Bugs are now managed in the SDL issue tracker, here:
https://bugzilla.libsdl.org/ https://github.com/libsdl-org/SDL/issues
You may report bugs there, and search to see if a given issue has already You may report bugs there, and search to see if a given issue has already
been reported, discussed, and maybe even fixed. been reported, discussed, and maybe even fixed.
@ -11,6 +11,6 @@ You may also find help at the SDL forums/mailing list:
https://discourse.libsdl.org/ https://discourse.libsdl.org/
Bug reports are welcome here, but we really appreciate if you use Bugzilla, as Bug reports are welcome here, but we really appreciate if you use the issue
bugs discussed on the mailing list may be forgotten or missed. tracker, as bugs discussed on the mailing list may be forgotten or missed.

View file

@ -6,15 +6,8 @@ cmake_minimum_required(VERSION 3.0.0)
project(SDL2 C CXX) project(SDL2 C CXX)
if(WINDOWS_STORE) if(WINDOWS_STORE)
enable_language(CXX)
cmake_minimum_required(VERSION 3.11) cmake_minimum_required(VERSION 3.11)
add_definitions(-DSDL_BUILDING_WINRT=1 -ZW) add_definitions(-DSDL_BUILDING_WINRT=1 -ZW)
link_libraries(
-nodefaultlib:vccorlib$<$<CONFIG:Debug>:d>
-nodefaultlib:msvcrt$<$<CONFIG:Debug>:d>
vccorlib$<$<CONFIG:Debug>:d>.lib
msvcrt$<$<CONFIG:Debug>:d>.lib
)
endif() endif()
# !!! FIXME: this should probably do "MACOSX_RPATH ON" as a target property # !!! FIXME: this should probably do "MACOSX_RPATH ON" as a target property
@ -34,6 +27,7 @@ include(CheckSymbolExists)
include(CheckCSourceCompiles) include(CheckCSourceCompiles)
include(CheckCSourceRuns) include(CheckCSourceRuns)
include(CheckCCompilerFlag) include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
include(CheckTypeSize) include(CheckTypeSize)
include(CheckStructHasMember) include(CheckStructHasMember)
include(CMakeDependentOption) include(CMakeDependentOption)
@ -53,12 +47,12 @@ include(${SDL2_SOURCE_DIR}/cmake/sdlchecks.cmake)
# set SDL_BINARY_AGE and SDL_INTERFACE_AGE to 0. # set SDL_BINARY_AGE and SDL_INTERFACE_AGE to 0.
set(SDL_MAJOR_VERSION 2) set(SDL_MAJOR_VERSION 2)
set(SDL_MINOR_VERSION 0) set(SDL_MINOR_VERSION 0)
set(SDL_MICRO_VERSION 14) set(SDL_MICRO_VERSION 15)
set(SDL_INTERFACE_AGE 0) set(SDL_INTERFACE_AGE 1)
set(SDL_BINARY_AGE 14) set(SDL_BINARY_AGE 15)
set(SDL_VERSION "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}.${SDL_MICRO_VERSION}") set(SDL_VERSION "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}.${SDL_MICRO_VERSION}")
# the following should match the versions in Xcode project file: # the following should match the versions in Xcode project file:
set(DYLIB_CURRENT_VERSION 15.0.0) set(DYLIB_CURRENT_VERSION 15.1.0)
set(DYLIB_COMPATIBILITY_VERSION 1.0.0) set(DYLIB_COMPATIBILITY_VERSION 1.0.0)
# Set defaults preventing destination file conflicts # Set defaults preventing destination file conflicts
@ -152,22 +146,19 @@ else()
set(UNIX_OR_MAC_SYS OFF) set(UNIX_OR_MAC_SYS OFF)
endif() endif()
if (UNIX_OR_MAC_SYS AND NOT EMSCRIPTEN) # JavaScript does not yet have threading support, so disable pthreads when building for Emscripten. # Emscripten pthreads work, but you need to have a non-pthread fallback build
# for systems without support. It's not currently enough to not use
# pthread functions in a pthread-build; it won't start up on unsupported
# browsers. As such, you have to explicitly enable it on Emscripten builds
# for the time being. This default with change to ON once this becomes
# commonly supported in browsers or the Emscripten teams makes a single
# binary work everywhere.
if (UNIX_OR_MAC_SYS AND NOT EMSCRIPTEN)
set(SDL_PTHREADS_ENABLED_BY_DEFAULT ON) set(SDL_PTHREADS_ENABLED_BY_DEFAULT ON)
else() else()
set(SDL_PTHREADS_ENABLED_BY_DEFAULT OFF) set(SDL_PTHREADS_ENABLED_BY_DEFAULT OFF)
endif() endif()
# Default option knobs
if(APPLE OR ARCH_64)
if(NOT "${CMAKE_OSX_ARCHITECTURES}" MATCHES "arm")
set(OPT_DEF_SSEMATH ON)
endif()
endif()
if(UNIX OR MINGW OR MSYS)
set(OPT_DEF_LIBC ON)
endif()
# The hidraw support doesn't catch Xbox, PS4 and Nintendo controllers, # The hidraw support doesn't catch Xbox, PS4 and Nintendo controllers,
# so we'll just use libusb when it's available. libusb does not support iOS, # so we'll just use libusb when it's available. libusb does not support iOS,
# so we default to yes on iOS. # so we default to yes on iOS.
@ -190,12 +181,12 @@ else()
endif() endif()
# Compiler info # Compiler info
if(CMAKE_COMPILER_IS_GNUCC) if(CMAKE_C_COMPILER_ID MATCHES "Clang")
set(USE_GCC TRUE)
set(OPT_DEF_ASM TRUE)
elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
set(USE_CLANG TRUE) set(USE_CLANG TRUE)
set(OPT_DEF_ASM TRUE) set(OPT_DEF_ASM TRUE)
elseif(CMAKE_COMPILER_IS_GNUCC)
set(USE_GCC TRUE)
set(OPT_DEF_ASM TRUE)
elseif(MSVC_VERSION GREATER 1400) # VisualStudio 8.0+ elseif(MSVC_VERSION GREATER 1400) # VisualStudio 8.0+
set(OPT_DEF_ASM TRUE) set(OPT_DEF_ASM TRUE)
#set(CMAKE_C_FLAGS "/ZI /WX- / #set(CMAKE_C_FLAGS "/ZI /WX- /
@ -207,6 +198,16 @@ if(USE_GCC OR USE_CLANG)
set(OPT_DEF_GCC_ATOMICS ON) set(OPT_DEF_GCC_ATOMICS ON)
endif() endif()
# Default option knobs
if(APPLE OR ARCH_64)
if(NOT "${CMAKE_OSX_ARCHITECTURES}" MATCHES "arm")
set(OPT_DEF_SSEMATH ON)
endif()
endif()
if(UNIX OR MINGW OR MSYS OR USE_CLANG OR VITA)
set(OPT_DEF_LIBC ON)
endif()
# Default flags, if not set otherwise # Default flags, if not set otherwise
if("$ENV{CFLAGS}" STREQUAL "") if("$ENV{CFLAGS}" STREQUAL "")
if(CMAKE_BUILD_TYPE STREQUAL "") if(CMAKE_BUILD_TYPE STREQUAL "")
@ -288,16 +289,25 @@ set(OPT_DEF_ASM TRUE)
if(EMSCRIPTEN) if(EMSCRIPTEN)
# Set up default values for the currently supported set of subsystems: # Set up default values for the currently supported set of subsystems:
# Emscripten/Javascript does not have assembly support, a dynamic library # Emscripten/Javascript does not have assembly support, a dynamic library
# loading architecture, low-level CPU inspection or multithreading. # loading architecture, or low-level CPU inspection.
# SDL_THREADS_ENABLED_BY_DEFAULT now defaults to ON, but pthread support might be disabled by default.
# !!! FIXME: most of these subsystems should default to ON if there are dummy implementations to be used.
set(OPT_DEF_ASM FALSE) set(OPT_DEF_ASM FALSE)
set(SDL_SHARED_ENABLED_BY_DEFAULT OFF) set(SDL_SHARED_ENABLED_BY_DEFAULT OFF)
set(SDL_ATOMIC_ENABLED_BY_DEFAULT OFF) set(SDL_ATOMIC_ENABLED_BY_DEFAULT OFF)
set(SDL_THREADS_ENABLED_BY_DEFAULT OFF)
set(SDL_LOADSO_ENABLED_BY_DEFAULT OFF) set(SDL_LOADSO_ENABLED_BY_DEFAULT OFF)
set(SDL_CPUINFO_ENABLED_BY_DEFAULT OFF) set(SDL_CPUINFO_ENABLED_BY_DEFAULT OFF)
set(SDL_DLOPEN_ENABLED_BY_DEFAULT OFF) set(SDL_DLOPEN_ENABLED_BY_DEFAULT OFF)
endif() endif()
if(VITA)
set(SDL_SHARED_ENABLED_BY_DEFAULT OFF)
set(SDL_LOADSO_ENABLED_BY_DEFAULT OFF)
set(SDL_DLOPEN_ENABLED_BY_DEFAULT OFF)
endif()
# When defined, respect CMake's BUILD_SHARED_LIBS setting: # When defined, respect CMake's BUILD_SHARED_LIBS setting:
set(SDL_STATIC_ENABLED_BY_DEFAULT ON) set(SDL_STATIC_ENABLED_BY_DEFAULT ON)
if (NOT DEFINED SDL_SHARED_ENABLED_BY_DEFAULT) if (NOT DEFINED SDL_SHARED_ENABLED_BY_DEFAULT)
@ -359,6 +369,8 @@ set_option(JACK "Support the JACK audio API" ${UNIX_SYS})
dep_option(JACK_SHARED "Dynamically load JACK audio support" ON "JACK" OFF) dep_option(JACK_SHARED "Dynamically load JACK audio support" ON "JACK" OFF)
set_option(ESD "Support the Enlightened Sound Daemon" ${UNIX_SYS}) set_option(ESD "Support the Enlightened Sound Daemon" ${UNIX_SYS})
dep_option(ESD_SHARED "Dynamically load ESD audio support" ON "ESD" OFF) dep_option(ESD_SHARED "Dynamically load ESD audio support" ON "ESD" OFF)
set_option(PIPEWIRE "Use Pipewire audio" ${UNIX_SYS})
dep_option(PIPEWIRE_SHARED "Dynamically load Pipewire support" ON "PIPEWIRE" OFF)
set_option(PULSEAUDIO "Use PulseAudio" ${UNIX_SYS}) set_option(PULSEAUDIO "Use PulseAudio" ${UNIX_SYS})
dep_option(PULSEAUDIO_SHARED "Dynamically load PulseAudio support" ON "PULSEAUDIO" OFF) dep_option(PULSEAUDIO_SHARED "Dynamically load PulseAudio support" ON "PULSEAUDIO" OFF)
set_option(ARTS "Support the Analog Real Time Synthesizer" ${UNIX_SYS}) set_option(ARTS "Support the Analog Real Time Synthesizer" ${UNIX_SYS})
@ -386,6 +398,7 @@ foreach(_SUB ${SDL_X11_OPTIONS})
endforeach() endforeach()
set_option(VIDEO_COCOA "Use Cocoa video driver" ${APPLE}) set_option(VIDEO_COCOA "Use Cocoa video driver" ${APPLE})
set_option(DIRECTX "Use DirectX for Windows audio/video" ${WINDOWS}) set_option(DIRECTX "Use DirectX for Windows audio/video" ${WINDOWS})
set_option(XINPUT "Use Xinput for Windows" ${WINDOWS})
set_option(WASAPI "Use the Windows WASAPI audio driver" ${WINDOWS}) set_option(WASAPI "Use the Windows WASAPI audio driver" ${WINDOWS})
set_option(RENDER_D3D "Enable the Direct3D render driver" ${WINDOWS}) set_option(RENDER_D3D "Enable the Direct3D render driver" ${WINDOWS})
set_option(RENDER_METAL "Enable the Metal render driver" ${APPLE}) set_option(RENDER_METAL "Enable the Metal render driver" ${APPLE})
@ -399,6 +412,7 @@ option_string(BACKGROUNDING_SIGNAL "number to use for magic backgrounding signal
option_string(FOREGROUNDING_SIGNAL "number to use for magic foregrounding signal or 'OFF'" "OFF") option_string(FOREGROUNDING_SIGNAL "number to use for magic foregrounding signal or 'OFF'" "OFF")
set_option(HIDAPI "Use HIDAPI for low level joystick drivers" ${OPT_DEF_HIDAPI}) set_option(HIDAPI "Use HIDAPI for low level joystick drivers" ${OPT_DEF_HIDAPI})
set_option(JOYSTICK_VIRTUAL "Enable the virtual-joystick driver" ON) set_option(JOYSTICK_VIRTUAL "Enable the virtual-joystick driver" ON)
set_option(ASAN "Use AddressSanitizer to detect memory errors" OFF)
set(SDL_SHARED ${SDL_SHARED_ENABLED_BY_DEFAULT} CACHE BOOL "Build a shared version of the library") set(SDL_SHARED ${SDL_SHARED_ENABLED_BY_DEFAULT} CACHE BOOL "Build a shared version of the library")
set(SDL_STATIC ${SDL_STATIC_ENABLED_BY_DEFAULT} CACHE BOOL "Build a static version of the library") set(SDL_STATIC ${SDL_STATIC_ENABLED_BY_DEFAULT} CACHE BOOL "Build a static version of the library")
@ -528,11 +542,11 @@ if(USE_GCC OR USE_CLANG)
list(APPEND EXTRA_LDFLAGS "-Wl,-undefined,error") list(APPEND EXTRA_LDFLAGS "-Wl,-undefined,error")
list(APPEND EXTRA_LDFLAGS "-Wl,-compatibility_version,${DYLIB_COMPATIBILITY_VERSION}") list(APPEND EXTRA_LDFLAGS "-Wl,-compatibility_version,${DYLIB_COMPATIBILITY_VERSION}")
list(APPEND EXTRA_LDFLAGS "-Wl,-current_version,${DYLIB_CURRENT_VERSION}") list(APPEND EXTRA_LDFLAGS "-Wl,-current_version,${DYLIB_CURRENT_VERSION}")
else() elseif(NOT OPENBSD)
set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined") set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
check_c_compiler_flag("" HAVE_NO_UNDEFINED) check_c_compiler_flag("" HAVE_NO_UNDEFINED)
set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS}) set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
if(HAVE_NO_UNDEFINED) if(HAVE_NO_UNDEFINED AND NOT (USE_CLANG AND WINDOWS))
list(APPEND EXTRA_LDFLAGS "-Wl,--no-undefined") list(APPEND EXTRA_LDFLAGS "-Wl,--no-undefined")
endif() endif()
endif() endif()
@ -757,11 +771,6 @@ if(ASSEMBLY)
set(HAVE_SSE3 TRUE) set(HAVE_SSE3 TRUE)
set(SDL_ASSEMBLY_ROUTINES 1) set(SDL_ASSEMBLY_ROUTINES 1)
endif() endif()
# TODO:
#else()
# if(USE_GCC OR USE_CLANG)
# list(APPEND EXTRA_CFLAGS "-mno-sse" "-mno-sse2" "-mno-sse3" "-mno-mmx")
# endif()
endif() endif()
# TODO: Can't deactivate on FreeBSD? w/o LIBC, SDL_stdinc.h can't define # TODO: Can't deactivate on FreeBSD? w/o LIBC, SDL_stdinc.h can't define
@ -777,14 +786,14 @@ if(LIBC)
set(HAVE_SIGNAL_H 1) set(HAVE_SIGNAL_H 1)
foreach(_FN foreach(_FN
malloc calloc realloc free qsort abs memset memcpy memmove memcmp malloc calloc realloc free qsort abs memset memcpy memmove memcmp
wcslen wcsdup wcsstr wcscmp wcsncmp _wcsicmp _wcsnicmp wcslen _wcsdup wcsdup wcsstr wcscmp wcsncmp _wcsicmp _wcsnicmp
strlen _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa strlen _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa
_ultoa strtol strtoul strtoll strtod atoi atof strcmp strncmp _ultoa strtol strtoul strtoll strtod atoi atof strcmp strncmp
_stricmp _strnicmp strtok_s sscanf _stricmp _strnicmp sscanf
acos acosf asin asinf atan atanf atan2 atan2f ceil ceilf acos acosf asin asinf atan atanf atan2 atan2f ceil ceilf
copysign copysignf cos cosf exp expf fabs fabsf floor floorf fmod fmodf copysign copysignf cos cosf exp expf fabs fabsf floor floorf fmod fmodf
log logf log10 log10f pow powf scalbn scalbnf sin sinf sqrt sqrtf tan tanf log logf log10 log10f lround lroundf pow powf round roundf scalbn scalbnf
trunc truncf) sin sinf sqrt sqrtf tan tanf trunc truncf)
string(TOUPPER ${_FN} _UPPER) string(TOUPPER ${_FN} _UPPER)
set(HAVE_${_UPPER} 1) set(HAVE_${_UPPER} 1)
endforeach() endforeach()
@ -816,10 +825,10 @@ if(LIBC)
foreach(_FN foreach(_FN
strtod malloc calloc realloc free getenv setenv putenv unsetenv strtod malloc calloc realloc free getenv setenv putenv unsetenv
qsort abs bcopy memset memcpy memmove memcmp strlen strlcpy strlcat qsort abs bcopy memset memcpy memmove memcmp strlen strlcpy strlcat
_strrev _strupr _strlwr strchr strrchr strstr strtok_r itoa _ltoa _strrev _strupr _strlwr index rindex strchr strrchr strstr strtok_r
_uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull itoa _ltoa _uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull
atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp
wcscmp wcsdup wcslcat wcslcpy wcslen wcsncmp wcsstr wcscmp _wcsdup wcsdup wcslcat wcslcpy wcslen wcsncmp wcsstr
wcscasecmp _wcsicmp wcsncasecmp _wcsnicmp wcscasecmp _wcsicmp wcsncasecmp _wcsnicmp
sscanf vsscanf vsnprintf fopen64 fseeko fseeko64 _Exit sscanf vsscanf vsnprintf fopen64 fseeko fseeko64 _Exit
) )
@ -843,15 +852,17 @@ if(LIBC)
foreach(_FN foreach(_FN
atan atan2 atanf atan2f ceil ceilf copysign copysignf cos cosf atan atan2 atanf atan2f ceil ceilf copysign copysignf cos cosf
exp expf fabs fabsf floor floorf fmod fmodf log logf log10 log10f exp expf fabs fabsf floor floorf fmod fmodf log logf log10 log10f
pow powf scalbn scalbnf sin sinf sqrt sqrtf tan tanf acos acosf lround lroundf pow powf round roundf scalbn scalbnf sin sinf sqrt
asin asinf trunc truncf) sqrtf tan tanf acos acosf asin asinf trunc truncf)
string(TOUPPER ${_FN} _UPPER) string(TOUPPER ${_FN} _UPPER)
set(_HAVEVAR "HAVE_${_UPPER}") set(_HAVEVAR "HAVE_${_UPPER}")
check_symbol_exists("${_FN}" "math.h" ${_HAVEVAR}) check_symbol_exists("${_FN}" "math.h" ${_HAVEVAR})
endforeach() endforeach()
set(CMAKE_REQUIRED_LIBRARIES) set(CMAKE_REQUIRED_LIBRARIES)
if(NOT VITA)
list(APPEND EXTRA_LIBS m) list(APPEND EXTRA_LIBS m)
endif() endif()
endif()
check_library_exists(iconv iconv_open "" HAVE_LIBICONV) check_library_exists(iconv iconv_open "" HAVE_LIBICONV)
check_library_exists(c iconv_open "" HAVE_BUILTIN_ICONV) check_library_exists(c iconv_open "" HAVE_BUILTIN_ICONV)
@ -983,6 +994,18 @@ if(ANDROID)
set(SDL_AUDIO_DRIVER_ANDROID 1) set(SDL_AUDIO_DRIVER_ANDROID 1)
file(GLOB ANDROID_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/android/*.c) file(GLOB ANDROID_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/android/*.c)
set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_AUDIO_SOURCES}) set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_AUDIO_SOURCES})
set(SDL_AUDIO_DRIVER_OPENSLES 1)
file(GLOB OPENSLES_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/openslES/*.c)
set(SOURCE_FILES ${SOURCE_FILES} ${OPENSLES_AUDIO_SOURCES})
find_library(ANDROID_OPENSLES_LIBRARY OpenSLES)
list(APPEND EXTRA_LIBS ${ANDROID_DL_LIBRARY} ${ANDROID_OPENSLES_LIBRARY})
set(SDL_AUDIO_DRIVER_AAUDIO 0)
file(GLOB AAUDIO_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/aaudio/*.c)
set(SOURCE_FILES ${SOURCE_FILES} ${AAUDIO_AUDIO_SOURCES})
set(HAVE_SDL_AUDIO TRUE) set(HAVE_SDL_AUDIO TRUE)
endif() endif()
if(SDL_FILESYSTEM) if(SDL_FILESYSTEM)
@ -1141,6 +1164,8 @@ elseif(EMSCRIPTEN)
endif() endif()
endif() endif()
CheckPTHREAD()
elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT RISCOS) elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT RISCOS)
if(SDL_AUDIO) if(SDL_AUDIO)
if(SYSV5 OR SOLARIS OR HPUX) if(SYSV5 OR SOLARIS OR HPUX)
@ -1162,6 +1187,7 @@ elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT RISCOS)
CheckOSS() CheckOSS()
CheckALSA() CheckALSA()
CheckJACK() CheckJACK()
CheckPipewire()
CheckPulseAudio() CheckPulseAudio()
CheckESD() CheckESD()
CheckARTS() CheckARTS()
@ -1180,7 +1206,10 @@ elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT RISCOS)
CheckOpenGLESX11() CheckOpenGLESX11()
CheckWayland() CheckWayland()
CheckVivante() CheckVivante()
# Need to check EGL before checking KMSDRM because KMSDRM depends on it.
CheckEGLKMSDRM()
CheckKMSDRM() CheckKMSDRM()
CheckOpenGLKMSDRM()
endif() endif()
if(UNIX) if(UNIX)
@ -1398,8 +1427,13 @@ elseif(WINDOWS)
endif() endif()
endif() endif()
if(WINDOWS_STORE)
file(GLOB WINRT_MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/winrt/*.cpp)
set(SOURCE_FILES ${SOURCE_FILES} ${WINRT_MISC_SOURCES})
else()
file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/windows/*.c) file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/windows/*.c)
set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES}) set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES})
endif()
set(HAVE_SDL_MISC TRUE) set(HAVE_SDL_MISC TRUE)
# Check for DirectX # Check for DirectX
@ -1414,26 +1448,6 @@ elseif(WINDOWS)
set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"") set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
endif() endif()
if(HAVE_WIN32_CC)
# xinput.h may need windows.h, but doesn't include it itself.
check_c_source_compiles("
#include <windows.h>
#include <xinput.h>
int main(int argc, char **argv) { }" HAVE_XINPUT_H)
check_c_source_compiles("
#include <windows.h>
#include <xinput.h>
XINPUT_GAMEPAD_EX x1;
int main(int argc, char **argv) { }" HAVE_XINPUT_GAMEPAD_EX)
check_c_source_compiles("
#include <windows.h>
#include <xinput.h>
XINPUT_STATE_EX s1;
int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
else()
check_include_file(xinput.h HAVE_XINPUT_H)
endif()
check_include_file(d3d9.h HAVE_D3D_H) check_include_file(d3d9.h HAVE_D3D_H)
check_include_file(d3d11_1.h HAVE_D3D11_H) check_include_file(d3d11_1.h HAVE_D3D11_H)
check_include_file(ddraw.h HAVE_DDRAW_H) check_include_file(ddraw.h HAVE_DDRAW_H)
@ -1454,6 +1468,24 @@ elseif(WINDOWS)
set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS}) set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
endif() endif()
if(XINPUT)
# xinput.h may need windows.h, but does not include it itself.
check_c_source_compiles("
#include <windows.h>
#include <xinput.h>
int main(int argc, char **argv) { }" HAVE_XINPUT_H)
check_c_source_compiles("
#include <windows.h>
#include <xinput.h>
XINPUT_GAMEPAD_EX x1;
int main(int argc, char **argv) { }" HAVE_XINPUT_GAMEPAD_EX)
check_c_source_compiles("
#include <windows.h>
#include <xinput.h>
XINPUT_STATE_EX s1;
int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
endif()
# headers needed elsewhere # headers needed elsewhere
check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H) check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
check_include_file(audioclient.h HAVE_AUDIOCLIENT_H) check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
@ -1473,9 +1505,12 @@ elseif(WINDOWS)
set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES}) set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
endif() endif()
if(WASAPI AND HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H AND NOT WINDOWS_STORE) if(WASAPI AND HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H)
set(SDL_AUDIO_DRIVER_WASAPI 1) set(SDL_AUDIO_DRIVER_WASAPI 1)
file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c) file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c)
if(WINDOWS_STORE)
list(APPEND WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/SDL_wasapi_winrt.cpp)
endif()
set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES}) set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES})
endif() endif()
endif() endif()
@ -1510,17 +1545,19 @@ elseif(WINDOWS)
endif() endif()
if(SDL_THREADS) if(SDL_THREADS)
set(SDL_THREAD_GENERIC_COND_SUFFIX 1)
set(SDL_THREAD_WINDOWS 1) set(SDL_THREAD_WINDOWS 1)
set(SOURCE_FILES ${SOURCE_FILES} set(SOURCE_FILES ${SOURCE_FILES}
${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c
${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syscond_srw.c
${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c)
${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
set(HAVE_SDL_THREADS TRUE) set(HAVE_SDL_THREADS TRUE)
endif() endif()
if(SDL_SENSOR AND HAVE_SENSORSAPI_H) if(SDL_SENSOR AND HAVE_SENSORSAPI_H AND NOT WINDOWS_STORE)
set(SDL_SENSOR_WINDOWS 1) set(SDL_SENSOR_WINDOWS 1)
set(HAVE_SDL_SENSORS TRUE) set(HAVE_SDL_SENSORS TRUE)
file(GLOB WINDOWS_SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/windows/*.c) file(GLOB WINDOWS_SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/windows/*.c)
@ -1539,7 +1576,11 @@ elseif(WINDOWS)
endif() endif()
if(SDL_LOCALE) if(SDL_LOCALE)
if(WINDOWS_STORE)
file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/winrt/*.c)
else()
file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/windows/*.c) file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/windows/*.c)
endif()
set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES}) set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
set(HAVE_SDL_LOCALE TRUE) set(HAVE_SDL_LOCALE TRUE)
endif() endif()
@ -1560,6 +1601,15 @@ elseif(WINDOWS)
list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32) list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32)
endif() endif()
if(WINDOWS_STORE)
list(APPEND EXTRA_LIBS
-nodefaultlib:vccorlib$<$<CONFIG:Debug>:d>
-nodefaultlib:msvcrt$<$<CONFIG:Debug>:d>
vccorlib$<$<CONFIG:Debug>:d>.lib
msvcrt$<$<CONFIG:Debug>:d>.lib
)
endif()
# TODO: in configure.ac the check for timers is set on # TODO: in configure.ac the check for timers is set on
# cygwin | mingw32* - does this include mingw32CE? # cygwin | mingw32* - does this include mingw32CE?
if(SDL_TIMERS) if(SDL_TIMERS)
@ -1668,7 +1718,12 @@ elseif(APPLE)
message_error("SDL_FILE must be enabled to build on MacOS X") message_error("SDL_FILE must be enabled to build on MacOS X")
endif() endif()
if(IOS OR TVOS)
file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/ios/*.m)
file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/uikit/*.c)
else()
file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/macosx/*.m) file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/macosx/*.m)
endif()
set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES}) set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES})
set(HAVE_SDL_MISC TRUE) set(HAVE_SDL_MISC TRUE)
@ -1699,6 +1754,7 @@ elseif(APPLE)
set(SDL_FRAMEWORK_COREMOTION 1) set(SDL_FRAMEWORK_COREMOTION 1)
endif() endif()
set(SDL_FRAMEWORK_GAMECONTROLLER 1) set(SDL_FRAMEWORK_GAMECONTROLLER 1)
set(SDL_FRAMEWORK_COREHAPTICS 1)
set(HAVE_SDL_SENSORS 1) set(HAVE_SDL_SENSORS 1)
else() else()
file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m) file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m)
@ -1923,6 +1979,12 @@ elseif(APPLE)
find_library(UIKIT UIKit) find_library(UIKIT UIKit)
list(APPEND EXTRA_LIBS ${UIKIT}) list(APPEND EXTRA_LIBS ${UIKIT})
endif() endif()
if(SDL_FRAMEWORK_COREHAPTICS)
find_library(COREHAPTICS CoreHaptics)
if(COREHAPTICS)
list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,CoreHaptics")
endif()
endif()
CheckPTHREAD() CheckPTHREAD()
@ -1988,6 +2050,120 @@ elseif(RISCOS)
if(SDL_AUDIO) if(SDL_AUDIO)
CheckOSS() CheckOSS()
endif() endif()
elseif(VITA)
# SDL_spinlock.c Needs to be compiled in ARM mode.
check_c_compiler_flag(-marm HAVE_ARM_MODE)
if(HAVE_ARM_MODE)
set_source_files_properties(${SDL2_SOURCE_DIR}/src/atomic/SDL_spinlock.c PROPERTIES COMPILE_FLAGS -marm)
endif()
file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/vita/*.c)
set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES})
set(HAVE_SDL_MISC TRUE)
if(SDL_AUDIO)
set(SDL_AUDIO_DRIVER_VITA 1)
file(GLOB VITA_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/vita/*.c)
set(SOURCE_FILES ${SOURCE_FILES} ${VITA_AUDIO_SOURCES})
set(HAVE_SDL_AUDIO TRUE)
endif()
if(SDL_FILESYSTEM)
set(SDL_FILESYSTEM_VITA 1)
file(GLOB VITA_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/vita/*.c)
set(SOURCE_FILES ${SOURCE_FILES} ${VITA_FILESYSTEM_SOURCES})
set(HAVE_SDL_FILESYSTEM TRUE)
endif()
if(SDL_JOYSTICK)
set(SDL_JOYSTICK_VITA 1)
file(GLOB VITA_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/vita/*.c)
set(SOURCE_FILES ${SOURCE_FILES} ${VITA_JOYSTICK_SOURCES})
set(HAVE_SDL_JOYSTICK TRUE)
endif()
if(SDL_POWER)
set(SDL_POWER_VITA 1)
file(GLOB VITA_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/vita/*.c)
set(SOURCE_FILES ${SOURCE_FILES} ${VITA_POWER_SOURCES})
set(HAVE_SDL_POWER TRUE)
endif()
if(SDL_THREADS)
set(SDL_THREAD_VITA 1)
set(SOURCE_FILES ${SOURCE_FILES}
${SDL2_SOURCE_DIR}/src/thread/vita/SDL_sysmutex.c
${SDL2_SOURCE_DIR}/src/thread/vita/SDL_syssem.c
${SDL2_SOURCE_DIR}/src/thread/vita/SDL_systhread.c
${SDL2_SOURCE_DIR}/src/thread/vita/SDL_syscond.c
${SDL2_SOURCE_DIR}/src/thread/generic/SDL_systls.c)
set(HAVE_SDL_THREADS TRUE)
endif()
if(SDL_TIMERS)
set(SDL_TIMER_VITA 1)
file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/vita/*.c)
set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
set(HAVE_SDL_TIMERS TRUE)
endif()
if(SDL_SENSOR)
set(SDL_SENSOR_VITA 1)
set(HAVE_SDL_SENSORS TRUE)
file(GLOB VITA_SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/vita/*.c)
set(SOURCE_FILES ${SOURCE_FILES} ${VITA_SENSOR_SOURCES})
endif()
if(SDL_VIDEO)
set(SDL_VIDEO_DRIVER_VITA 1)
file(GLOB VITA_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/vita/*.c)
set(SOURCE_FILES ${SOURCE_FILES} ${VITA_VIDEO_SOURCES})
set(HAVE_SDL_VIDEO TRUE)
check_include_file(pib.h HAVE_PIGS_IN_BLANKET_H)
if(HAVE_PIGS_IN_BLANKET_H)
set(SDL_VIDEO_OPENGL_ES2 1)
list(APPEND EXTRA_LIBS
pib
)
endif()
set(SDL_VIDEO_RENDER_VITA_GXM 1)
list(APPEND EXTRA_LIBS
SceGxm_stub
SceDisplay_stub
SceCtrl_stub
SceAppMgr_stub
SceAudio_stub
SceSysmodule_stub
SceDisplay_stub
SceCtrl_stub
SceIofilemgr_stub
SceCommonDialog_stub
SceTouch_stub
SceHid_stub
SceMotion_stub
m
)
endif()
set(HAVE_ARMSIMD TRUE)
set(SDL_ARM_SIMD_BLITTERS 1)
file(GLOB ARMSIMD_SOURCES ${SDL2_SOURCE_DIR}/src/video/arm/pixman-arm-simd*.S)
set(SOURCE_FILES ${SOURCE_FILES} ${ARMSIMD_SOURCES})
set(HAVE_ARMNEON TRUE)
set(SDL_ARM_NEON_BLITTERS 1)
file(GLOB ARMNEON_SOURCES ${SDL2_SOURCE_DIR}/src/video/arm/pixman-arm-neon*.S)
set(SOURCE_FILES ${SOURCE_FILES} ${ARMNEON_SOURCES})
set_property(SOURCE ${SDL2_SOURCE_DIR}/src/video/arm/pixman-arm-simd-asm.S PROPERTY LANGUAGE C)
set_property(SOURCE ${SDL2_SOURCE_DIR}/src/video/arm/pixman-arm-neon-asm.S PROPERTY LANGUAGE C)
add_definitions("-D__VITA__")
add_definitions("-Dmemcpy=sceClibMemcpy")
add_definitions("-Dmemset=sceClibMemset")
add_definitions("-Dmemmove=sceClibMemmove")
add_definitions("-Dmemcmp=sceClibMemcmp")
# CheckPTHREAD()
endif() endif()
if(VIDEO_VULKAN) if(VIDEO_VULKAN)
@ -2087,7 +2263,9 @@ if(NOT CMAKE_HOST_WIN32)
WORKING_DIRECTORY ${SDL2_BINARY_DIR}) WORKING_DIRECTORY ${SDL2_BINARY_DIR})
endif() endif()
if(NOT WINDOWS OR CYGWIN) if(NOT WINDOWS OR CYGWIN)
set(prefix ${CMAKE_INSTALL_PREFIX}) set(prefix ${CMAKE_INSTALL_PREFIX})
set(exec_prefix "\${prefix}") set(exec_prefix "\${prefix}")
set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}") set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
set(bindir "\${exec_prefix}/bin") set(bindir "\${exec_prefix}/bin")
@ -2100,24 +2278,34 @@ if(NOT WINDOWS OR CYGWIN)
set(ENABLE_STATIC_FALSE "") set(ENABLE_STATIC_FALSE "")
endif() endif()
if(SDL_SHARED) if(SDL_SHARED)
set(PKG_CONFIG_LIBS_PRIV " set(PKGCONFIG_LIBS_PRIV "
Libs.private:") Libs.private:")
set(ENABLE_SHARED_TRUE "") set(ENABLE_SHARED_TRUE "")
set(ENABLE_SHARED_FALSE "#") set(ENABLE_SHARED_FALSE "#")
else() else()
set(PKG_CONFIG_LIBS_PRIV "") set(PKGCONFIG_LIBS_PRIV "")
set(ENABLE_SHARED_TRUE "#") set(ENABLE_SHARED_TRUE "#")
set(ENABLE_SHARED_FALSE "") set(ENABLE_SHARED_FALSE "")
endif() endif()
# Clean up the different lists # Clean up the different lists
if (VITA)
listtostrrev(EXTRA_LIBS _EXTRA_LIBS "-l")
set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
listtostrrev(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
listtostrrev(SDL_LIBS _SDL_LIBS)
set(SDL_LIBS ${_SDL_LIBS})
else()
listtostr(EXTRA_LIBS _EXTRA_LIBS "-l") listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
set(SDL_STATIC_LIBS ${EXTRA_LDFLAGS} ${_EXTRA_LIBS}) set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
list(REMOVE_DUPLICATES SDL_STATIC_LIBS) list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS) listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS}) set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
listtostr(SDL_LIBS _SDL_LIBS) listtostr(SDL_LIBS _SDL_LIBS)
set(SDL_LIBS ${_SDL_LIBS}) set(SDL_LIBS ${_SDL_LIBS})
endif()
# MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}") # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
# MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}") # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
@ -2132,6 +2320,71 @@ Libs.private:")
"${SDL2_BINARY_DIR}/SDL2.spec" @ONLY) "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
endif() endif()
macro(check_add_debug_flag FLAG SUFFIX)
check_c_compiler_flag(${FLAG} HAS_C_FLAG_${SUFFIX})
if (HAS_C_FLAG_${SUFFIX})
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${FLAG}")
endif()
check_cxx_compiler_flag(${FLAG} HAS_CXX_${SUFFIX})
if (HAS_CXX_${SUFFIX})
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${FLAG}")
endif()
endmacro()
macro(asan_check_add_debug_flag ASAN_FLAG)
check_add_debug_flag("-fsanitize=${ASAN_FLAG}" "${ASAN_FLAG}")
if(HAS_C_${ASAN_FLAG} OR HAS_CXX_${ASAN_FLAG})
set(HAVE_ASAN ON)
endif()
endmacro()
macro(asan_check_add_debug_flag2 ASAN_FLAG)
# for some sanitize flags we have to manipulate the CMAKE_REQUIRED_LIBRARIES:
# http://cmake.3232098.n2.nabble.com/CHECK-CXX-COMPILER-FLAG-doesn-t-give-correct-result-for-fsanitize-address-tp7600216p7600217.html
set(FLAG "-fsanitize=${ASAN_FLAG}")
set (STORED_REQLIBS ${CMAKE_REQUIRED_LIBRARIES})
set (CMAKE_REQUIRED_LIBRARIES "${FLAG};asan")
check_c_compiler_flag (${FLAG} HAS_C_FLAG_${ASAN_FLAG})
check_cxx_compiler_flag (${FLAG} HAS_CXX_FLAG_${ASAN_FLAG})
set (CMAKE_REQUIRED_LIBRARIES ${STORED_REQLIBS})
if (HAS_C_FLAG_${ASAN_FLAG})
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${FLAG}")
endif()
if (HAS_CXX_${ASAN_FLAG})
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${FLAG}")
endif()
if(HAS_C_${ASAN_FLAG} OR HAS_CXX_${ASAN_FLAG})
set(HAVE_ASAN ON)
endif()
endmacro()
# enable AddressSanitizer if supported
if (ASAN)
asan_check_add_debug_flag2("address")
asan_check_add_debug_flag("bool")
asan_check_add_debug_flag("bounds")
asan_check_add_debug_flag("enum")
asan_check_add_debug_flag("float-cast-overflow")
asan_check_add_debug_flag("float-divide-by-zero")
asan_check_add_debug_flag("nonnull-attribute")
asan_check_add_debug_flag("returns-nonnull-attribute")
asan_check_add_debug_flag("signed-integer-overflow")
asan_check_add_debug_flag("undefined")
asan_check_add_debug_flag("vla-bound")
asan_check_add_debug_flag("leak")
# The object size sanitizer has no effect on unoptimized builds on Clang,
# but causes warnings.
if((NOT USE_CLANG) OR (CMAKE_BUILD_TYPE STREQUAL ""))
asan_check_add_debug_flag("object-size")
endif()
endif()
##### Info output ##### ##### Info output #####
message(STATUS "") message(STATUS "")
message(STATUS "SDL2 was configured with the following options:") message(STATUS "SDL2 was configured with the following options:")
@ -2156,6 +2409,11 @@ foreach(_OPT ${ALLOPTIONS})
string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING) string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
message_tested_option(${_OPT} ${_PADDING}) message_tested_option(${_OPT} ${_PADDING})
endforeach() endforeach()
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "")
message(STATUS " CMAKE_C_FLAGS_DEBUG: ${CMAKE_C_FLAGS_DEBUG}")
message(STATUS " CMAKE_CXX_FLAGS_DEBUG: ${CMAKE_CXX_FLAGS_DEBUG}")
endif()
message(STATUS "") message(STATUS "")
message(STATUS " CFLAGS: ${CMAKE_C_FLAGS}") message(STATUS " CFLAGS: ${CMAKE_C_FLAGS}")
message(STATUS " EXTRA_CFLAGS: ${EXTRA_CFLAGS}") message(STATUS " EXTRA_CFLAGS: ${EXTRA_CFLAGS}")
@ -2199,6 +2457,8 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
# Always build SDLmain # Always build SDLmain
if(NOT WINDOWS_STORE) if(NOT WINDOWS_STORE)
add_library(SDL2main STATIC ${SDLMAIN_SOURCES}) add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
# alias target for in-tree builds
add_library(SDL2::SDL2main ALIAS SDL2main)
target_include_directories(SDL2main PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/SDL2>) target_include_directories(SDL2main PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/SDL2>)
set(_INSTALL_LIBS "SDL2main") set(_INSTALL_LIBS "SDL2main")
if (NOT ANDROID) if (NOT ANDROID)
@ -2212,6 +2472,8 @@ endif()
if(SDL_SHARED) if(SDL_SHARED)
add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES}) add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
# alias target for in-tree builds
add_library(SDL2::SDL2 ALIAS SDL2)
if(APPLE) if(APPLE)
set_target_properties(SDL2 PROPERTIES set_target_properties(SDL2 PROPERTIES
MACOSX_RPATH 1 MACOSX_RPATH 1
@ -2233,8 +2495,10 @@ if(SDL_SHARED)
endif() endif()
if(MSVC AND NOT LIBC) if(MSVC AND NOT LIBC)
# Don't try to link with the default set of libraries. # Don't try to link with the default set of libraries.
if(NOT WINDOWS_STORE)
set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB") set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB") set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
endif()
set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB") set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
endif() endif()
set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS}) set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
@ -2254,6 +2518,8 @@ endif()
if(ANDROID) if(ANDROID)
if(HAVE_HIDAPI) if(HAVE_HIDAPI)
add_library(hidapi SHARED ${SDL2_SOURCE_DIR}/src/hidapi/android/hid.cpp) add_library(hidapi SHARED ${SDL2_SOURCE_DIR}/src/hidapi/android/hid.cpp)
# alias target for in-tree builds
add_library(SDL2::hidapi ALIAS hidapi)
endif() endif()
if(MSVC AND NOT LIBC) if(MSVC AND NOT LIBC)
@ -2270,6 +2536,8 @@ endif()
if(SDL_STATIC) if(SDL_STATIC)
set (BUILD_SHARED_LIBS FALSE) set (BUILD_SHARED_LIBS FALSE)
add_library(SDL2-static STATIC ${SOURCE_FILES}) add_library(SDL2-static STATIC ${SOURCE_FILES})
# alias target for in-tree builds
add_library(SDL2::SDL2-static ALIAS SDL2-static)
if (NOT SDL_SHARED OR NOT WIN32) if (NOT SDL_SHARED OR NOT WIN32)
set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2") set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
# Note: Apparently, OUTPUT_NAME must really be unique; even when # Note: Apparently, OUTPUT_NAME must really be unique; even when

View file

@ -2,10 +2,10 @@
To compile and install SDL: To compile and install SDL:
1. Windows with Visual Studio: 1. Windows with Visual Studio:
* Read VisualC.html * Read ./docs/README-visualc.md
Windows with gcc, either native or cross-compiling: Windows with gcc, either native or cross-compiling:
* Read the FAQ at https://wiki.libsdl.org/moin.fcg/FAQWindows * Read the FAQ at https://wiki.libsdl.org/FAQWindows
* Run './configure; make; make install' * Run './configure; make; make install'
Mac OS X with Xcode: Mac OS X with Xcode:

18
externals/SDL/LICENSE.txt vendored Executable file
View file

@ -0,0 +1,18 @@
Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
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.

View file

@ -43,10 +43,11 @@ SDLTEST_TARGET = libSDL2_test.la
SDLTEST_OBJECTS = @SDLTEST_OBJECTS@ SDLTEST_OBJECTS = @SDLTEST_OBJECTS@
WAYLAND_SCANNER = @WAYLAND_SCANNER@ WAYLAND_SCANNER = @WAYLAND_SCANNER@
WAYLAND_SCANNER_CODE_MODE = @WAYLAND_SCANNER_CODE_MODE@
INSTALL_SDL2_CONFIG = @INSTALL_SDL2_CONFIG@ INSTALL_SDL2_CONFIG = @INSTALL_SDL2_CONFIG@
SRC_DIST = *.txt acinclude Android.mk autogen.sh android-project build-scripts cmake cmake_uninstall.cmake.in configure configure.ac debian docs include Makefile.* sdl2-config.cmake.in sdl2-config-version.cmake.in sdl2-config.in sdl2.m4 sdl2.pc.in SDL2.spec.in SDL2Config.cmake src test VisualC.html VisualC VisualC-WinRT Xcode Xcode-iOS wayland-protocols SRC_DIST = *.txt acinclude Android.mk autogen.sh android-project build-scripts cmake cmake_uninstall.cmake.in configure configure.ac debian docs include Makefile.* sdl2-config.cmake.in sdl2-config-version.cmake.in sdl2-config.in sdl2.m4 sdl2.pc.in SDL2.spec.in SDL2Config.cmake src test VisualC VisualC-WinRT Xcode Xcode-iOS wayland-protocols
GEN_DIST = SDL2.spec GEN_DIST = SDL2.spec
ifneq ($V,1) ifneq ($V,1)

View file

@ -2,7 +2,7 @@
# wmake -f Makefile.os2 # wmake -f Makefile.os2
LIBNAME = SDL2 LIBNAME = SDL2
VERSION = 2.0.14 VERSION = 2.0.15
DESCRIPTION = Simple DirectMedia Layer 2 DESCRIPTION = Simple DirectMedia Layer 2
LIBHOME = . LIBHOME = .
@ -60,7 +60,7 @@ SRCS+= SDL_syscond.c SDL_sysmutex.c SDL_syssem.c SDL_systhread.c SDL_systls.c
SRCS+= SDL_systimer.c SRCS+= SDL_systimer.c
SRCS+= SDL_sysloadso.c SRCS+= SDL_sysloadso.c
SRCS+= SDL_sysfilesystem.c SRCS+= SDL_sysfilesystem.c
SRCS+= SDL_syshaptic.c SDL_sysjoystick.c SRCS+= SDL_os2joystick.c SDL_syshaptic.c SDL_sysjoystick.c
SRCS+= SDL_virtualjoystick.c SRCS+= SDL_virtualjoystick.c
SRCS+= SDL_dummyaudio.c SDL_diskaudio.c SRCS+= SDL_dummyaudio.c SDL_diskaudio.c
SRCS+= SDL_nullvideo.c SDL_nullframebuffer.c SDL_nullevents.c SRCS+= SDL_nullvideo.c SDL_nullframebuffer.c SDL_nullevents.c
@ -83,7 +83,7 @@ MOBJS= $(MSRCS:.c=.obj)
.c: ./src;./src/dynapi;./src/audio;./src/cpuinfo;./src/events;./src/file;./src/haptic;./src/joystick;./src/power;./src/render;./src/render/software;./src/sensor;./src/stdlib;./src/thread;./src/timer;./src/video;./src/video/yuv2rgb;./src/atomic;./src/audio/disk; .c: ./src;./src/dynapi;./src/audio;./src/cpuinfo;./src/events;./src/file;./src/haptic;./src/joystick;./src/power;./src/render;./src/render/software;./src/sensor;./src/stdlib;./src/thread;./src/timer;./src/video;./src/video/yuv2rgb;./src/atomic;./src/audio/disk;
.c: ./src/haptic/dummy;./src/joystick/dummy;./src/joystick/virtual;./src/audio/dummy;./src/video/dummy;./src/sensor/dummy; .c: ./src/haptic/dummy;./src/joystick/dummy;./src/joystick/virtual;./src/audio/dummy;./src/video/dummy;./src/sensor/dummy;
.c: ./src/core/os2;./src/core/os2/geniconv;./src/audio/os2;./src/loadso/os2;./src/filesystem/os2;./src/thread/os2;./src/timer/os2;./src/video/os2; .c: ./src/core/os2;./src/core/os2/geniconv;./src/audio/os2;./src/loadso/os2;./src/filesystem/os2;./src/joystick/os2;./src/thread/os2;./src/timer/os2;./src/video/os2;
.c: ./src/locale/;./src/locale/unix;./src/misc;./src/misc/dummy .c: ./src/locale/;./src/locale/unix;./src/misc;./src/misc/dummy
all: $(DLLFILE) $(LIBFILE) .symbolic all: $(DLLFILE) $(LIBFILE) .symbolic

17
externals/SDL/README.md vendored Executable file
View file

@ -0,0 +1,17 @@
# Simple DirectMedia Layer (SDL) Version 2.0
https://www.libsdl.org/
Simple DirectMedia Layer is a cross-platform development library designed
to provide low level access to audio, keyboard, mouse, joystick, and graphics
hardware via OpenGL and Direct3D. It is used by video playback software,
emulators, and popular games including Valve's award winning catalog
and many Humble Bundle games.
More extensive documentation is available in the docs directory, starting
with README.md
Enjoy!
Sam Lantinga (slouken@libsdl.org)

View file

@ -63,7 +63,7 @@ rm -rf $RPM_BUILD_ROOT
%files %files
%{__defattr} %{__defattr}
%doc README*.txt COPYING.txt CREDITS.txt BUGS.txt %doc README*.txt LICENSE.txt CREDITS.txt BUGS.txt
%{_libdir}/lib*.%{__soext}.* %{_libdir}/lib*.%{__soext}.*
%files devel %files devel

View file

@ -1,5 +1,5 @@
Future work roadmap: Future work roadmap:
* http://wiki.libsdl.org/moin.cgi/Roadmap * http://wiki.libsdl.org/Roadmap
* Check 1.2 revisions: * Check 1.2 revisions:
3554 - Need to resolve semantics for locking keys on different platforms 3554 - Need to resolve semantics for locking keys on different platforms

View file

@ -132,6 +132,8 @@
<ClInclude Include="..\..\src\sensor\SDL_syssensor.h" /> <ClInclude Include="..\..\src\sensor\SDL_syssensor.h" />
<ClInclude Include="..\..\src\thread\SDL_systhread.h" /> <ClInclude Include="..\..\src\thread\SDL_systhread.h" />
<ClInclude Include="..\..\src\thread\SDL_thread_c.h" /> <ClInclude Include="..\..\src\thread\SDL_thread_c.h" />
<ClInclude Include="..\..\src\thread\generic\SDL_syscond_c.h" />
<ClInclude Include="..\..\src\thread\windows\SDL_sysmutex_c.h" />
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" /> <ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" />
<ClInclude Include="..\..\src\timer\SDL_timer_c.h" /> <ClInclude Include="..\..\src\timer\SDL_timer_c.h" />
<ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" /> <ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" />
@ -269,6 +271,7 @@
<ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" /> <ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" />
<ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" /> <ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" />
<ClCompile Include="..\..\src\thread\SDL_thread.c" /> <ClCompile Include="..\..\src\thread\SDL_thread.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_syscond_srw.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" /> <ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" /> <ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" /> <ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" />

View file

@ -381,6 +381,12 @@
<ClInclude Include="..\..\src\joystick\windows\SDL_xinputjoystick_c.h"> <ClInclude Include="..\..\src\joystick\windows\SDL_xinputjoystick_c.h">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\src\thread\generic\SDL_syscond_c.h">
<Filter>Source Files</Filter>
</ClInclude>
<ClInclude Include="..\..\src\thread\windows\SDL_sysmutex_c.h">
<Filter>Source Files</Filter>
</ClInclude>
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h"> <ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClInclude> </ClInclude>
@ -716,6 +722,9 @@
<ClCompile Include="..\..\src\joystick\windows\SDL_xinputjoystick.c"> <ClCompile Include="..\..\src\joystick\windows\SDL_xinputjoystick.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\thread\windows\SDL_syscond_srw.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c"> <ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>

View file

@ -146,6 +146,8 @@
<ClInclude Include="..\..\src\sensor\SDL_sensor_c.h" /> <ClInclude Include="..\..\src\sensor\SDL_sensor_c.h" />
<ClInclude Include="..\..\src\sensor\SDL_syssensor.h" /> <ClInclude Include="..\..\src\sensor\SDL_syssensor.h" />
<ClInclude Include="..\..\src\thread\SDL_thread_c.h" /> <ClInclude Include="..\..\src\thread\SDL_thread_c.h" />
<ClInclude Include="..\..\src\thread\generic\SDL_syscond_c.h" />
<ClInclude Include="..\..\src\thread\windows\SDL_sysmutex_c.h" />
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" /> <ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" />
<ClInclude Include="..\..\src\timer\SDL_timer_c.h" /> <ClInclude Include="..\..\src\timer\SDL_timer_c.h" />
<ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" /> <ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" />
@ -303,6 +305,7 @@
<ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" /> <ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" />
<ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" /> <ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" />
<ClCompile Include="..\..\src\thread\SDL_thread.c" /> <ClCompile Include="..\..\src\thread\SDL_thread.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_syscond_srw.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" /> <ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" /> <ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" /> <ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" />
@ -510,7 +513,7 @@
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries> <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
<GenerateWindowsMetadata>false</GenerateWindowsMetadata> <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
<AdditionalDependencies>vccorlibd.lib;msvcrtd.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>vccorlibd.lib;msvcrtd.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;synchronization.lib;%(AdditionalDependencies)</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>vccorlibd;msvcrtd;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <IgnoreSpecificDefaultLibraries>vccorlibd;msvcrtd;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -525,7 +528,7 @@
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries> <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
<GenerateWindowsMetadata>false</GenerateWindowsMetadata> <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
<AdditionalDependencies>vccorlib.lib;msvcrt.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>vccorlib.lib;msvcrt.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;synchronization.lib;%(AdditionalDependencies)</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>vccorlib;msvcrt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <IgnoreSpecificDefaultLibraries>vccorlib;msvcrt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -540,7 +543,7 @@
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries> <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
<GenerateWindowsMetadata>false</GenerateWindowsMetadata> <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
<AdditionalDependencies>vccorlibd.lib;msvcrtd.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>vccorlibd.lib;msvcrtd.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;synchronization.lib;%(AdditionalDependencies)</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>vccorlibd;msvcrtd;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <IgnoreSpecificDefaultLibraries>vccorlibd;msvcrtd;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -555,7 +558,7 @@
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries> <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
<GenerateWindowsMetadata>false</GenerateWindowsMetadata> <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
<AdditionalDependencies>vccorlib.lib;msvcrt.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>vccorlib.lib;msvcrt.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;synchronization.lib;%(AdditionalDependencies)</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>vccorlib;msvcrt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <IgnoreSpecificDefaultLibraries>vccorlib;msvcrt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -570,7 +573,7 @@
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries> <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
<GenerateWindowsMetadata>false</GenerateWindowsMetadata> <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
<AdditionalDependencies>vccorlibd.lib;msvcrtd.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>vccorlibd.lib;msvcrtd.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;synchronization.lib;%(AdditionalDependencies)</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>vccorlibd;msvcrtd;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <IgnoreSpecificDefaultLibraries>vccorlibd;msvcrtd;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -585,7 +588,7 @@
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries> <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
<GenerateWindowsMetadata>false</GenerateWindowsMetadata> <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
<AdditionalDependencies>vccorlib.lib;msvcrt.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>vccorlib.lib;msvcrt.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;synchronization.lib;%(AdditionalDependencies)</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>vccorlib;msvcrt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <IgnoreSpecificDefaultLibraries>vccorlib;msvcrt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>

View file

@ -390,6 +390,12 @@
<ClInclude Include="..\..\src\joystick\windows\SDL_dinputjoystick_c.h"> <ClInclude Include="..\..\src\joystick\windows\SDL_dinputjoystick_c.h">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\src\thread\generic\SDL_syscond_c.h">
<Filter>Source Files</Filter>
</ClInclude>
<ClInclude Include="..\..\src\thread\windows\SDL_sysmutex_c.h">
<Filter>Source Files</Filter>
</ClInclude>
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h"> <ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClInclude> </ClInclude>
@ -743,6 +749,9 @@
<ClCompile Include="..\..\src\joystick\windows\SDL_dinputjoystick.c"> <ClCompile Include="..\..\src\joystick\windows\SDL_dinputjoystick.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\thread\windows\SDL_syscond_srw.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c"> <ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>

View file

@ -359,6 +359,8 @@
<ClInclude Include="..\..\src\sensor\windows\SDL_windowssensor.h" /> <ClInclude Include="..\..\src\sensor\windows\SDL_windowssensor.h" />
<ClInclude Include="..\..\src\thread\SDL_systhread.h" /> <ClInclude Include="..\..\src\thread\SDL_systhread.h" />
<ClInclude Include="..\..\src\thread\SDL_thread_c.h" /> <ClInclude Include="..\..\src\thread\SDL_thread_c.h" />
<ClInclude Include="..\..\src\thread\generic\SDL_syscond_c.h" />
<ClInclude Include="..\..\src\thread\windows\SDL_sysmutex_c.h" />
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" /> <ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" />
<ClInclude Include="..\..\src\timer\SDL_timer_c.h" /> <ClInclude Include="..\..\src\timer\SDL_timer_c.h" />
<ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" /> <ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" />
@ -435,6 +437,7 @@
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_ps4.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_ps4.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_ps5.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_ps5.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_rumble.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_rumble.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_stadia.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_switch.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_switch.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_xbox360.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_xbox360.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_xbox360w.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_xbox360w.c" />
@ -512,6 +515,7 @@
<ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" /> <ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" />
<ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" /> <ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" />
<ClCompile Include="..\..\src\thread\SDL_thread.c" /> <ClCompile Include="..\..\src\thread\SDL_thread.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_syscond_srw.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" /> <ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" /> <ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" /> <ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" />

View file

@ -301,6 +301,8 @@
<ClInclude Include="..\..\src\sensor\windows\SDL_windowssensor.h" /> <ClInclude Include="..\..\src\sensor\windows\SDL_windowssensor.h" />
<ClInclude Include="..\..\src\thread\SDL_systhread.h" /> <ClInclude Include="..\..\src\thread\SDL_systhread.h" />
<ClInclude Include="..\..\src\thread\SDL_thread_c.h" /> <ClInclude Include="..\..\src\thread\SDL_thread_c.h" />
<ClInclude Include="..\..\src\thread\generic\SDL_syscond_c.h" />
<ClInclude Include="..\..\src\thread\windows\SDL_sysmutex_c.h" />
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" /> <ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" />
<ClInclude Include="..\..\src\timer\SDL_timer_c.h" /> <ClInclude Include="..\..\src\timer\SDL_timer_c.h" />
<ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" /> <ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" />
@ -378,6 +380,7 @@
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_ps4.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_ps4.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_ps5.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_ps5.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_rumble.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_rumble.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_stadia.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_switch.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_switch.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_xbox360.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_xbox360.c" />
<ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_xbox360w.c" /> <ClCompile Include="..\..\src\joystick\hidapi\SDL_hidapi_xbox360w.c" />
@ -456,6 +459,7 @@
<ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" /> <ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" />
<ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" /> <ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" />
<ClCompile Include="..\..\src\thread\SDL_thread.c" /> <ClCompile Include="..\..\src\thread\SDL_thread.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_syscond_srw.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" /> <ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" /> <ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" />
<ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" /> <ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" />

View file

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

View file

@ -3,7 +3,7 @@
archiveVersion = 1; archiveVersion = 1;
classes = { classes = {
}; };
objectVersion = 46; objectVersion = 52;
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
@ -238,7 +238,6 @@
A75FCD8D23E25AB700529352 /* gl2platform.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A72523E2513E00DCD162 /* gl2platform.h */; }; A75FCD8D23E25AB700529352 /* gl2platform.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A72523E2513E00DCD162 /* gl2platform.h */; };
A75FCD8E23E25AB700529352 /* SDL_pixels.h in Headers */ = {isa = PBXBuildFile; fileRef = AA7557E51595D4D800BBD41B /* SDL_pixels.h */; settings = {ATTRIBUTES = (Public, ); }; }; A75FCD8E23E25AB700529352 /* SDL_pixels.h in Headers */ = {isa = PBXBuildFile; fileRef = AA7557E51595D4D800BBD41B /* SDL_pixels.h */; settings = {ATTRIBUTES = (Public, ); }; };
A75FCD8F23E25AB700529352 /* vk_layer.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A72D23E2513E00DCD162 /* vk_layer.h */; }; A75FCD8F23E25AB700529352 /* vk_layer.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A72D23E2513E00DCD162 /* vk_layer.h */; };
A75FCD9023E25AB700529352 /* SDL_cocoamousetap.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68823E2513E00DCD162 /* SDL_cocoamousetap.h */; };
A75FCD9123E25AB700529352 /* vk_platform.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A73123E2513E00DCD162 /* vk_platform.h */; }; A75FCD9123E25AB700529352 /* vk_platform.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A73123E2513E00DCD162 /* vk_platform.h */; };
A75FCD9223E25AB700529352 /* SDL_cocoametalview.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68623E2513E00DCD162 /* SDL_cocoametalview.h */; }; A75FCD9223E25AB700529352 /* SDL_cocoametalview.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68623E2513E00DCD162 /* SDL_cocoametalview.h */; };
A75FCD9323E25AB700529352 /* SDL_cocoaopengles.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69023E2513E00DCD162 /* SDL_cocoaopengles.h */; }; A75FCD9323E25AB700529352 /* SDL_cocoaopengles.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69023E2513E00DCD162 /* SDL_cocoaopengles.h */; };
@ -347,7 +346,6 @@
A75FCDFE23E25AB700529352 /* SDL_hidapi_xbox360w.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A7C823E2513E00DCD162 /* SDL_hidapi_xbox360w.c */; }; A75FCDFE23E25AB700529352 /* SDL_hidapi_xbox360w.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A7C823E2513E00DCD162 /* SDL_hidapi_xbox360w.c */; };
A75FCDFF23E25AB700529352 /* SDL_atomic.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A57423E2513D00DCD162 /* SDL_atomic.c */; }; A75FCDFF23E25AB700529352 /* SDL_atomic.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A57423E2513D00DCD162 /* SDL_atomic.c */; };
A75FCE0023E25AB700529352 /* SDL_displayevents.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92D23E2514000DCD162 /* SDL_displayevents.c */; }; A75FCE0023E25AB700529352 /* SDL_displayevents.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92D23E2514000DCD162 /* SDL_displayevents.c */; };
A75FCE0123E25AB700529352 /* SDL_cocoamousetap.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A69723E2513E00DCD162 /* SDL_cocoamousetap.m */; };
A75FCE0223E25AB700529352 /* SDL_log.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A5DD23E2513D00DCD162 /* SDL_log.c */; }; A75FCE0223E25AB700529352 /* SDL_log.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A5DD23E2513D00DCD162 /* SDL_log.c */; };
A75FCE0323E25AB700529352 /* SDL_cocoaopengl.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A67F23E2513E00DCD162 /* SDL_cocoaopengl.m */; }; A75FCE0323E25AB700529352 /* SDL_cocoaopengl.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A67F23E2513E00DCD162 /* SDL_cocoaopengl.m */; };
A75FCE0423E25AB700529352 /* SDL_offscreenframebuffer.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A5F223E2513D00DCD162 /* SDL_offscreenframebuffer.c */; }; A75FCE0423E25AB700529352 /* SDL_offscreenframebuffer.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A5F223E2513D00DCD162 /* SDL_offscreenframebuffer.c */; };
@ -656,7 +654,6 @@
A75FCF4623E25AC700529352 /* gl2platform.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A72523E2513E00DCD162 /* gl2platform.h */; }; A75FCF4623E25AC700529352 /* gl2platform.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A72523E2513E00DCD162 /* gl2platform.h */; };
A75FCF4723E25AC700529352 /* SDL_pixels.h in Headers */ = {isa = PBXBuildFile; fileRef = AA7557E51595D4D800BBD41B /* SDL_pixels.h */; settings = {ATTRIBUTES = (Public, ); }; }; A75FCF4723E25AC700529352 /* SDL_pixels.h in Headers */ = {isa = PBXBuildFile; fileRef = AA7557E51595D4D800BBD41B /* SDL_pixels.h */; settings = {ATTRIBUTES = (Public, ); }; };
A75FCF4823E25AC700529352 /* vk_layer.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A72D23E2513E00DCD162 /* vk_layer.h */; }; A75FCF4823E25AC700529352 /* vk_layer.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A72D23E2513E00DCD162 /* vk_layer.h */; };
A75FCF4923E25AC700529352 /* SDL_cocoamousetap.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68823E2513E00DCD162 /* SDL_cocoamousetap.h */; };
A75FCF4A23E25AC700529352 /* vk_platform.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A73123E2513E00DCD162 /* vk_platform.h */; }; A75FCF4A23E25AC700529352 /* vk_platform.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A73123E2513E00DCD162 /* vk_platform.h */; };
A75FCF4B23E25AC700529352 /* SDL_cocoametalview.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68623E2513E00DCD162 /* SDL_cocoametalview.h */; }; A75FCF4B23E25AC700529352 /* SDL_cocoametalview.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68623E2513E00DCD162 /* SDL_cocoametalview.h */; };
A75FCF4C23E25AC700529352 /* SDL_cocoaopengles.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69023E2513E00DCD162 /* SDL_cocoaopengles.h */; }; A75FCF4C23E25AC700529352 /* SDL_cocoaopengles.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69023E2513E00DCD162 /* SDL_cocoaopengles.h */; };
@ -765,7 +762,6 @@
A75FCFB723E25AC700529352 /* SDL_hidapi_xbox360w.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A7C823E2513E00DCD162 /* SDL_hidapi_xbox360w.c */; }; A75FCFB723E25AC700529352 /* SDL_hidapi_xbox360w.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A7C823E2513E00DCD162 /* SDL_hidapi_xbox360w.c */; };
A75FCFB823E25AC700529352 /* SDL_atomic.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A57423E2513D00DCD162 /* SDL_atomic.c */; }; A75FCFB823E25AC700529352 /* SDL_atomic.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A57423E2513D00DCD162 /* SDL_atomic.c */; };
A75FCFB923E25AC700529352 /* SDL_displayevents.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92D23E2514000DCD162 /* SDL_displayevents.c */; }; A75FCFB923E25AC700529352 /* SDL_displayevents.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92D23E2514000DCD162 /* SDL_displayevents.c */; };
A75FCFBA23E25AC700529352 /* SDL_cocoamousetap.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A69723E2513E00DCD162 /* SDL_cocoamousetap.m */; };
A75FCFBB23E25AC700529352 /* SDL_log.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A5DD23E2513D00DCD162 /* SDL_log.c */; }; A75FCFBB23E25AC700529352 /* SDL_log.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A5DD23E2513D00DCD162 /* SDL_log.c */; };
A75FCFBC23E25AC700529352 /* SDL_cocoaopengl.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A67F23E2513E00DCD162 /* SDL_cocoaopengl.m */; }; A75FCFBC23E25AC700529352 /* SDL_cocoaopengl.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A67F23E2513E00DCD162 /* SDL_cocoaopengl.m */; };
A75FCFBD23E25AC700529352 /* SDL_offscreenframebuffer.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A5F223E2513D00DCD162 /* SDL_offscreenframebuffer.c */; }; A75FCFBD23E25AC700529352 /* SDL_offscreenframebuffer.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A5F223E2513D00DCD162 /* SDL_offscreenframebuffer.c */; };
@ -1111,7 +1107,6 @@
A769B11223E259AE00872273 /* SDL_cocoavulkan.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68F23E2513E00DCD162 /* SDL_cocoavulkan.h */; }; A769B11223E259AE00872273 /* SDL_cocoavulkan.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68F23E2513E00DCD162 /* SDL_cocoavulkan.h */; };
A769B11323E259AE00872273 /* gl2platform.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A72523E2513E00DCD162 /* gl2platform.h */; }; A769B11323E259AE00872273 /* gl2platform.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A72523E2513E00DCD162 /* gl2platform.h */; };
A769B11523E259AE00872273 /* vk_layer.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A72D23E2513E00DCD162 /* vk_layer.h */; }; A769B11523E259AE00872273 /* vk_layer.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A72D23E2513E00DCD162 /* vk_layer.h */; };
A769B11723E259AE00872273 /* SDL_cocoamousetap.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68823E2513E00DCD162 /* SDL_cocoamousetap.h */; };
A769B11823E259AE00872273 /* vk_platform.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A73123E2513E00DCD162 /* vk_platform.h */; }; A769B11823E259AE00872273 /* vk_platform.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A73123E2513E00DCD162 /* vk_platform.h */; };
A769B11A23E259AE00872273 /* SDL_cocoametalview.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68623E2513E00DCD162 /* SDL_cocoametalview.h */; }; A769B11A23E259AE00872273 /* SDL_cocoametalview.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68623E2513E00DCD162 /* SDL_cocoametalview.h */; };
A769B11B23E259AE00872273 /* SDL_cocoaopengles.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69023E2513E00DCD162 /* SDL_cocoaopengles.h */; }; A769B11B23E259AE00872273 /* SDL_cocoaopengles.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69023E2513E00DCD162 /* SDL_cocoaopengles.h */; };
@ -1196,7 +1191,6 @@
A769B18723E259AE00872273 /* SDL_hidapi_xbox360w.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A7C823E2513E00DCD162 /* SDL_hidapi_xbox360w.c */; }; A769B18723E259AE00872273 /* SDL_hidapi_xbox360w.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A7C823E2513E00DCD162 /* SDL_hidapi_xbox360w.c */; };
A769B18823E259AE00872273 /* SDL_atomic.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A57423E2513D00DCD162 /* SDL_atomic.c */; }; A769B18823E259AE00872273 /* SDL_atomic.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A57423E2513D00DCD162 /* SDL_atomic.c */; };
A769B18923E259AE00872273 /* SDL_displayevents.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92D23E2514000DCD162 /* SDL_displayevents.c */; }; A769B18923E259AE00872273 /* SDL_displayevents.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A92D23E2514000DCD162 /* SDL_displayevents.c */; };
A769B18A23E259AE00872273 /* SDL_cocoamousetap.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A69723E2513E00DCD162 /* SDL_cocoamousetap.m */; };
A769B18B23E259AE00872273 /* SDL_log.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A5DD23E2513D00DCD162 /* SDL_log.c */; }; A769B18B23E259AE00872273 /* SDL_log.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A5DD23E2513D00DCD162 /* SDL_log.c */; };
A769B18C23E259AE00872273 /* SDL_cocoaopengl.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A67F23E2513E00DCD162 /* SDL_cocoaopengl.m */; }; A769B18C23E259AE00872273 /* SDL_cocoaopengl.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A67F23E2513E00DCD162 /* SDL_cocoaopengl.m */; };
A769B18D23E259AE00872273 /* SDL_offscreenframebuffer.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A5F223E2513D00DCD162 /* SDL_offscreenframebuffer.c */; }; A769B18D23E259AE00872273 /* SDL_offscreenframebuffer.c in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A5F223E2513D00DCD162 /* SDL_offscreenframebuffer.c */; };
@ -2062,12 +2056,6 @@
A7D8AEBB23E2514100DCD162 /* SDL_cocoamouse.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A68723E2513E00DCD162 /* SDL_cocoamouse.m */; }; A7D8AEBB23E2514100DCD162 /* SDL_cocoamouse.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A68723E2513E00DCD162 /* SDL_cocoamouse.m */; };
A7D8AEBC23E2514100DCD162 /* SDL_cocoamouse.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A68723E2513E00DCD162 /* SDL_cocoamouse.m */; }; A7D8AEBC23E2514100DCD162 /* SDL_cocoamouse.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A68723E2513E00DCD162 /* SDL_cocoamouse.m */; };
A7D8AEBD23E2514100DCD162 /* SDL_cocoamouse.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A68723E2513E00DCD162 /* SDL_cocoamouse.m */; }; A7D8AEBD23E2514100DCD162 /* SDL_cocoamouse.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A68723E2513E00DCD162 /* SDL_cocoamouse.m */; };
A7D8AEBE23E2514100DCD162 /* SDL_cocoamousetap.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68823E2513E00DCD162 /* SDL_cocoamousetap.h */; };
A7D8AEBF23E2514100DCD162 /* SDL_cocoamousetap.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68823E2513E00DCD162 /* SDL_cocoamousetap.h */; };
A7D8AEC023E2514100DCD162 /* SDL_cocoamousetap.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68823E2513E00DCD162 /* SDL_cocoamousetap.h */; };
A7D8AEC123E2514100DCD162 /* SDL_cocoamousetap.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68823E2513E00DCD162 /* SDL_cocoamousetap.h */; };
A7D8AEC223E2514100DCD162 /* SDL_cocoamousetap.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68823E2513E00DCD162 /* SDL_cocoamousetap.h */; };
A7D8AEC323E2514100DCD162 /* SDL_cocoamousetap.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A68823E2513E00DCD162 /* SDL_cocoamousetap.h */; };
A7D8AEC423E2514100DCD162 /* SDL_cocoaevents.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A68923E2513E00DCD162 /* SDL_cocoaevents.m */; }; A7D8AEC423E2514100DCD162 /* SDL_cocoaevents.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A68923E2513E00DCD162 /* SDL_cocoaevents.m */; };
A7D8AEC523E2514100DCD162 /* SDL_cocoaevents.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A68923E2513E00DCD162 /* SDL_cocoaevents.m */; }; A7D8AEC523E2514100DCD162 /* SDL_cocoaevents.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A68923E2513E00DCD162 /* SDL_cocoaevents.m */; };
A7D8AEC623E2514100DCD162 /* SDL_cocoaevents.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A68923E2513E00DCD162 /* SDL_cocoaevents.m */; }; A7D8AEC623E2514100DCD162 /* SDL_cocoaevents.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A68923E2513E00DCD162 /* SDL_cocoaevents.m */; };
@ -2152,12 +2140,6 @@
A7D8AF1523E2514100DCD162 /* SDL_cocoaevents.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69623E2513E00DCD162 /* SDL_cocoaevents.h */; }; A7D8AF1523E2514100DCD162 /* SDL_cocoaevents.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69623E2513E00DCD162 /* SDL_cocoaevents.h */; };
A7D8AF1623E2514100DCD162 /* SDL_cocoaevents.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69623E2513E00DCD162 /* SDL_cocoaevents.h */; }; A7D8AF1623E2514100DCD162 /* SDL_cocoaevents.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69623E2513E00DCD162 /* SDL_cocoaevents.h */; };
A7D8AF1723E2514100DCD162 /* SDL_cocoaevents.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69623E2513E00DCD162 /* SDL_cocoaevents.h */; }; A7D8AF1723E2514100DCD162 /* SDL_cocoaevents.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69623E2513E00DCD162 /* SDL_cocoaevents.h */; };
A7D8AF1823E2514100DCD162 /* SDL_cocoamousetap.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A69723E2513E00DCD162 /* SDL_cocoamousetap.m */; };
A7D8AF1923E2514100DCD162 /* SDL_cocoamousetap.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A69723E2513E00DCD162 /* SDL_cocoamousetap.m */; };
A7D8AF1A23E2514100DCD162 /* SDL_cocoamousetap.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A69723E2513E00DCD162 /* SDL_cocoamousetap.m */; };
A7D8AF1B23E2514100DCD162 /* SDL_cocoamousetap.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A69723E2513E00DCD162 /* SDL_cocoamousetap.m */; };
A7D8AF1C23E2514100DCD162 /* SDL_cocoamousetap.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A69723E2513E00DCD162 /* SDL_cocoamousetap.m */; };
A7D8AF1D23E2514100DCD162 /* SDL_cocoamousetap.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D8A69723E2513E00DCD162 /* SDL_cocoamousetap.m */; };
A7D8AF1E23E2514100DCD162 /* SDL_cocoamouse.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69823E2513E00DCD162 /* SDL_cocoamouse.h */; }; A7D8AF1E23E2514100DCD162 /* SDL_cocoamouse.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69823E2513E00DCD162 /* SDL_cocoamouse.h */; };
A7D8AF1F23E2514100DCD162 /* SDL_cocoamouse.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69823E2513E00DCD162 /* SDL_cocoamouse.h */; }; A7D8AF1F23E2514100DCD162 /* SDL_cocoamouse.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69823E2513E00DCD162 /* SDL_cocoamouse.h */; };
A7D8AF2023E2514100DCD162 /* SDL_cocoamouse.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69823E2513E00DCD162 /* SDL_cocoamouse.h */; }; A7D8AF2023E2514100DCD162 /* SDL_cocoamouse.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D8A69823E2513E00DCD162 /* SDL_cocoamouse.h */; };
@ -3728,7 +3710,7 @@
DB31408D17554D3C006C0E22 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00CFA89C106B4BA100758660 /* ForceFeedback.framework */; }; DB31408D17554D3C006C0E22 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00CFA89C106B4BA100758660 /* ForceFeedback.framework */; };
F3631C6424884ACF004F28EA /* SDL_locale.h in Headers */ = {isa = PBXBuildFile; fileRef = 566E26792462701100718109 /* SDL_locale.h */; settings = {ATTRIBUTES = (Public, ); }; }; F3631C6424884ACF004F28EA /* SDL_locale.h in Headers */ = {isa = PBXBuildFile; fileRef = 566E26792462701100718109 /* SDL_locale.h */; settings = {ATTRIBUTES = (Public, ); }; };
F3631C652488534E004F28EA /* SDL_locale.h in Headers */ = {isa = PBXBuildFile; fileRef = 566E26792462701100718109 /* SDL_locale.h */; settings = {ATTRIBUTES = (Public, ); }; }; F3631C652488534E004F28EA /* SDL_locale.h in Headers */ = {isa = PBXBuildFile; fileRef = 566E26792462701100718109 /* SDL_locale.h */; settings = {ATTRIBUTES = (Public, ); }; };
F376F6192559B29300CFC0BC /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F376F6182559B29300CFC0BC /* OpenGLES.framework */; }; F376F6192559B29300CFC0BC /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F376F6182559B29300CFC0BC /* OpenGLES.framework */; platformFilter = ios; };
F376F61B2559B2AF00CFC0BC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F376F61A2559B2AF00CFC0BC /* UIKit.framework */; }; F376F61B2559B2AF00CFC0BC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F376F61A2559B2AF00CFC0BC /* UIKit.framework */; };
F376F6262559B30000CFC0BC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F376F61A2559B2AF00CFC0BC /* UIKit.framework */; }; F376F6262559B30000CFC0BC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F376F61A2559B2AF00CFC0BC /* UIKit.framework */; };
F376F6322559B31D00CFC0BC /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F376F6312559B31D00CFC0BC /* GameController.framework */; }; F376F6322559B31D00CFC0BC /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F376F6312559B31D00CFC0BC /* GameController.framework */; };
@ -3796,13 +3778,13 @@
F395C1A22569C68F00942BFF /* SDL_iokitjoystick.c in Sources */ = {isa = PBXBuildFile; fileRef = F395C1922569C68E00942BFF /* SDL_iokitjoystick.c */; }; F395C1A22569C68F00942BFF /* SDL_iokitjoystick.c in Sources */ = {isa = PBXBuildFile; fileRef = F395C1922569C68E00942BFF /* SDL_iokitjoystick.c */; };
F395C1A32569C68F00942BFF /* SDL_iokitjoystick.c in Sources */ = {isa = PBXBuildFile; fileRef = F395C1922569C68E00942BFF /* SDL_iokitjoystick.c */; }; F395C1A32569C68F00942BFF /* SDL_iokitjoystick.c in Sources */ = {isa = PBXBuildFile; fileRef = F395C1922569C68E00942BFF /* SDL_iokitjoystick.c */; };
F395C1A42569C68F00942BFF /* SDL_iokitjoystick.c in Sources */ = {isa = PBXBuildFile; fileRef = F395C1922569C68E00942BFF /* SDL_iokitjoystick.c */; }; F395C1A42569C68F00942BFF /* SDL_iokitjoystick.c in Sources */ = {isa = PBXBuildFile; fileRef = F395C1922569C68E00942BFF /* SDL_iokitjoystick.c */; };
F395C1B12569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; }; F395C1B12569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
F395C1B22569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; }; F395C1B22569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; };
F395C1B32569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; }; F395C1B32569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; };
F395C1B42569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; }; F395C1B42569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
F395C1B52569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; }; F395C1B52569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; };
F395C1B62569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; }; F395C1B62569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; };
F395C1B72569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; }; F395C1B72569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
F395C1B82569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; }; F395C1B82569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; };
F395C1B92569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; }; F395C1B92569C6A000942BFF /* SDL_mfijoystick.m in Sources */ = {isa = PBXBuildFile; fileRef = F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */; };
F395C1BA2569C6A000942BFF /* SDL_mfijoystick_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F395C1B02569C6A000942BFF /* SDL_mfijoystick_c.h */; }; F395C1BA2569C6A000942BFF /* SDL_mfijoystick_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F395C1B02569C6A000942BFF /* SDL_mfijoystick_c.h */; };
@ -3814,6 +3796,15 @@
F395C1C02569C6A000942BFF /* SDL_mfijoystick_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F395C1B02569C6A000942BFF /* SDL_mfijoystick_c.h */; }; F395C1C02569C6A000942BFF /* SDL_mfijoystick_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F395C1B02569C6A000942BFF /* SDL_mfijoystick_c.h */; };
F395C1C12569C6A000942BFF /* SDL_mfijoystick_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F395C1B02569C6A000942BFF /* SDL_mfijoystick_c.h */; }; F395C1C12569C6A000942BFF /* SDL_mfijoystick_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F395C1B02569C6A000942BFF /* SDL_mfijoystick_c.h */; };
F395C1C22569C6A000942BFF /* SDL_mfijoystick_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F395C1B02569C6A000942BFF /* SDL_mfijoystick_c.h */; }; F395C1C22569C6A000942BFF /* SDL_mfijoystick_c.h in Headers */ = {isa = PBXBuildFile; fileRef = F395C1B02569C6A000942BFF /* SDL_mfijoystick_c.h */; };
F3984CD025BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */ = {isa = PBXBuildFile; fileRef = F3984CCF25BCC92800374F43 /* SDL_hidapi_stadia.c */; };
F3984CD125BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */ = {isa = PBXBuildFile; fileRef = F3984CCF25BCC92800374F43 /* SDL_hidapi_stadia.c */; };
F3984CD225BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */ = {isa = PBXBuildFile; fileRef = F3984CCF25BCC92800374F43 /* SDL_hidapi_stadia.c */; };
F3984CD325BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */ = {isa = PBXBuildFile; fileRef = F3984CCF25BCC92800374F43 /* SDL_hidapi_stadia.c */; };
F3984CD425BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */ = {isa = PBXBuildFile; fileRef = F3984CCF25BCC92800374F43 /* SDL_hidapi_stadia.c */; };
F3984CD525BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */ = {isa = PBXBuildFile; fileRef = F3984CCF25BCC92800374F43 /* SDL_hidapi_stadia.c */; };
F3984CD625BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */ = {isa = PBXBuildFile; fileRef = F3984CCF25BCC92800374F43 /* SDL_hidapi_stadia.c */; };
F3984CD725BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */ = {isa = PBXBuildFile; fileRef = F3984CCF25BCC92800374F43 /* SDL_hidapi_stadia.c */; };
F3984CD825BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */ = {isa = PBXBuildFile; fileRef = F3984CCF25BCC92800374F43 /* SDL_hidapi_stadia.c */; };
F3A4909E2554D38600E92A8B /* SDL_hidapi_ps5.c in Sources */ = {isa = PBXBuildFile; fileRef = F3A4909D2554D38500E92A8B /* SDL_hidapi_ps5.c */; }; F3A4909E2554D38600E92A8B /* SDL_hidapi_ps5.c in Sources */ = {isa = PBXBuildFile; fileRef = F3A4909D2554D38500E92A8B /* SDL_hidapi_ps5.c */; };
F3A4909F2554D38600E92A8B /* SDL_hidapi_ps5.c in Sources */ = {isa = PBXBuildFile; fileRef = F3A4909D2554D38500E92A8B /* SDL_hidapi_ps5.c */; }; F3A4909F2554D38600E92A8B /* SDL_hidapi_ps5.c in Sources */ = {isa = PBXBuildFile; fileRef = F3A4909D2554D38500E92A8B /* SDL_hidapi_ps5.c */; };
F3A490A02554D38600E92A8B /* SDL_hidapi_ps5.c in Sources */ = {isa = PBXBuildFile; fileRef = F3A4909D2554D38500E92A8B /* SDL_hidapi_ps5.c */; }; F3A490A02554D38600E92A8B /* SDL_hidapi_ps5.c in Sources */ = {isa = PBXBuildFile; fileRef = F3A4909D2554D38500E92A8B /* SDL_hidapi_ps5.c */; };
@ -4042,7 +4033,6 @@
A7D8A68523E2513E00DCD162 /* SDL_cocoavideo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoavideo.m; sourceTree = "<group>"; }; A7D8A68523E2513E00DCD162 /* SDL_cocoavideo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoavideo.m; sourceTree = "<group>"; };
A7D8A68623E2513E00DCD162 /* SDL_cocoametalview.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_cocoametalview.h; sourceTree = "<group>"; }; A7D8A68623E2513E00DCD162 /* SDL_cocoametalview.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_cocoametalview.h; sourceTree = "<group>"; };
A7D8A68723E2513E00DCD162 /* SDL_cocoamouse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoamouse.m; sourceTree = "<group>"; }; A7D8A68723E2513E00DCD162 /* SDL_cocoamouse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoamouse.m; sourceTree = "<group>"; };
A7D8A68823E2513E00DCD162 /* SDL_cocoamousetap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_cocoamousetap.h; sourceTree = "<group>"; };
A7D8A68923E2513E00DCD162 /* SDL_cocoaevents.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoaevents.m; sourceTree = "<group>"; }; A7D8A68923E2513E00DCD162 /* SDL_cocoaevents.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoaevents.m; sourceTree = "<group>"; };
A7D8A68A23E2513E00DCD162 /* SDL_cocoaclipboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_cocoaclipboard.h; sourceTree = "<group>"; }; A7D8A68A23E2513E00DCD162 /* SDL_cocoaclipboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_cocoaclipboard.h; sourceTree = "<group>"; };
A7D8A68B23E2513E00DCD162 /* SDL_cocoamessagebox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoamessagebox.m; sourceTree = "<group>"; }; A7D8A68B23E2513E00DCD162 /* SDL_cocoamessagebox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoamessagebox.m; sourceTree = "<group>"; };
@ -4057,7 +4047,6 @@
A7D8A69423E2513E00DCD162 /* SDL_cocoamessagebox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_cocoamessagebox.h; sourceTree = "<group>"; }; A7D8A69423E2513E00DCD162 /* SDL_cocoamessagebox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_cocoamessagebox.h; sourceTree = "<group>"; };
A7D8A69523E2513E00DCD162 /* SDL_cocoaclipboard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoaclipboard.m; sourceTree = "<group>"; }; A7D8A69523E2513E00DCD162 /* SDL_cocoaclipboard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoaclipboard.m; sourceTree = "<group>"; };
A7D8A69623E2513E00DCD162 /* SDL_cocoaevents.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_cocoaevents.h; sourceTree = "<group>"; }; A7D8A69623E2513E00DCD162 /* SDL_cocoaevents.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_cocoaevents.h; sourceTree = "<group>"; };
A7D8A69723E2513E00DCD162 /* SDL_cocoamousetap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoamousetap.m; sourceTree = "<group>"; };
A7D8A69823E2513E00DCD162 /* SDL_cocoamouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_cocoamouse.h; sourceTree = "<group>"; }; A7D8A69823E2513E00DCD162 /* SDL_cocoamouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_cocoamouse.h; sourceTree = "<group>"; };
A7D8A69923E2513E00DCD162 /* SDL_cocoametalview.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoametalview.m; sourceTree = "<group>"; }; A7D8A69923E2513E00DCD162 /* SDL_cocoametalview.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_cocoametalview.m; sourceTree = "<group>"; };
A7D8A6B623E2513E00DCD162 /* SDL_egl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_egl.c; sourceTree = "<group>"; }; A7D8A6B623E2513E00DCD162 /* SDL_egl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_egl.c; sourceTree = "<group>"; };
@ -4375,6 +4364,7 @@
F395C1922569C68E00942BFF /* SDL_iokitjoystick.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_iokitjoystick.c; sourceTree = "<group>"; }; F395C1922569C68E00942BFF /* SDL_iokitjoystick.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_iokitjoystick.c; sourceTree = "<group>"; };
F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_mfijoystick.m; sourceTree = "<group>"; }; F395C1AF2569C6A000942BFF /* SDL_mfijoystick.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_mfijoystick.m; sourceTree = "<group>"; };
F395C1B02569C6A000942BFF /* SDL_mfijoystick_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_mfijoystick_c.h; sourceTree = "<group>"; }; F395C1B02569C6A000942BFF /* SDL_mfijoystick_c.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_mfijoystick_c.h; sourceTree = "<group>"; };
F3984CCF25BCC92800374F43 /* SDL_hidapi_stadia.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_hidapi_stadia.c; sourceTree = "<group>"; };
F3A4909D2554D38500E92A8B /* SDL_hidapi_ps5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_hidapi_ps5.c; sourceTree = "<group>"; }; F3A4909D2554D38500E92A8B /* SDL_hidapi_ps5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_hidapi_ps5.c; sourceTree = "<group>"; };
F3ADAB8D2576F0B300A6B1D9 /* SDL_sysurl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_sysurl.m; sourceTree = "<group>"; }; F3ADAB8D2576F0B300A6B1D9 /* SDL_sysurl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDL_sysurl.m; sourceTree = "<group>"; };
F59C710300D5CB5801000001 /* ReadMe.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = ReadMe.txt; sourceTree = "<group>"; }; F59C710300D5CB5801000001 /* ReadMe.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = ReadMe.txt; sourceTree = "<group>"; };
@ -5072,8 +5062,6 @@
A7D8A68123E2513E00DCD162 /* SDL_cocoamodes.m */, A7D8A68123E2513E00DCD162 /* SDL_cocoamodes.m */,
A7D8A69823E2513E00DCD162 /* SDL_cocoamouse.h */, A7D8A69823E2513E00DCD162 /* SDL_cocoamouse.h */,
A7D8A68723E2513E00DCD162 /* SDL_cocoamouse.m */, A7D8A68723E2513E00DCD162 /* SDL_cocoamouse.m */,
A7D8A68823E2513E00DCD162 /* SDL_cocoamousetap.h */,
A7D8A69723E2513E00DCD162 /* SDL_cocoamousetap.m */,
A7D8A68D23E2513E00DCD162 /* SDL_cocoaopengl.h */, A7D8A68D23E2513E00DCD162 /* SDL_cocoaopengl.h */,
A7D8A67F23E2513E00DCD162 /* SDL_cocoaopengl.m */, A7D8A67F23E2513E00DCD162 /* SDL_cocoaopengl.m */,
A7D8A69023E2513E00DCD162 /* SDL_cocoaopengles.h */, A7D8A69023E2513E00DCD162 /* SDL_cocoaopengles.h */,
@ -5296,6 +5284,7 @@
F3A4909D2554D38500E92A8B /* SDL_hidapi_ps5.c */, F3A4909D2554D38500E92A8B /* SDL_hidapi_ps5.c */,
A75FDBC423EA380300529352 /* SDL_hidapi_rumble.c */, A75FDBC423EA380300529352 /* SDL_hidapi_rumble.c */,
A75FDBC323EA380300529352 /* SDL_hidapi_rumble.h */, A75FDBC323EA380300529352 /* SDL_hidapi_rumble.h */,
F3984CCF25BCC92800374F43 /* SDL_hidapi_stadia.c */,
A75FDAAC23E2795C00529352 /* SDL_hidapi_steam.c */, A75FDAAC23E2795C00529352 /* SDL_hidapi_steam.c */,
A7D8A7C623E2513E00DCD162 /* SDL_hidapi_switch.c */, A7D8A7C623E2513E00DCD162 /* SDL_hidapi_switch.c */,
A7D8A7C223E2513E00DCD162 /* SDL_hidapi_xbox360.c */, A7D8A7C223E2513E00DCD162 /* SDL_hidapi_xbox360.c */,
@ -5817,7 +5806,6 @@
A75FCD8D23E25AB700529352 /* gl2platform.h in Headers */, A75FCD8D23E25AB700529352 /* gl2platform.h in Headers */,
A75FCD8E23E25AB700529352 /* SDL_pixels.h in Headers */, A75FCD8E23E25AB700529352 /* SDL_pixels.h in Headers */,
A75FCD8F23E25AB700529352 /* vk_layer.h in Headers */, A75FCD8F23E25AB700529352 /* vk_layer.h in Headers */,
A75FCD9023E25AB700529352 /* SDL_cocoamousetap.h in Headers */,
A75FCD9123E25AB700529352 /* vk_platform.h in Headers */, A75FCD9123E25AB700529352 /* vk_platform.h in Headers */,
A75FCD9223E25AB700529352 /* SDL_cocoametalview.h in Headers */, A75FCD9223E25AB700529352 /* SDL_cocoametalview.h in Headers */,
A75FCD9323E25AB700529352 /* SDL_cocoaopengles.h in Headers */, A75FCD9323E25AB700529352 /* SDL_cocoaopengles.h in Headers */,
@ -6060,7 +6048,6 @@
A75FCF4623E25AC700529352 /* gl2platform.h in Headers */, A75FCF4623E25AC700529352 /* gl2platform.h in Headers */,
A75FCF4723E25AC700529352 /* SDL_pixels.h in Headers */, A75FCF4723E25AC700529352 /* SDL_pixels.h in Headers */,
A75FCF4823E25AC700529352 /* vk_layer.h in Headers */, A75FCF4823E25AC700529352 /* vk_layer.h in Headers */,
A75FCF4923E25AC700529352 /* SDL_cocoamousetap.h in Headers */,
A75FCF4A23E25AC700529352 /* vk_platform.h in Headers */, A75FCF4A23E25AC700529352 /* vk_platform.h in Headers */,
A75FCF4B23E25AC700529352 /* SDL_cocoametalview.h in Headers */, A75FCF4B23E25AC700529352 /* SDL_cocoametalview.h in Headers */,
A75FCF4C23E25AC700529352 /* SDL_cocoaopengles.h in Headers */, A75FCF4C23E25AC700529352 /* SDL_cocoaopengles.h in Headers */,
@ -6292,7 +6279,6 @@
A769B11223E259AE00872273 /* SDL_cocoavulkan.h in Headers */, A769B11223E259AE00872273 /* SDL_cocoavulkan.h in Headers */,
A769B11323E259AE00872273 /* gl2platform.h in Headers */, A769B11323E259AE00872273 /* gl2platform.h in Headers */,
A769B11523E259AE00872273 /* vk_layer.h in Headers */, A769B11523E259AE00872273 /* vk_layer.h in Headers */,
A769B11723E259AE00872273 /* SDL_cocoamousetap.h in Headers */,
A769B11823E259AE00872273 /* vk_platform.h in Headers */, A769B11823E259AE00872273 /* vk_platform.h in Headers */,
A769B11A23E259AE00872273 /* SDL_cocoametalview.h in Headers */, A769B11A23E259AE00872273 /* SDL_cocoametalview.h in Headers */,
A769B11B23E259AE00872273 /* SDL_cocoaopengles.h in Headers */, A769B11B23E259AE00872273 /* SDL_cocoaopengles.h in Headers */,
@ -6388,7 +6374,6 @@
A7D8AEB323E2514100DCD162 /* SDL_cocoametalview.h in Headers */, A7D8AEB323E2514100DCD162 /* SDL_cocoametalview.h in Headers */,
A7D8AEF523E2514100DCD162 /* SDL_cocoamodes.h in Headers */, A7D8AEF523E2514100DCD162 /* SDL_cocoamodes.h in Headers */,
A7D8AF1F23E2514100DCD162 /* SDL_cocoamouse.h in Headers */, A7D8AF1F23E2514100DCD162 /* SDL_cocoamouse.h in Headers */,
A7D8AEBF23E2514100DCD162 /* SDL_cocoamousetap.h in Headers */,
A7D8AEDD23E2514100DCD162 /* SDL_cocoaopengl.h in Headers */, A7D8AEDD23E2514100DCD162 /* SDL_cocoaopengl.h in Headers */,
A7D8AEEF23E2514100DCD162 /* SDL_cocoaopengles.h in Headers */, A7D8AEEF23E2514100DCD162 /* SDL_cocoaopengles.h in Headers */,
A7D8AE8323E2514100DCD162 /* SDL_cocoashape.h in Headers */, A7D8AE8323E2514100DCD162 /* SDL_cocoashape.h in Headers */,
@ -6636,7 +6621,6 @@
A7D8AEB423E2514100DCD162 /* SDL_cocoametalview.h in Headers */, A7D8AEB423E2514100DCD162 /* SDL_cocoametalview.h in Headers */,
A7D8AEF623E2514100DCD162 /* SDL_cocoamodes.h in Headers */, A7D8AEF623E2514100DCD162 /* SDL_cocoamodes.h in Headers */,
A7D8AF2023E2514100DCD162 /* SDL_cocoamouse.h in Headers */, A7D8AF2023E2514100DCD162 /* SDL_cocoamouse.h in Headers */,
A7D8AEC023E2514100DCD162 /* SDL_cocoamousetap.h in Headers */,
A7D8AEDE23E2514100DCD162 /* SDL_cocoaopengl.h in Headers */, A7D8AEDE23E2514100DCD162 /* SDL_cocoaopengl.h in Headers */,
A7D8AEF023E2514100DCD162 /* SDL_cocoaopengles.h in Headers */, A7D8AEF023E2514100DCD162 /* SDL_cocoaopengles.h in Headers */,
A7D8AE8423E2514100DCD162 /* SDL_cocoashape.h in Headers */, A7D8AE8423E2514100DCD162 /* SDL_cocoashape.h in Headers */,
@ -6972,7 +6956,6 @@
A7D8AEEC23E2514100DCD162 /* SDL_cocoavulkan.h in Headers */, A7D8AEEC23E2514100DCD162 /* SDL_cocoavulkan.h in Headers */,
A7D8B23423E2514200DCD162 /* gl2platform.h in Headers */, A7D8B23423E2514200DCD162 /* gl2platform.h in Headers */,
A7D8B25223E2514200DCD162 /* vk_layer.h in Headers */, A7D8B25223E2514200DCD162 /* vk_layer.h in Headers */,
A7D8AEC223E2514100DCD162 /* SDL_cocoamousetap.h in Headers */,
A7D8B26A23E2514200DCD162 /* vk_platform.h in Headers */, A7D8B26A23E2514200DCD162 /* vk_platform.h in Headers */,
A7D8AEB623E2514100DCD162 /* SDL_cocoametalview.h in Headers */, A7D8AEB623E2514100DCD162 /* SDL_cocoametalview.h in Headers */,
A7D8AEF223E2514100DCD162 /* SDL_cocoaopengles.h in Headers */, A7D8AEF223E2514100DCD162 /* SDL_cocoaopengles.h in Headers */,
@ -7068,7 +7051,6 @@
A7D8AEB223E2514100DCD162 /* SDL_cocoametalview.h in Headers */, A7D8AEB223E2514100DCD162 /* SDL_cocoametalview.h in Headers */,
A7D8AEF423E2514100DCD162 /* SDL_cocoamodes.h in Headers */, A7D8AEF423E2514100DCD162 /* SDL_cocoamodes.h in Headers */,
A7D8AF1E23E2514100DCD162 /* SDL_cocoamouse.h in Headers */, A7D8AF1E23E2514100DCD162 /* SDL_cocoamouse.h in Headers */,
A7D8AEBE23E2514100DCD162 /* SDL_cocoamousetap.h in Headers */,
A7D8AEDC23E2514100DCD162 /* SDL_cocoaopengl.h in Headers */, A7D8AEDC23E2514100DCD162 /* SDL_cocoaopengl.h in Headers */,
A7D8AEEE23E2514100DCD162 /* SDL_cocoaopengles.h in Headers */, A7D8AEEE23E2514100DCD162 /* SDL_cocoaopengles.h in Headers */,
A7D8AE8223E2514100DCD162 /* SDL_cocoashape.h in Headers */, A7D8AE8223E2514100DCD162 /* SDL_cocoashape.h in Headers */,
@ -7399,7 +7381,6 @@
A7D8AEEB23E2514100DCD162 /* SDL_cocoavulkan.h in Headers */, A7D8AEEB23E2514100DCD162 /* SDL_cocoavulkan.h in Headers */,
A7D8B23323E2514200DCD162 /* gl2platform.h in Headers */, A7D8B23323E2514200DCD162 /* gl2platform.h in Headers */,
A7D8B25123E2514200DCD162 /* vk_layer.h in Headers */, A7D8B25123E2514200DCD162 /* vk_layer.h in Headers */,
A7D8AEC123E2514100DCD162 /* SDL_cocoamousetap.h in Headers */,
A7D8B26923E2514200DCD162 /* vk_platform.h in Headers */, A7D8B26923E2514200DCD162 /* vk_platform.h in Headers */,
A7D8BBF323E2574800DCD162 /* SDL_uikitmessagebox.h in Headers */, A7D8BBF323E2574800DCD162 /* SDL_uikitmessagebox.h in Headers */,
A7D8AEB523E2514100DCD162 /* SDL_cocoametalview.h in Headers */, A7D8AEB523E2514100DCD162 /* SDL_cocoametalview.h in Headers */,
@ -7621,7 +7602,6 @@
A7D8B23523E2514200DCD162 /* gl2platform.h in Headers */, A7D8B23523E2514200DCD162 /* gl2platform.h in Headers */,
DB313FE517554B71006C0E22 /* SDL_pixels.h in Headers */, DB313FE517554B71006C0E22 /* SDL_pixels.h in Headers */,
A7D8B25323E2514200DCD162 /* vk_layer.h in Headers */, A7D8B25323E2514200DCD162 /* vk_layer.h in Headers */,
A7D8AEC323E2514100DCD162 /* SDL_cocoamousetap.h in Headers */,
A7D8B26B23E2514200DCD162 /* vk_platform.h in Headers */, A7D8B26B23E2514200DCD162 /* vk_platform.h in Headers */,
A7D8AEB723E2514100DCD162 /* SDL_cocoametalview.h in Headers */, A7D8AEB723E2514100DCD162 /* SDL_cocoametalview.h in Headers */,
A7D8AEF323E2514100DCD162 /* SDL_cocoaopengles.h in Headers */, A7D8AEF323E2514100DCD162 /* SDL_cocoaopengles.h in Headers */,
@ -8170,7 +8150,6 @@
A75FCDFE23E25AB700529352 /* SDL_hidapi_xbox360w.c in Sources */, A75FCDFE23E25AB700529352 /* SDL_hidapi_xbox360w.c in Sources */,
A75FCDFF23E25AB700529352 /* SDL_atomic.c in Sources */, A75FCDFF23E25AB700529352 /* SDL_atomic.c in Sources */,
A75FCE0023E25AB700529352 /* SDL_displayevents.c in Sources */, A75FCE0023E25AB700529352 /* SDL_displayevents.c in Sources */,
A75FCE0123E25AB700529352 /* SDL_cocoamousetap.m in Sources */,
A75FCE0223E25AB700529352 /* SDL_log.c in Sources */, A75FCE0223E25AB700529352 /* SDL_log.c in Sources */,
A75FCE0323E25AB700529352 /* SDL_cocoaopengl.m in Sources */, A75FCE0323E25AB700529352 /* SDL_cocoaopengl.m in Sources */,
A75FCE0423E25AB700529352 /* SDL_offscreenframebuffer.c in Sources */, A75FCE0423E25AB700529352 /* SDL_offscreenframebuffer.c in Sources */,
@ -8204,6 +8183,7 @@
A75FCE2023E25AB700529352 /* SDL_haptic.c in Sources */, A75FCE2023E25AB700529352 /* SDL_haptic.c in Sources */,
A75FCE2123E25AB700529352 /* SDL_uikitvulkan.m in Sources */, A75FCE2123E25AB700529352 /* SDL_uikitvulkan.m in Sources */,
A75FCE2223E25AB700529352 /* SDL_x11modes.c in Sources */, A75FCE2223E25AB700529352 /* SDL_x11modes.c in Sources */,
F3984CD725BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */,
75E09161241EA924004729E1 /* SDL_virtualjoystick.c in Sources */, 75E09161241EA924004729E1 /* SDL_virtualjoystick.c in Sources */,
A75FCE2323E25AB700529352 /* SDL_cocoametalview.m in Sources */, A75FCE2323E25AB700529352 /* SDL_cocoametalview.m in Sources */,
A75FCE2423E25AB700529352 /* SDL_audiotypecvt.c in Sources */, A75FCE2423E25AB700529352 /* SDL_audiotypecvt.c in Sources */,
@ -8371,7 +8351,6 @@
A75FCFB723E25AC700529352 /* SDL_hidapi_xbox360w.c in Sources */, A75FCFB723E25AC700529352 /* SDL_hidapi_xbox360w.c in Sources */,
A75FCFB823E25AC700529352 /* SDL_atomic.c in Sources */, A75FCFB823E25AC700529352 /* SDL_atomic.c in Sources */,
A75FCFB923E25AC700529352 /* SDL_displayevents.c in Sources */, A75FCFB923E25AC700529352 /* SDL_displayevents.c in Sources */,
A75FCFBA23E25AC700529352 /* SDL_cocoamousetap.m in Sources */,
A75FCFBB23E25AC700529352 /* SDL_log.c in Sources */, A75FCFBB23E25AC700529352 /* SDL_log.c in Sources */,
A75FCFBC23E25AC700529352 /* SDL_cocoaopengl.m in Sources */, A75FCFBC23E25AC700529352 /* SDL_cocoaopengl.m in Sources */,
A75FCFBD23E25AC700529352 /* SDL_offscreenframebuffer.c in Sources */, A75FCFBD23E25AC700529352 /* SDL_offscreenframebuffer.c in Sources */,
@ -8405,6 +8384,7 @@
A75FCFD923E25AC700529352 /* SDL_haptic.c in Sources */, A75FCFD923E25AC700529352 /* SDL_haptic.c in Sources */,
A75FCFDA23E25AC700529352 /* SDL_uikitvulkan.m in Sources */, A75FCFDA23E25AC700529352 /* SDL_uikitvulkan.m in Sources */,
A75FCFDB23E25AC700529352 /* SDL_x11modes.c in Sources */, A75FCFDB23E25AC700529352 /* SDL_x11modes.c in Sources */,
F3984CD825BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */,
75E09162241EA924004729E1 /* SDL_virtualjoystick.c in Sources */, 75E09162241EA924004729E1 /* SDL_virtualjoystick.c in Sources */,
A75FCFDC23E25AC700529352 /* SDL_cocoametalview.m in Sources */, A75FCFDC23E25AC700529352 /* SDL_cocoametalview.m in Sources */,
A75FCFDD23E25AC700529352 /* SDL_audiotypecvt.c in Sources */, A75FCFDD23E25AC700529352 /* SDL_audiotypecvt.c in Sources */,
@ -8593,7 +8573,6 @@
A769B18723E259AE00872273 /* SDL_hidapi_xbox360w.c in Sources */, A769B18723E259AE00872273 /* SDL_hidapi_xbox360w.c in Sources */,
A769B18823E259AE00872273 /* SDL_atomic.c in Sources */, A769B18823E259AE00872273 /* SDL_atomic.c in Sources */,
A769B18923E259AE00872273 /* SDL_displayevents.c in Sources */, A769B18923E259AE00872273 /* SDL_displayevents.c in Sources */,
A769B18A23E259AE00872273 /* SDL_cocoamousetap.m in Sources */,
A769B18B23E259AE00872273 /* SDL_log.c in Sources */, A769B18B23E259AE00872273 /* SDL_log.c in Sources */,
A769B18C23E259AE00872273 /* SDL_cocoaopengl.m in Sources */, A769B18C23E259AE00872273 /* SDL_cocoaopengl.m in Sources */,
A769B18D23E259AE00872273 /* SDL_offscreenframebuffer.c in Sources */, A769B18D23E259AE00872273 /* SDL_offscreenframebuffer.c in Sources */,
@ -8718,6 +8697,7 @@
A769B20223E259AE00872273 /* SDL_cocoaopengles.m in Sources */, A769B20223E259AE00872273 /* SDL_cocoaopengles.m in Sources */,
A769B20323E259AE00872273 /* SDL_qsort.c in Sources */, A769B20323E259AE00872273 /* SDL_qsort.c in Sources */,
A769B20423E259AE00872273 /* SDL_hidapi_switch.c in Sources */, A769B20423E259AE00872273 /* SDL_hidapi_switch.c in Sources */,
F3984CD525BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */,
A769B20523E259AE00872273 /* SDL_strtokr.c in Sources */, A769B20523E259AE00872273 /* SDL_strtokr.c in Sources */,
5605720B2473687A00B46B66 /* SDL_syslocale.m in Sources */, 5605720B2473687A00B46B66 /* SDL_syslocale.m in Sources */,
A769B20623E259AE00872273 /* SDL_clipboardevents.c in Sources */, A769B20623E259AE00872273 /* SDL_clipboardevents.c in Sources */,
@ -8796,7 +8776,6 @@
A7D8B55E23E2514300DCD162 /* SDL_hidapi_xbox360w.c in Sources */, A7D8B55E23E2514300DCD162 /* SDL_hidapi_xbox360w.c in Sources */,
A7D8A95823E2514000DCD162 /* SDL_atomic.c in Sources */, A7D8A95823E2514000DCD162 /* SDL_atomic.c in Sources */,
A7D8BB2823E2514500DCD162 /* SDL_displayevents.c in Sources */, A7D8BB2823E2514500DCD162 /* SDL_displayevents.c in Sources */,
A7D8AF1923E2514100DCD162 /* SDL_cocoamousetap.m in Sources */,
A7D8AB2623E2514100DCD162 /* SDL_log.c in Sources */, A7D8AB2623E2514100DCD162 /* SDL_log.c in Sources */,
A7D8AE8923E2514100DCD162 /* SDL_cocoaopengl.m in Sources */, A7D8AE8923E2514100DCD162 /* SDL_cocoaopengl.m in Sources */,
A7D8AB7423E2514100DCD162 /* SDL_offscreenframebuffer.c in Sources */, A7D8AB7423E2514100DCD162 /* SDL_offscreenframebuffer.c in Sources */,
@ -8832,6 +8811,7 @@
A7D8B15323E2514200DCD162 /* SDL_x11modes.c in Sources */, A7D8B15323E2514200DCD162 /* SDL_x11modes.c in Sources */,
A7D8AF2523E2514100DCD162 /* SDL_cocoametalview.m in Sources */, A7D8AF2523E2514100DCD162 /* SDL_cocoametalview.m in Sources */,
A7D8B86123E2514400DCD162 /* SDL_audiotypecvt.c in Sources */, A7D8B86123E2514400DCD162 /* SDL_audiotypecvt.c in Sources */,
F3984CD125BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */,
A7D8AC5823E2514100DCD162 /* SDL_uikitevents.m in Sources */, A7D8AC5823E2514100DCD162 /* SDL_uikitevents.m in Sources */,
A7D8ACB823E2514100DCD162 /* SDL_uikitmodes.m in Sources */, A7D8ACB823E2514100DCD162 /* SDL_uikitmodes.m in Sources */,
A7D8AD3323E2514100DCD162 /* SDL_blit_N.c in Sources */, A7D8AD3323E2514100DCD162 /* SDL_blit_N.c in Sources */,
@ -8997,7 +8977,6 @@
A7D8B55F23E2514300DCD162 /* SDL_hidapi_xbox360w.c in Sources */, A7D8B55F23E2514300DCD162 /* SDL_hidapi_xbox360w.c in Sources */,
A7D8A95923E2514000DCD162 /* SDL_atomic.c in Sources */, A7D8A95923E2514000DCD162 /* SDL_atomic.c in Sources */,
A7D8BB2923E2514500DCD162 /* SDL_displayevents.c in Sources */, A7D8BB2923E2514500DCD162 /* SDL_displayevents.c in Sources */,
A7D8AF1A23E2514100DCD162 /* SDL_cocoamousetap.m in Sources */,
A7D8AB2723E2514100DCD162 /* SDL_log.c in Sources */, A7D8AB2723E2514100DCD162 /* SDL_log.c in Sources */,
A7D8AE8A23E2514100DCD162 /* SDL_cocoaopengl.m in Sources */, A7D8AE8A23E2514100DCD162 /* SDL_cocoaopengl.m in Sources */,
A7D8AB7523E2514100DCD162 /* SDL_offscreenframebuffer.c in Sources */, A7D8AB7523E2514100DCD162 /* SDL_offscreenframebuffer.c in Sources */,
@ -9033,6 +9012,7 @@
A7D8B15423E2514200DCD162 /* SDL_x11modes.c in Sources */, A7D8B15423E2514200DCD162 /* SDL_x11modes.c in Sources */,
A7D8AF2623E2514100DCD162 /* SDL_cocoametalview.m in Sources */, A7D8AF2623E2514100DCD162 /* SDL_cocoametalview.m in Sources */,
A7D8B86223E2514400DCD162 /* SDL_audiotypecvt.c in Sources */, A7D8B86223E2514400DCD162 /* SDL_audiotypecvt.c in Sources */,
F3984CD225BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */,
A7D8AC5923E2514100DCD162 /* SDL_uikitevents.m in Sources */, A7D8AC5923E2514100DCD162 /* SDL_uikitevents.m in Sources */,
A7D8ACB923E2514100DCD162 /* SDL_uikitmodes.m in Sources */, A7D8ACB923E2514100DCD162 /* SDL_uikitmodes.m in Sources */,
A7D8AD3423E2514100DCD162 /* SDL_blit_N.c in Sources */, A7D8AD3423E2514100DCD162 /* SDL_blit_N.c in Sources */,
@ -9197,7 +9177,6 @@
A7D8B56123E2514300DCD162 /* SDL_hidapi_xbox360w.c in Sources */, A7D8B56123E2514300DCD162 /* SDL_hidapi_xbox360w.c in Sources */,
A7D8A95B23E2514000DCD162 /* SDL_atomic.c in Sources */, A7D8A95B23E2514000DCD162 /* SDL_atomic.c in Sources */,
A7D8BB2B23E2514500DCD162 /* SDL_displayevents.c in Sources */, A7D8BB2B23E2514500DCD162 /* SDL_displayevents.c in Sources */,
A7D8AF1C23E2514100DCD162 /* SDL_cocoamousetap.m in Sources */,
A7D8AB2923E2514100DCD162 /* SDL_log.c in Sources */, A7D8AB2923E2514100DCD162 /* SDL_log.c in Sources */,
A7D8AE8C23E2514100DCD162 /* SDL_cocoaopengl.m in Sources */, A7D8AE8C23E2514100DCD162 /* SDL_cocoaopengl.m in Sources */,
A7D8AB7723E2514100DCD162 /* SDL_offscreenframebuffer.c in Sources */, A7D8AB7723E2514100DCD162 /* SDL_offscreenframebuffer.c in Sources */,
@ -9322,6 +9301,7 @@
A7D8AE9E23E2514100DCD162 /* SDL_cocoaopengles.m in Sources */, A7D8AE9E23E2514100DCD162 /* SDL_cocoaopengles.m in Sources */,
A7D8B96C23E2514400DCD162 /* SDL_qsort.c in Sources */, A7D8B96C23E2514400DCD162 /* SDL_qsort.c in Sources */,
A7D8B55523E2514300DCD162 /* SDL_hidapi_switch.c in Sources */, A7D8B55523E2514300DCD162 /* SDL_hidapi_switch.c in Sources */,
F3984CD425BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */,
A7D8B96623E2514400DCD162 /* SDL_strtokr.c in Sources */, A7D8B96623E2514400DCD162 /* SDL_strtokr.c in Sources */,
560572092473687900B46B66 /* SDL_syslocale.m in Sources */, 560572092473687900B46B66 /* SDL_syslocale.m in Sources */,
A7D8BB7923E2514500DCD162 /* SDL_clipboardevents.c in Sources */, A7D8BB7923E2514500DCD162 /* SDL_clipboardevents.c in Sources */,
@ -9402,7 +9382,6 @@
A7D8A95723E2514000DCD162 /* SDL_atomic.c in Sources */, A7D8A95723E2514000DCD162 /* SDL_atomic.c in Sources */,
A75FDBCE23EA380300529352 /* SDL_hidapi_rumble.c in Sources */, A75FDBCE23EA380300529352 /* SDL_hidapi_rumble.c in Sources */,
A7D8BB2723E2514500DCD162 /* SDL_displayevents.c in Sources */, A7D8BB2723E2514500DCD162 /* SDL_displayevents.c in Sources */,
A7D8AF1823E2514100DCD162 /* SDL_cocoamousetap.m in Sources */,
A7D8AB2523E2514100DCD162 /* SDL_log.c in Sources */, A7D8AB2523E2514100DCD162 /* SDL_log.c in Sources */,
A7D8AE8823E2514100DCD162 /* SDL_cocoaopengl.m in Sources */, A7D8AE8823E2514100DCD162 /* SDL_cocoaopengl.m in Sources */,
A7D8AB7323E2514100DCD162 /* SDL_offscreenframebuffer.c in Sources */, A7D8AB7323E2514100DCD162 /* SDL_offscreenframebuffer.c in Sources */,
@ -9436,6 +9415,7 @@
A7D8BBE923E2574800DCD162 /* SDL_uikitvulkan.m in Sources */, A7D8BBE923E2574800DCD162 /* SDL_uikitvulkan.m in Sources */,
A7D8ABCD23E2514100DCD162 /* SDL_blit_slow.c in Sources */, A7D8ABCD23E2514100DCD162 /* SDL_blit_slow.c in Sources */,
A7D8BA9723E2514400DCD162 /* s_copysign.c in Sources */, A7D8BA9723E2514400DCD162 /* s_copysign.c in Sources */,
F3984CD025BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */,
A7D8AAB623E2514100DCD162 /* SDL_haptic.c in Sources */, A7D8AAB623E2514100DCD162 /* SDL_haptic.c in Sources */,
A7D8B15223E2514200DCD162 /* SDL_x11modes.c in Sources */, A7D8B15223E2514200DCD162 /* SDL_x11modes.c in Sources */,
A7D8AF2423E2514100DCD162 /* SDL_cocoametalview.m in Sources */, A7D8AF2423E2514100DCD162 /* SDL_cocoametalview.m in Sources */,
@ -9603,7 +9583,6 @@
A75FDBD123EA380300529352 /* SDL_hidapi_rumble.c in Sources */, A75FDBD123EA380300529352 /* SDL_hidapi_rumble.c in Sources */,
A7D8BB2A23E2514500DCD162 /* SDL_displayevents.c in Sources */, A7D8BB2A23E2514500DCD162 /* SDL_displayevents.c in Sources */,
A7D8BBFC23E2574800DCD162 /* SDL_uikitopenglview.m in Sources */, A7D8BBFC23E2574800DCD162 /* SDL_uikitopenglview.m in Sources */,
A7D8AF1B23E2514100DCD162 /* SDL_cocoamousetap.m in Sources */,
A7D8AB2823E2514100DCD162 /* SDL_log.c in Sources */, A7D8AB2823E2514100DCD162 /* SDL_log.c in Sources */,
A7D8BC0223E2574800DCD162 /* SDL_uikitviewcontroller.m in Sources */, A7D8BC0223E2574800DCD162 /* SDL_uikitviewcontroller.m in Sources */,
A7D8AE8B23E2514100DCD162 /* SDL_cocoaopengl.m in Sources */, A7D8AE8B23E2514100DCD162 /* SDL_cocoaopengl.m in Sources */,
@ -9637,6 +9616,7 @@
A7D8BA9A23E2514400DCD162 /* s_copysign.c in Sources */, A7D8BA9A23E2514400DCD162 /* s_copysign.c in Sources */,
A7D8AAB923E2514100DCD162 /* SDL_haptic.c in Sources */, A7D8AAB923E2514100DCD162 /* SDL_haptic.c in Sources */,
A7D8B15523E2514200DCD162 /* SDL_x11modes.c in Sources */, A7D8B15523E2514200DCD162 /* SDL_x11modes.c in Sources */,
F3984CD325BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */,
A7D8AF2723E2514100DCD162 /* SDL_cocoametalview.m in Sources */, A7D8AF2723E2514100DCD162 /* SDL_cocoametalview.m in Sources */,
A7D8B86323E2514400DCD162 /* SDL_audiotypecvt.c in Sources */, A7D8B86323E2514400DCD162 /* SDL_audiotypecvt.c in Sources */,
A7D8AD3523E2514100DCD162 /* SDL_blit_N.c in Sources */, A7D8AD3523E2514100DCD162 /* SDL_blit_N.c in Sources */,
@ -9803,7 +9783,6 @@
A7D8A95C23E2514000DCD162 /* SDL_atomic.c in Sources */, A7D8A95C23E2514000DCD162 /* SDL_atomic.c in Sources */,
A75FDBD423EA380300529352 /* SDL_hidapi_rumble.c in Sources */, A75FDBD423EA380300529352 /* SDL_hidapi_rumble.c in Sources */,
A7D8BB2C23E2514500DCD162 /* SDL_displayevents.c in Sources */, A7D8BB2C23E2514500DCD162 /* SDL_displayevents.c in Sources */,
A7D8AF1D23E2514100DCD162 /* SDL_cocoamousetap.m in Sources */,
A7D8AB2A23E2514100DCD162 /* SDL_log.c in Sources */, A7D8AB2A23E2514100DCD162 /* SDL_log.c in Sources */,
A7D8AE8D23E2514100DCD162 /* SDL_cocoaopengl.m in Sources */, A7D8AE8D23E2514100DCD162 /* SDL_cocoaopengl.m in Sources */,
A7D8AB7823E2514100DCD162 /* SDL_offscreenframebuffer.c in Sources */, A7D8AB7823E2514100DCD162 /* SDL_offscreenframebuffer.c in Sources */,
@ -9838,6 +9817,7 @@
A7D8AABB23E2514100DCD162 /* SDL_haptic.c in Sources */, A7D8AABB23E2514100DCD162 /* SDL_haptic.c in Sources */,
A7D8AC9223E2514100DCD162 /* SDL_uikitvulkan.m in Sources */, A7D8AC9223E2514100DCD162 /* SDL_uikitvulkan.m in Sources */,
A7D8B15723E2514200DCD162 /* SDL_x11modes.c in Sources */, A7D8B15723E2514200DCD162 /* SDL_x11modes.c in Sources */,
F3984CD625BCC92900374F43 /* SDL_hidapi_stadia.c in Sources */,
A7D8AF2923E2514100DCD162 /* SDL_cocoametalview.m in Sources */, A7D8AF2923E2514100DCD162 /* SDL_cocoametalview.m in Sources */,
A7D8B86523E2514400DCD162 /* SDL_audiotypecvt.c in Sources */, A7D8B86523E2514400DCD162 /* SDL_audiotypecvt.c in Sources */,
A7D8AC5C23E2514100DCD162 /* SDL_uikitevents.m in Sources */, A7D8AC5C23E2514100DCD162 /* SDL_uikitevents.m in Sources */,
@ -10014,7 +9994,7 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEPLOYMENT_POSTPROCESSING = YES; DEPLOYMENT_POSTPROCESSING = YES;
DYLIB_COMPATIBILITY_VERSION = 1.0.0; DYLIB_COMPATIBILITY_VERSION = 1.0.0;
DYLIB_CURRENT_VERSION = 15.0.0; DYLIB_CURRENT_VERSION = 15.1.0;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_ALTIVEC_EXTENSIONS = YES; GCC_ALTIVEC_EXTENSIONS = YES;
@ -10038,7 +10018,11 @@
); );
INFOPLIST_FILE = "Info-Framework.plist"; INFOPLIST_FILE = "Info-Framework.plist";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.6; MACOSX_DEPLOYMENT_TARGET = 10.6;
PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL2; PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL2;
PRODUCT_NAME = SDL2; PRODUCT_NAME = SDL2;
@ -10093,7 +10077,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
DEBUG_INFORMATION_FORMAT = dwarf; DEBUG_INFORMATION_FORMAT = dwarf;
DYLIB_COMPATIBILITY_VERSION = 1.0.0; DYLIB_COMPATIBILITY_VERSION = 1.0.0;
DYLIB_CURRENT_VERSION = 15.0.0; DYLIB_CURRENT_VERSION = 15.1.0;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES; ENABLE_TESTABILITY = YES;
@ -10117,7 +10101,11 @@
); );
INFOPLIST_FILE = "Info-Framework.plist"; INFOPLIST_FILE = "Info-Framework.plist";
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.6; MACOSX_DEPLOYMENT_TARGET = 10.6;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL2; PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL2;
@ -10162,6 +10150,7 @@
GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_SYMBOLS_PRIVATE_EXTERN = YES;
INSTALL_PATH = "@rpath"; INSTALL_PATH = "@rpath";
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2,6";
}; };
name = Debug; name = Debug;
}; };
@ -10178,6 +10167,7 @@
GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_SYMBOLS_PRIVATE_EXTERN = YES;
INSTALL_PATH = "@rpath"; INSTALL_PATH = "@rpath";
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2,6";
}; };
name = Release; name = Release;
}; };
@ -10222,7 +10212,7 @@
PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.hidapi; PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.hidapi;
PRODUCT_NAME = hidapi; PRODUCT_NAME = hidapi;
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2,6";
}; };
name = Debug; name = Debug;
}; };
@ -10243,7 +10233,7 @@
PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.hidapi; PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.hidapi;
PRODUCT_NAME = hidapi; PRODUCT_NAME = hidapi;
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2,6";
}; };
name = Release; name = Release;
}; };
@ -10341,7 +10331,7 @@
GCC_PREPROCESSOR_DEFINITIONS = "IOS_DYLIB=1"; GCC_PREPROCESSOR_DEFINITIONS = "IOS_DYLIB=1";
OTHER_LDFLAGS = "-liconv"; OTHER_LDFLAGS = "-liconv";
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2,6";
}; };
name = Debug; name = Debug;
}; };
@ -10357,7 +10347,7 @@
GCC_PREPROCESSOR_DEFINITIONS = "IOS_DYLIB=1"; GCC_PREPROCESSOR_DEFINITIONS = "IOS_DYLIB=1";
OTHER_LDFLAGS = "-liconv"; OTHER_LDFLAGS = "-liconv";
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2,6";
}; };
name = Release; name = Release;
}; };

View file

@ -1,6 +1,6 @@
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages

View file

@ -72,11 +72,10 @@ no_alsa=""
alsa_min_micro_version=`echo $min_alsa_version | \ alsa_min_micro_version=`echo $min_alsa_version | \
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
AC_LANG_SAVE AC_LANG_PUSH([C])
AC_LANG_C AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
AC_TRY_COMPILE([
#include <alsa/asoundlib.h> #include <alsa/asoundlib.h>
], [ ]], [[
/* ensure backward compatibility */ /* ensure backward compatibility */
#if !defined(SND_LIB_MAJOR) && defined(SOUNDLIB_VERSION_MAJOR) #if !defined(SND_LIB_MAJOR) && defined(SOUNDLIB_VERSION_MAJOR)
#define SND_LIB_MAJOR SOUNDLIB_VERSION_MAJOR #define SND_LIB_MAJOR SOUNDLIB_VERSION_MAJOR
@ -108,13 +107,13 @@ AC_TRY_COMPILE([
# endif # endif
# endif # endif
exit(0); exit(0);
], ]])],
[AC_MSG_RESULT(found.)], [AC_MSG_RESULT(found.)],
[AC_MSG_RESULT(not present.) [AC_MSG_RESULT(not present.)
ifelse([$3], , [AC_MSG_ERROR(Sufficiently new version of libasound not found.)]) ifelse([$3], , [AC_MSG_ERROR(Sufficiently new version of libasound not found.)])
alsa_found=no] alsa_found=no]
) )
AC_LANG_RESTORE AC_LANG_POP([C])
dnl Now that we know that we have the right version, let's see if we have the library and not just the headers. dnl Now that we know that we have the right version, let's see if we have the library and not just the headers.
if test "x$enable_alsatest" = "xyes"; then if test "x$enable_alsatest" = "xyes"; then

View file

@ -48,6 +48,7 @@ AC_ARG_ENABLE(esdtest, [ --disable-esdtest Do not try to compile and run
esd_micro_version=`$ESD_CONFIG $esd_config_args --version | \ esd_micro_version=`$ESD_CONFIG $esd_config_args --version | \
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
if test "x$enable_esdtest" = "xyes" ; then if test "x$enable_esdtest" = "xyes" ; then
AC_LANG_PUSH([C])
ac_save_CFLAGS="$CFLAGS" ac_save_CFLAGS="$CFLAGS"
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $ESD_CFLAGS" CFLAGS="$CFLAGS $ESD_CFLAGS"
@ -57,38 +58,19 @@ dnl Now check if the installed ESD is sufficiently new. (Also sanity
dnl checks the results of esd-config to some extent dnl checks the results of esd-config to some extent
dnl dnl
rm -f conf.esdtest rm -f conf.esdtest
AC_TRY_RUN([ AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <esd.h> #include <esd.h>
char* int main (void)
my_strdup (char *str)
{
char *new_str;
if (str)
{
new_str = malloc ((strlen (str) + 1) * sizeof(char));
strcpy (new_str, str);
}
else
new_str = NULL;
return new_str;
}
int main ()
{ {
int major, minor, micro; int major, minor, micro;
char *tmp_version; FILE *fp = fopen("conf.esdtest", "w");
system ("touch conf.esdtest"); if (fp) fclose(fp);
/* HP/UX 9 (%@#!) writes to sscanf strings */ if (sscanf("$min_esd_version", "%d.%d.%d", &major, &minor, &micro) != 3) {
tmp_version = my_strdup("$min_esd_version");
if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
printf("%s, bad version string\n", "$min_esd_version"); printf("%s, bad version string\n", "$min_esd_version");
exit(1); exit(1);
} }
@ -110,10 +92,10 @@ int main ()
return 1; return 1;
} }
} }
]])], [], [no_esd=yes], [echo $ac_n "cross compiling; assumed OK... $ac_c"])
],, no_esd=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
CFLAGS="$ac_save_CFLAGS" CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS" LIBS="$ac_save_LIBS"
AC_LANG_POP([C])
fi fi
fi fi
if test "x$no_esd" = x ; then if test "x$no_esd" = x ; then
@ -133,10 +115,11 @@ int main ()
echo "*** Could not run ESD test program, checking why..." echo "*** Could not run ESD test program, checking why..."
CFLAGS="$CFLAGS $ESD_CFLAGS" CFLAGS="$CFLAGS $ESD_CFLAGS"
LIBS="$LIBS $ESD_LIBS" LIBS="$LIBS $ESD_LIBS"
AC_TRY_LINK([ AC_LANG_PUSH([C])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <stdio.h> #include <stdio.h>
#include <esd.h> #include <esd.h>
], [ return 0; ], ]], [[ return 0; ]])],
[ echo "*** The test program compiled, but did not run. This usually means" [ echo "*** The test program compiled, but did not run. This usually means"
echo "*** that the run-time linker is not finding ESD or finding the wrong" echo "*** that the run-time linker is not finding ESD or finding the wrong"
echo "*** version of ESD. If it is not finding ESD, you'll need to set your" echo "*** version of ESD. If it is not finding ESD, you'll need to set your"
@ -152,6 +135,7 @@ int main ()
echo "*** may want to edit the esd-config script: $ESD_CONFIG" ]) echo "*** may want to edit the esd-config script: $ESD_CONFIG" ])
CFLAGS="$ac_save_CFLAGS" CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS" LIBS="$ac_save_LIBS"
AC_LANG_POP([C])
fi fi
fi fi
ESD_CFLAGS="" ESD_CFLAGS=""
@ -162,3 +146,27 @@ int main ()
AC_SUBST(ESD_LIBS) AC_SUBST(ESD_LIBS)
rm -f conf.esdtest rm -f conf.esdtest
]) ])
dnl AM_ESD_SUPPORTS_MULTIPLE_RECORD([ACTION-IF-SUPPORTS [, ACTION-IF-NOT-SUPPORTS]])
dnl Test, whether esd supports multiple recording clients (version >=0.2.21)
dnl
AC_DEFUN([AM_ESD_SUPPORTS_MULTIPLE_RECORD],
[dnl
AC_MSG_NOTICE([whether installed esd version supports multiple recording clients])
ac_save_ESD_CFLAGS="$ESD_CFLAGS"
ac_save_ESD_LIBS="$ESD_LIBS"
AM_PATH_ESD(0.2.21,
ifelse([$1], , [
AM_CONDITIONAL(ESD_SUPPORTS_MULTIPLE_RECORD, true)
AC_DEFINE(ESD_SUPPORTS_MULTIPLE_RECORD, 1,
[Define if you have esound with support of multiple recording clients.])],
[$1]),
ifelse([$2], , [AM_CONDITIONAL(ESD_SUPPORTS_MULTIPLE_RECORD, false)], [$2])
if test "x$ac_save_ESD_CFLAGS" != x ; then
ESD_CFLAGS="$ac_save_ESD_CFLAGS"
fi
if test "x$ac_save_ESD_LIBS" != x ; then
ESD_LIBS="$ac_save_ESD_LIBS"
fi
)
])

View file

@ -1047,16 +1047,11 @@ _LT_EOF
_lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
darwin1.*) darwin1.*)
_lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
darwin*) # darwin 5.x on darwin*)
# if running on 10.5 or later, the deployment target defaults case $MACOSX_DEPLOYMENT_TARGET,$host in
# to the OS version, if on x86, and 10.4, the deployment 10.[[012]],*|,*powerpc*-darwin[[5-8]]*)
# target defaults to 10.4. Don't you love it?
case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
_lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
10.[[012]]*)
_lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
10.*) *)
_lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
esac esac
;; ;;

275
externals/SDL/acinclude/pkg.m4 vendored Executable file
View file

@ -0,0 +1,275 @@
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
# serial 12 (pkg-config-0.29.2)
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
dnl
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
dnl the Free Software Foundation; either version 2 of the License, or
dnl (at your option) any later version.
dnl
dnl This program is distributed in the hope that it will be useful, but
dnl WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
dnl General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program; if not, write to the Free Software
dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
dnl 02111-1307, USA.
dnl
dnl As a special exception to the GNU General Public License, if you
dnl distribute this file as part of a program that contains a
dnl configuration script generated by Autoconf, you may include it under
dnl the same distribution terms that you use for the rest of that
dnl program.
dnl PKG_PREREQ(MIN-VERSION)
dnl -----------------------
dnl Since: 0.29
dnl
dnl Verify that the version of the pkg-config macros are at least
dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
dnl installed version of pkg-config, this checks the developer's version
dnl of pkg.m4 when generating configure.
dnl
dnl To ensure that this macro is defined, also add:
dnl m4_ifndef([PKG_PREREQ],
dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
dnl
dnl See the "Since" comment for each macro you use to see what version
dnl of the macros you require.
m4_defun([PKG_PREREQ],
[m4_define([PKG_MACROS_VERSION], [0.29.2])
m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
[m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
])dnl PKG_PREREQ
dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
dnl ----------------------------------
dnl Since: 0.16
dnl
dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
dnl first found in the path. Checks that the version of pkg-config found
dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
dnl used since that's the first version where most current features of
dnl pkg-config existed.
AC_DEFUN([PKG_PROG_PKG_CONFIG],
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
fi
if test -n "$PKG_CONFIG"; then
_pkg_min_version=m4_default([$1], [0.9.0])
AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
PKG_CONFIG=""
fi
fi[]dnl
])dnl PKG_PROG_PKG_CONFIG
dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
dnl -------------------------------------------------------------------
dnl Since: 0.18
dnl
dnl Check to see whether a particular set of modules exists. Similar to
dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
dnl
dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
dnl only at the first occurence in configure.ac, so if the first place
dnl it's called might be skipped (such as if it is within an "if", you
dnl have to call PKG_CHECK_EXISTS manually
AC_DEFUN([PKG_CHECK_EXISTS],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
if test -n "$PKG_CONFIG" && \
AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
m4_default([$2], [:])
m4_ifvaln([$3], [else
$3])dnl
fi])
dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
dnl ---------------------------------------------
dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
dnl pkg_failed based on the result.
m4_define([_PKG_CONFIG],
[if test -n "$$1"; then
pkg_cv_[]$1="$$1"
elif test -n "$PKG_CONFIG"; then
PKG_CHECK_EXISTS([$3],
[pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes ],
[pkg_failed=yes])
else
pkg_failed=untried
fi[]dnl
])dnl _PKG_CONFIG
dnl _PKG_SHORT_ERRORS_SUPPORTED
dnl ---------------------------
dnl Internal check to see if pkg-config supports short errors.
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
_pkg_short_errors_supported=yes
else
_pkg_short_errors_supported=no
fi[]dnl
])dnl _PKG_SHORT_ERRORS_SUPPORTED
dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
dnl [ACTION-IF-NOT-FOUND])
dnl --------------------------------------------------------------
dnl Since: 0.4.0
dnl
dnl Note that if there is a possibility the first call to
dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
AC_DEFUN([PKG_CHECK_MODULES],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
pkg_failed=no
AC_MSG_CHECKING([for $2])
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
and $1[]_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.])
if test $pkg_failed = yes; then
AC_MSG_RESULT([no])
_PKG_SHORT_ERRORS_SUPPORTED
if test $_pkg_short_errors_supported = yes; then
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
else
$1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
fi
# Put the nasty error message in config.log where it belongs
echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
m4_default([$4], [AC_MSG_ERROR(
[Package requirements ($2) were not met:
$$1_PKG_ERRORS
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
_PKG_TEXT])[]dnl
])
elif test $pkg_failed = untried; then
AC_MSG_RESULT([no])
m4_default([$4], [AC_MSG_FAILURE(
[The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.
_PKG_TEXT
To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
])
else
$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
AC_MSG_RESULT([yes])
$3
fi[]dnl
])dnl PKG_CHECK_MODULES
dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
dnl [ACTION-IF-NOT-FOUND])
dnl ---------------------------------------------------------------------
dnl Since: 0.29
dnl
dnl Checks for existence of MODULES and gathers its build flags with
dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
dnl and VARIABLE-PREFIX_LIBS from --libs.
dnl
dnl Note that if there is a possibility the first call to
dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
dnl configure.ac.
AC_DEFUN([PKG_CHECK_MODULES_STATIC],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
_save_PKG_CONFIG=$PKG_CONFIG
PKG_CONFIG="$PKG_CONFIG --static"
PKG_CHECK_MODULES($@)
PKG_CONFIG=$_save_PKG_CONFIG[]dnl
])dnl PKG_CHECK_MODULES_STATIC
dnl PKG_INSTALLDIR([DIRECTORY])
dnl -------------------------
dnl Since: 0.27
dnl
dnl Substitutes the variable pkgconfigdir as the location where a module
dnl should install pkg-config .pc files. By default the directory is
dnl $libdir/pkgconfig, but the default can be changed by passing
dnl DIRECTORY. The user can override through the --with-pkgconfigdir
dnl parameter.
AC_DEFUN([PKG_INSTALLDIR],
[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
m4_pushdef([pkg_description],
[pkg-config installation directory @<:@]pkg_default[@:>@])
AC_ARG_WITH([pkgconfigdir],
[AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
[with_pkgconfigdir=]pkg_default)
AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
m4_popdef([pkg_default])
m4_popdef([pkg_description])
])dnl PKG_INSTALLDIR
dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
dnl --------------------------------
dnl Since: 0.27
dnl
dnl Substitutes the variable noarch_pkgconfigdir as the location where a
dnl module should install arch-independent pkg-config .pc files. By
dnl default the directory is $datadir/pkgconfig, but the default can be
dnl changed by passing DIRECTORY. The user can override through the
dnl --with-noarch-pkgconfigdir parameter.
AC_DEFUN([PKG_NOARCH_INSTALLDIR],
[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
m4_pushdef([pkg_description],
[pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
AC_ARG_WITH([noarch-pkgconfigdir],
[AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
[with_noarch_pkgconfigdir=]pkg_default)
AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
m4_popdef([pkg_default])
m4_popdef([pkg_description])
])dnl PKG_NOARCH_INSTALLDIR
dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
dnl -------------------------------------------
dnl Since: 0.28
dnl
dnl Retrieves the value of the pkg-config variable for the given module.
AC_DEFUN([PKG_CHECK_VAR],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
_PKG_CONFIG([$1], [variable="][$3]["], [$2])
AS_VAR_COPY([$1], [pkg_cv_][$1])
AS_VAR_IF([$1], [""], [$5], [$4])dnl
])dnl PKG_CHECK_VAR

View file

@ -71,6 +71,7 @@
android:alwaysRetainTaskState="true" android:alwaysRetainTaskState="true"
android:launchMode="singleInstance" android:launchMode="singleInstance"
android:configChanges="layoutDirection|locale|orientation|uiMode|screenLayout|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation" android:configChanges="layoutDirection|locale|orientation|uiMode|screenLayout|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:preferMinimalPostProcessing="true"
> >
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />

View file

@ -7,6 +7,7 @@ import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager; import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothProfile;
import android.os.Build;
import android.util.Log; import android.util.Log;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
@ -275,6 +276,7 @@ public class HIDDeviceManager {
0x15e4, // Numark 0x15e4, // Numark
0x162e, // Joytech 0x162e, // Joytech
0x1689, // Razer Onza 0x1689, // Razer Onza
0x1949, // Lab126, Inc.
0x1bad, // Harmonix 0x1bad, // Harmonix
0x24c6, // PowerA 0x24c6, // PowerA
}; };
@ -382,6 +384,11 @@ public class HIDDeviceManager {
return; return;
} }
if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE) || (Build.VERSION.SDK_INT < 18)) {
Log.d(TAG, "Couldn't initialize Bluetooth, this version of Android does not support Bluetooth LE");
return;
}
// Find bonded bluetooth controllers and create SteamControllers for them // Find bonded bluetooth controllers and create SteamControllers for them
mBluetoothManager = (BluetoothManager)mContext.getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothManager = (BluetoothManager)mContext.getSystemService(Context.BLUETOOTH_SERVICE);
if (mBluetoothManager == null) { if (mBluetoothManager == null) {

View file

@ -52,6 +52,7 @@ import android.widget.Button;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Locale; import java.util.Locale;
@ -604,7 +605,6 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
static final int COMMAND_CHANGE_TITLE = 1; static final int COMMAND_CHANGE_TITLE = 1;
static final int COMMAND_CHANGE_WINDOW_STYLE = 2; static final int COMMAND_CHANGE_WINDOW_STYLE = 2;
static final int COMMAND_TEXTEDIT_HIDE = 3; static final int COMMAND_TEXTEDIT_HIDE = 3;
static final int COMMAND_CHANGE_SURFACEVIEW_FORMAT = 4;
static final int COMMAND_SET_KEEP_SCREEN_ON = 5; static final int COMMAND_SET_KEEP_SCREEN_ON = 5;
protected static final int COMMAND_USER = 0x8000; protected static final int COMMAND_USER = 0x8000;
@ -702,32 +702,6 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
} }
break; break;
} }
case COMMAND_CHANGE_SURFACEVIEW_FORMAT:
{
int format = (Integer) msg.obj;
int pf;
if (SDLActivity.mSurface == null) {
return;
}
SurfaceHolder holder = SDLActivity.mSurface.getHolder();
if (holder == null) {
return;
}
if (format == 1) {
pf = PixelFormat.RGBA_8888;
} else if (format == 2) {
pf = PixelFormat.RGBX_8888;
} else {
pf = PixelFormat.RGB_565;
}
holder.setFormat(pf);
break;
}
default: default:
if ((context instanceof SDLActivity) && !((SDLActivity) context).onUnhandledMessage(msg.arg1, msg.obj)) { if ((context instanceof SDLActivity) && !((SDLActivity) context).onUnhandledMessage(msg.arg1, msg.obj)) {
Log.e(TAG, "error handling message, command is " + msg.arg1); Log.e(TAG, "error handling message, command is " + msg.arg1);
@ -811,7 +785,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
public static native void nativeResume(); public static native void nativeResume();
public static native void nativeFocusChanged(boolean hasFocus); public static native void nativeFocusChanged(boolean hasFocus);
public static native void onNativeDropFile(String filename); public static native void onNativeDropFile(String filename);
public static native void nativeSetScreenResolution(int surfaceWidth, int surfaceHeight, int deviceWidth, int deviceHeight, int format, float rate); public static native void nativeSetScreenResolution(int surfaceWidth, int surfaceHeight, int deviceWidth, int deviceHeight, float rate);
public static native void onNativeResize(); public static native void onNativeResize();
public static native void onNativeKeyDown(int keycode); public static native void onNativeKeyDown(int keycode);
public static native void onNativeKeyUp(int keycode); public static native void onNativeKeyUp(int keycode);
@ -986,11 +960,6 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
*/ */
public static boolean supportsRelativeMouse() public static boolean supportsRelativeMouse()
{ {
// ChromeOS doesn't provide relative mouse motion via the Android 7 APIs
if (isChromebook()) {
return false;
}
// DeX mode in Samsung Experience 9.0 and earlier doesn't support relative mice properly under // DeX mode in Samsung Experience 9.0 and earlier doesn't support relative mice properly under
// Android 7 APIs, and simply returns no data under Android 8 APIs. // Android 7 APIs, and simply returns no data under Android 8 APIs.
// //
@ -1222,13 +1191,6 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
return SDLActivity.mSurface.getNativeSurface(); return SDLActivity.mSurface.getNativeSurface();
} }
/**
* This method is called by SDL using JNI.
*/
public static void setSurfaceViewFormat(int format) {
mSingleton.sendCommand(COMMAND_CHANGE_SURFACEVIEW_FORMAT, format);
}
// Input // Input
/** /**
@ -1630,6 +1592,52 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
} }
return 0; return 0;
} }
/**
* This method is called by SDL using JNI.
*/
public static int showToast(String message, int duration, int gravity, int xOffset, int yOffset)
{
if(null == mSingleton) {
return - 1;
}
try
{
class OneShotTask implements Runnable {
String mMessage;
int mDuration;
int mGravity;
int mXOffset;
int mYOffset;
OneShotTask(String message, int duration, int gravity, int xOffset, int yOffset) {
mMessage = message;
mDuration = duration;
mGravity = gravity;
mXOffset = xOffset;
mYOffset = yOffset;
}
public void run() {
try
{
Toast toast = Toast.makeText(mSingleton, mMessage, mDuration);
if (mGravity >= 0) {
toast.setGravity(mGravity, mXOffset, mYOffset);
}
toast.show();
} catch(Exception ex) {
Log.e(TAG, ex.getMessage());
}
}
}
mSingleton.runOnUiThread(new OneShotTask(message, duration, gravity, xOffset, yOffset));
} catch(Exception ex) {
return -1;
}
return 0;
}
} }
/** /**
@ -1754,30 +1762,6 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
return; return;
} }
int sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565 by default
switch (format) {
case PixelFormat.RGBA_8888:
Log.v("SDL", "pixel format RGBA_8888");
sdlFormat = 0x16462004; // SDL_PIXELFORMAT_RGBA8888
break;
case PixelFormat.RGBX_8888:
Log.v("SDL", "pixel format RGBX_8888");
sdlFormat = 0x16261804; // SDL_PIXELFORMAT_RGBX8888
break;
case PixelFormat.RGB_565:
Log.v("SDL", "pixel format RGB_565");
sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565
break;
case PixelFormat.RGB_888:
Log.v("SDL", "pixel format RGB_888");
// Not sure this is right, maybe SDL_PIXELFORMAT_RGB24 instead?
sdlFormat = 0x16161804; // SDL_PIXELFORMAT_RGB888
break;
default:
Log.v("SDL", "pixel format unknown " + format);
break;
}
mWidth = width; mWidth = width;
mHeight = height; mHeight = height;
int nDeviceWidth = width; int nDeviceWidth = width;
@ -1800,7 +1784,7 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
Log.v("SDL", "Window size: " + width + "x" + height); Log.v("SDL", "Window size: " + width + "x" + height);
Log.v("SDL", "Device size: " + nDeviceWidth + "x" + nDeviceHeight); Log.v("SDL", "Device size: " + nDeviceWidth + "x" + nDeviceHeight);
SDLActivity.nativeSetScreenResolution(width, height, nDeviceWidth, nDeviceHeight, sdlFormat, mDisplay.getRefreshRate()); SDLActivity.nativeSetScreenResolution(width, height, nDeviceWidth, nDeviceHeight, mDisplay.getRefreshRate());
SDLActivity.onNativeResize(); SDLActivity.onNativeResize();
// Prevent a screen distortion glitch, // Prevent a screen distortion glitch,

View file

@ -71,6 +71,7 @@
android:alwaysRetainTaskState="true" android:alwaysRetainTaskState="true"
android:launchMode="singleInstance" android:launchMode="singleInstance"
android:configChanges="layoutDirection|locale|orientation|uiMode|screenLayout|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation" android:configChanges="layoutDirection|locale|orientation|uiMode|screenLayout|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:preferMinimalPostProcessing="true"
> >
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />

View file

@ -7,6 +7,7 @@ import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager; import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothProfile;
import android.os.Build;
import android.util.Log; import android.util.Log;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
@ -275,6 +276,7 @@ public class HIDDeviceManager {
0x15e4, // Numark 0x15e4, // Numark
0x162e, // Joytech 0x162e, // Joytech
0x1689, // Razer Onza 0x1689, // Razer Onza
0x1949, // Lab126, Inc.
0x1bad, // Harmonix 0x1bad, // Harmonix
0x24c6, // PowerA 0x24c6, // PowerA
}; };
@ -382,6 +384,11 @@ public class HIDDeviceManager {
return; return;
} }
if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE) || (Build.VERSION.SDK_INT < 18)) {
Log.d(TAG, "Couldn't initialize Bluetooth, this version of Android does not support Bluetooth LE");
return;
}
// Find bonded bluetooth controllers and create SteamControllers for them // Find bonded bluetooth controllers and create SteamControllers for them
mBluetoothManager = (BluetoothManager)mContext.getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothManager = (BluetoothManager)mContext.getSystemService(Context.BLUETOOTH_SERVICE);
if (mBluetoothManager == null) { if (mBluetoothManager == null) {

View file

@ -52,6 +52,7 @@ import android.widget.Button;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Locale; import java.util.Locale;
@ -604,7 +605,6 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
static final int COMMAND_CHANGE_TITLE = 1; static final int COMMAND_CHANGE_TITLE = 1;
static final int COMMAND_CHANGE_WINDOW_STYLE = 2; static final int COMMAND_CHANGE_WINDOW_STYLE = 2;
static final int COMMAND_TEXTEDIT_HIDE = 3; static final int COMMAND_TEXTEDIT_HIDE = 3;
static final int COMMAND_CHANGE_SURFACEVIEW_FORMAT = 4;
static final int COMMAND_SET_KEEP_SCREEN_ON = 5; static final int COMMAND_SET_KEEP_SCREEN_ON = 5;
protected static final int COMMAND_USER = 0x8000; protected static final int COMMAND_USER = 0x8000;
@ -702,32 +702,6 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
} }
break; break;
} }
case COMMAND_CHANGE_SURFACEVIEW_FORMAT:
{
int format = (Integer) msg.obj;
int pf;
if (SDLActivity.mSurface == null) {
return;
}
SurfaceHolder holder = SDLActivity.mSurface.getHolder();
if (holder == null) {
return;
}
if (format == 1) {
pf = PixelFormat.RGBA_8888;
} else if (format == 2) {
pf = PixelFormat.RGBX_8888;
} else {
pf = PixelFormat.RGB_565;
}
holder.setFormat(pf);
break;
}
default: default:
if ((context instanceof SDLActivity) && !((SDLActivity) context).onUnhandledMessage(msg.arg1, msg.obj)) { if ((context instanceof SDLActivity) && !((SDLActivity) context).onUnhandledMessage(msg.arg1, msg.obj)) {
Log.e(TAG, "error handling message, command is " + msg.arg1); Log.e(TAG, "error handling message, command is " + msg.arg1);
@ -811,7 +785,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
public static native void nativeResume(); public static native void nativeResume();
public static native void nativeFocusChanged(boolean hasFocus); public static native void nativeFocusChanged(boolean hasFocus);
public static native void onNativeDropFile(String filename); public static native void onNativeDropFile(String filename);
public static native void nativeSetScreenResolution(int surfaceWidth, int surfaceHeight, int deviceWidth, int deviceHeight, int format, float rate); public static native void nativeSetScreenResolution(int surfaceWidth, int surfaceHeight, int deviceWidth, int deviceHeight, float rate);
public static native void onNativeResize(); public static native void onNativeResize();
public static native void onNativeKeyDown(int keycode); public static native void onNativeKeyDown(int keycode);
public static native void onNativeKeyUp(int keycode); public static native void onNativeKeyUp(int keycode);
@ -986,11 +960,6 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
*/ */
public static boolean supportsRelativeMouse() public static boolean supportsRelativeMouse()
{ {
// ChromeOS doesn't provide relative mouse motion via the Android 7 APIs
if (isChromebook()) {
return false;
}
// DeX mode in Samsung Experience 9.0 and earlier doesn't support relative mice properly under // DeX mode in Samsung Experience 9.0 and earlier doesn't support relative mice properly under
// Android 7 APIs, and simply returns no data under Android 8 APIs. // Android 7 APIs, and simply returns no data under Android 8 APIs.
// //
@ -1222,13 +1191,6 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
return SDLActivity.mSurface.getNativeSurface(); return SDLActivity.mSurface.getNativeSurface();
} }
/**
* This method is called by SDL using JNI.
*/
public static void setSurfaceViewFormat(int format) {
mSingleton.sendCommand(COMMAND_CHANGE_SURFACEVIEW_FORMAT, format);
}
// Input // Input
/** /**
@ -1630,6 +1592,52 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
} }
return 0; return 0;
} }
/**
* This method is called by SDL using JNI.
*/
public static int showToast(String message, int duration, int gravity, int xOffset, int yOffset)
{
if(null == mSingleton) {
return - 1;
}
try
{
class OneShotTask implements Runnable {
String mMessage;
int mDuration;
int mGravity;
int mXOffset;
int mYOffset;
OneShotTask(String message, int duration, int gravity, int xOffset, int yOffset) {
mMessage = message;
mDuration = duration;
mGravity = gravity;
mXOffset = xOffset;
mYOffset = yOffset;
}
public void run() {
try
{
Toast toast = Toast.makeText(mSingleton, mMessage, mDuration);
if (mGravity >= 0) {
toast.setGravity(mGravity, mXOffset, mYOffset);
}
toast.show();
} catch(Exception ex) {
Log.e(TAG, ex.getMessage());
}
}
}
mSingleton.runOnUiThread(new OneShotTask(message, duration, gravity, xOffset, yOffset));
} catch(Exception ex) {
return -1;
}
return 0;
}
} }
/** /**
@ -1754,30 +1762,6 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
return; return;
} }
int sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565 by default
switch (format) {
case PixelFormat.RGBA_8888:
Log.v("SDL", "pixel format RGBA_8888");
sdlFormat = 0x16462004; // SDL_PIXELFORMAT_RGBA8888
break;
case PixelFormat.RGBX_8888:
Log.v("SDL", "pixel format RGBX_8888");
sdlFormat = 0x16261804; // SDL_PIXELFORMAT_RGBX8888
break;
case PixelFormat.RGB_565:
Log.v("SDL", "pixel format RGB_565");
sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565
break;
case PixelFormat.RGB_888:
Log.v("SDL", "pixel format RGB_888");
// Not sure this is right, maybe SDL_PIXELFORMAT_RGB24 instead?
sdlFormat = 0x16161804; // SDL_PIXELFORMAT_RGB888
break;
default:
Log.v("SDL", "pixel format unknown " + format);
break;
}
mWidth = width; mWidth = width;
mHeight = height; mHeight = height;
int nDeviceWidth = width; int nDeviceWidth = width;
@ -1800,7 +1784,7 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
Log.v("SDL", "Window size: " + width + "x" + height); Log.v("SDL", "Window size: " + width + "x" + height);
Log.v("SDL", "Device size: " + nDeviceWidth + "x" + nDeviceHeight); Log.v("SDL", "Device size: " + nDeviceWidth + "x" + nDeviceHeight);
SDLActivity.nativeSetScreenResolution(width, height, nDeviceWidth, nDeviceHeight, sdlFormat, mDisplay.getRefreshRate()); SDLActivity.nativeSetScreenResolution(width, height, nDeviceWidth, nDeviceHeight, mDisplay.getRefreshRate());
SDLActivity.onNativeResize(); SDLActivity.onNativeResize();
// Prevent a screen distortion glitch, // Prevent a screen distortion glitch,

View file

@ -2,7 +2,7 @@
buildscript { buildscript {
repositories { repositories {
jcenter() mavenCentral()
google() google()
} }
dependencies { dependencies {
@ -15,7 +15,7 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
jcenter() mavenCentral()
google() google()
} }
} }

View file

@ -1,5 +1,5 @@
#!/bin/sh #!/bin/sh
#
echo "Generating build information using autoconf" echo "Generating build information using autoconf"
echo "This may take a while ..." echo "This may take a while ..."
@ -9,15 +9,15 @@ cd "$srcdir"
# Regenerate configuration files # Regenerate configuration files
cat acinclude/* >aclocal.m4 cat acinclude/* >aclocal.m4
found=false
for autoconf in autoconf autoconf259 autoconf-2.59 if test "$AUTOCONF"x = x; then
do if which $autoconf >/dev/null 2>&1; then $autoconf && found=true; break; fi AUTOCONF=autoconf
done
if test x$found = xfalse; then
echo "Couldn't find autoconf, aborting"
exit 1
fi fi
$AUTOCONF || exit 1
rm aclocal.m4
rm -rf autom4te.cache
(cd test; sh autogen.sh) (cd test; sh autogen.sh)
# Run configure for this platform
echo "Now you are ready to run ./configure" echo "Now you are ready to run ./configure"

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -55,7 +55,7 @@ mkdir buildbot
pushd buildbot pushd buildbot
echo "Configuring..." echo "Configuring..."
emconfigure ../configure --host=wasm-unknown-emscripten --disable-assembly --disable-threads --disable-cpuinfo CFLAGS="-O2 -Wno-warn-absolute-paths -Wdeclaration-after-statement -Werror=declaration-after-statement" --prefix="$PWD/emscripten-sdl2-installed" || exit $? emconfigure ../configure --host=wasm32-unknown-emscripten --disable-assembly --disable-threads --disable-cpuinfo CFLAGS="-O2 -Wno-warn-absolute-paths -Wdeclaration-after-statement -Werror=declaration-after-statement" --prefix="$PWD/emscripten-sdl2-installed" || exit $?
echo "Building..." echo "Building..."
emmake $MAKE || exit $? emmake $MAKE || exit $?

View file

@ -0,0 +1,80 @@
#!/usr/bin/perl -w
# To use this script: symlink it to .git/hooks/pre-push, then "git push"
#
# This script is called by "git push" after it has checked the remote status,
# but before anything has been pushed. If this script exits with a non-zero
# status nothing will be pushed.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If pushing without using a named remote those arguments will be equal.
#
# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
# <local ref> <local sha1> <remote ref> <remote sha1>
use warnings;
use strict;
my $remote = $ARGV[0];
my $url = $ARGV[1];
#print("remote: $remote\n");
#print("url: $url\n");
$url =~ s/\.git$//; # change myorg/myproject.git to myorg/myproject
$url =~ s#^git\@github\.com\:#https://github.com/#i;
my $commiturl = $url =~ /\Ahttps?:\/\/github.com\// ? "$url/commit/" : '';
my $z40 = '0000000000000000000000000000000000000000';
my $reported = 0;
while (<STDIN>) {
chomp;
my ($local_ref, $local_sha, $remote_ref, $remote_sha) = split / /;
#print("local_ref: $local_ref\n");
#print("local_sha: $local_sha\n");
#print("remote_ref: $remote_ref\n");
#print("remote_sha: $remote_sha\n");
my $range = '';
if ($remote_sha eq $z40) { # New branch, examine all commits
$range = $local_sha;
} else { # Update to existing branch, examine new commits
$range = "$remote_sha..$local_sha";
}
my $gitcmd = "git log --reverse --oneline --no-abbrev-commit '$range'";
open(GITPIPE, '-|', $gitcmd) or die("\n\n$0: Failed to run '$gitcmd': $!\n\nAbort push!\n\n");
while (<GITPIPE>) {
chomp;
if (/\A([a-fA-F0-9]+)\s+(.*?)\Z/) {
my $hash = $1;
my $msg = $2;
if (!$reported) {
print("\nCommits expected to be pushed:\n");
$reported = 1;
}
#print("hash: $hash\n");
#print("msg: $msg\n");
print("$commiturl$hash -- $msg\n");
} else {
die("$0: Unexpected output from '$gitcmd'!\n\nAbort push!\n\n");
}
}
die("\n\n$0: Failing exit code from running '$gitcmd'!\n\nAbort push!\n\n") if !close(GITPIPE);
}
print("\n") if $reported;
exit(0); # Let the push go forward.
# vi: set ts=4 sw=4 expandtab:

View file

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# install - install a program, script, or datafile # install - install a program, script, or datafile
scriptversion=2011-11-20.07; # UTC scriptversion=2020-11-14.01; # UTC
# This originates from X11R5 (mit/util/scripts/install.sh), which was # This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the # later released in X11R6 (xc/config/util/install.sh) with the
@ -41,19 +41,15 @@ scriptversion=2011-11-20.07; # UTC
# This script is compatible with the BSD install script, but was written # This script is compatible with the BSD install script, but was written
# from scratch. # from scratch.
tab=' '
nl=' nl='
' '
IFS=" "" $nl" IFS=" $tab$nl"
# set DOITPROG to echo to test this script # Set DOITPROG to "echo" to test this script.
# Don't use :- since 4.3BSD and earlier shells don't like it.
doit=${DOITPROG-} doit=${DOITPROG-}
if test -z "$doit"; then doit_exec=${doit:-exec}
doit_exec=exec
else
doit_exec=$doit
fi
# Put in absolute file names if you don't have them in your path; # Put in absolute file names if you don't have them in your path;
# or use environment vars. # or use environment vars.
@ -68,22 +64,16 @@ mvprog=${MVPROG-mv}
rmprog=${RMPROG-rm} rmprog=${RMPROG-rm}
stripprog=${STRIPPROG-strip} stripprog=${STRIPPROG-strip}
posix_glob='?'
initialize_posix_glob='
test "$posix_glob" != "?" || {
if (set -f) 2>/dev/null; then
posix_glob=
else
posix_glob=:
fi
}
'
posix_mkdir= posix_mkdir=
# Desired mode of installed file. # Desired mode of installed file.
mode=0755 mode=0755
# Create dirs (including intermediate dirs) using mode 755.
# This is like GNU 'install' as of coreutils 8.32 (2020).
mkdir_umask=22
backupsuffix=
chgrpcmd= chgrpcmd=
chmodcmd=$chmodprog chmodcmd=$chmodprog
chowncmd= chowncmd=
@ -97,7 +87,7 @@ dir_arg=
dst_arg= dst_arg=
copy_on_change=false copy_on_change=false
no_target_directory= is_target_a_directory=possibly
usage="\ usage="\
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@ -114,18 +104,28 @@ Options:
--version display version info and exit. --version display version info and exit.
-c (ignored) -c (ignored)
-C install only if different (preserve the last data modification time) -C install only if different (preserve data modification time)
-d create directories instead of installing files. -d create directories instead of installing files.
-g GROUP $chgrpprog installed files to GROUP. -g GROUP $chgrpprog installed files to GROUP.
-m MODE $chmodprog installed files to MODE. -m MODE $chmodprog installed files to MODE.
-o USER $chownprog installed files to USER. -o USER $chownprog installed files to USER.
-p pass -p to $cpprog.
-s $stripprog installed files. -s $stripprog installed files.
-S SUFFIX attempt to back up existing files, with suffix SUFFIX.
-t DIRECTORY install into DIRECTORY. -t DIRECTORY install into DIRECTORY.
-T report an error if DSTFILE is a directory. -T report an error if DSTFILE is a directory.
Environment variables override the default commands: Environment variables override the default commands:
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
RMPROG STRIPPROG RMPROG STRIPPROG
By default, rm is invoked with -f; when overridden with RMPROG,
it's up to you to specify -f if you want it.
If -S is not specified, no backups are attempted.
Email bug reports to bug-automake@gnu.org.
Automake home page: https://www.gnu.org/software/automake/
" "
while test $# -ne 0; do while test $# -ne 0; do
@ -143,8 +143,7 @@ while test $# -ne 0; do
-m) mode=$2 -m) mode=$2
case $mode in case $mode in
*' '* | *' '* | *' *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
'* | *'*'* | *'?'* | *'['*)
echo "$0: invalid mode: $mode" >&2 echo "$0: invalid mode: $mode" >&2
exit 1;; exit 1;;
esac esac
@ -153,16 +152,23 @@ while test $# -ne 0; do
-o) chowncmd="$chownprog $2" -o) chowncmd="$chownprog $2"
shift;; shift;;
-p) cpprog="$cpprog -p";;
-s) stripcmd=$stripprog;; -s) stripcmd=$stripprog;;
-t) dst_arg=$2 -S) backupsuffix="$2"
shift;;
-t)
is_target_a_directory=always
dst_arg=$2
# Protect names problematic for 'test' and other utilities. # Protect names problematic for 'test' and other utilities.
case $dst_arg in case $dst_arg in
-* | [=\(\)!]) dst_arg=./$dst_arg;; -* | [=\(\)!]) dst_arg=./$dst_arg;;
esac esac
shift;; shift;;
-T) no_target_directory=true;; -T) is_target_a_directory=never;;
--version) echo "$0 $scriptversion"; exit $?;; --version) echo "$0 $scriptversion"; exit $?;;
@ -177,6 +183,16 @@ while test $# -ne 0; do
shift shift
done done
# We allow the use of options -d and -T together, by making -d
# take the precedence; this is for compatibility with GNU install.
if test -n "$dir_arg"; then
if test -n "$dst_arg"; then
echo "$0: target directory not allowed when installing a directory." >&2
exit 1
fi
fi
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
# When -d is used, all remaining arguments are directories to create. # When -d is used, all remaining arguments are directories to create.
# When -t is used, the destination is already specified. # When -t is used, the destination is already specified.
@ -207,6 +223,15 @@ if test $# -eq 0; then
exit 0 exit 0
fi fi
if test -z "$dir_arg"; then
if test $# -gt 1 || test "$is_target_a_directory" = always; then
if test ! -d "$dst_arg"; then
echo "$0: $dst_arg: Is not a directory." >&2
exit 1
fi
fi
fi
if test -z "$dir_arg"; then if test -z "$dir_arg"; then
do_exit='(exit $ret); exit $ret' do_exit='(exit $ret); exit $ret'
trap "ret=129; $do_exit" 1 trap "ret=129; $do_exit" 1
@ -250,6 +275,10 @@ do
dstdir=$dst dstdir=$dst
test -d "$dstdir" test -d "$dstdir"
dstdir_status=$? dstdir_status=$?
# Don't chown directories that already exist.
if test $dstdir_status = 0; then
chowncmd=""
fi
else else
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
@ -266,70 +295,36 @@ do
fi fi
dst=$dst_arg dst=$dst_arg
# If destination is a directory, append the input filename; won't work # If destination is a directory, append the input filename.
# if double slashes aren't ignored.
if test -d "$dst"; then if test -d "$dst"; then
if test -n "$no_target_directory"; then if test "$is_target_a_directory" = never; then
echo "$0: $dst_arg: Is a directory" >&2 echo "$0: $dst_arg: Is a directory" >&2
exit 1 exit 1
fi fi
dstdir=$dst dstdir=$dst
dst=$dstdir/`basename "$src"` dstbase=`basename "$src"`
case $dst in
*/) dst=$dst$dstbase;;
*) dst=$dst/$dstbase;;
esac
dstdir_status=0 dstdir_status=0
else else
# Prefer dirname, but fall back on a substitute if dirname fails. dstdir=`dirname "$dst"`
dstdir=`
(dirname "$dst") 2>/dev/null ||
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$dst" : 'X\(//\)[^/]' \| \
X"$dst" : 'X\(//\)$' \| \
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
echo X"$dst" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
}
/^X\(\/\/\)[^/].*/{
s//\1/
q
}
/^X\(\/\/\)$/{
s//\1/
q
}
/^X\(\/\).*/{
s//\1/
q
}
s/.*/./; q'
`
test -d "$dstdir" test -d "$dstdir"
dstdir_status=$? dstdir_status=$?
fi fi
fi fi
case $dstdir in
*/) dstdirslash=$dstdir;;
*) dstdirslash=$dstdir/;;
esac
obsolete_mkdir_used=false obsolete_mkdir_used=false
if test $dstdir_status != 0; then if test $dstdir_status != 0; then
case $posix_mkdir in case $posix_mkdir in
'') '')
# Create intermediate dirs using mode 755 as modified by the umask.
# This is like FreeBSD 'install' as of 1997-10-28.
umask=`umask`
case $stripcmd.$umask in
# Optimize common cases.
*[2367][2367]) mkdir_umask=$umask;;
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
*[0-7])
mkdir_umask=`expr $umask + 22 \
- $umask % 100 % 40 + $umask % 20 \
- $umask % 10 % 4 + $umask % 2
`;;
*) mkdir_umask=$umask,go-w;;
esac
# With -d, create the new directory with the user-specified mode. # With -d, create the new directory with the user-specified mode.
# Otherwise, rely on $mkdir_umask. # Otherwise, rely on $mkdir_umask.
if test -n "$dir_arg"; then if test -n "$dir_arg"; then
@ -339,43 +334,49 @@ do
fi fi
posix_mkdir=false posix_mkdir=false
case $umask in # The $RANDOM variable is not portable (e.g., dash). Use it
*[123567][0-7][0-7]) # here however when possible just to lower collision chance.
# POSIX mkdir -p sets u+wx bits regardless of umask, which
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
;;
*)
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
trap '
ret=$?
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
exit $ret
' 0
# Because "mkdir -p" follows existing symlinks and we likely work
# directly in world-writeable /tmp, make sure that the '$tmpdir'
# directory is successfully created first before we actually test
# 'mkdir -p'.
if (umask $mkdir_umask && if (umask $mkdir_umask &&
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 $mkdirprog $mkdir_mode "$tmpdir" &&
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
then then
if test -z "$dir_arg" || { if test -z "$dir_arg" || {
# Check for POSIX incompatibilities with -m. # Check for POSIX incompatibilities with -m.
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
# other-writable bit of parent directory when it shouldn't. # other-writable bit of parent directory when it shouldn't.
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
ls_ld_tmpdir=`ls -ld "$tmpdir"` test_tmpdir="$tmpdir/a"
ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
case $ls_ld_tmpdir in case $ls_ld_tmpdir in
d????-?r-*) different_mode=700;; d????-?r-*) different_mode=700;;
d????-?--*) different_mode=755;; d????-?--*) different_mode=755;;
*) false;; *) false;;
esac && esac &&
$mkdirprog -m$different_mode -p -- "$tmpdir" && { $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
ls_ld_tmpdir_1=`ls -ld "$tmpdir"` ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
} }
} }
then posix_mkdir=: then posix_mkdir=:
fi fi
rmdir "$tmpdir/d" "$tmpdir" rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
else else
# Remove any dirs left behind by ancient mkdir implementations. # Remove any dirs left behind by ancient mkdir implementations.
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
fi fi
trap '' 0;; trap '' 0;;
esac;;
esac esac
if if
@ -386,7 +387,7 @@ do
then : then :
else else
# The umask is ridiculous, or mkdir does not conform to POSIX, # mkdir does not conform to POSIX,
# or it failed possibly due to a race condition. Create the # or it failed possibly due to a race condition. Create the
# directory the slow way, step by step, checking for races as we go. # directory the slow way, step by step, checking for races as we go.
@ -396,14 +397,12 @@ do
*) prefix='';; *) prefix='';;
esac esac
eval "$initialize_posix_glob"
oIFS=$IFS oIFS=$IFS
IFS=/ IFS=/
$posix_glob set -f set -f
set fnord $dstdir set fnord $dstdir
shift shift
$posix_glob set +f set +f
IFS=$oIFS IFS=$oIFS
prefixes= prefixes=
@ -417,7 +416,7 @@ do
prefixes= prefixes=
else else
if $posix_mkdir; then if $posix_mkdir; then
(umask=$mkdir_umask && (umask $mkdir_umask &&
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
# Don't fail if two instances are running concurrently. # Don't fail if two instances are running concurrently.
test -d "$prefix" || exit 1 test -d "$prefix" || exit 1
@ -450,14 +449,25 @@ do
else else
# Make a couple of temp file names in the proper directory. # Make a couple of temp file names in the proper directory.
dsttmp=$dstdir/_inst.$$_ dsttmp=${dstdirslash}_inst.$$_
rmtmp=$dstdir/_rm.$$_ rmtmp=${dstdirslash}_rm.$$_
# Trap to clean up those temp files at exit. # Trap to clean up those temp files at exit.
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
# Copy the file name to the temp name. # Copy the file name to the temp name.
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && (umask $cp_umask &&
{ test -z "$stripcmd" || {
# Create $dsttmp read-write so that cp doesn't create it read-only,
# which would cause strip to fail.
if test -z "$doit"; then
: >"$dsttmp" # No need to fork-exec 'touch'.
else
$doit touch "$dsttmp"
fi
}
} &&
$doit_exec $cpprog "$src" "$dsttmp") &&
# and set any options; do chmod last to preserve setuid bits. # and set any options; do chmod last to preserve setuid bits.
# #
@ -474,18 +484,22 @@ do
if $copy_on_change && if $copy_on_change &&
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
set -f &&
eval "$initialize_posix_glob" &&
$posix_glob set -f &&
set X $old && old=:$2:$4:$5:$6 && set X $old && old=:$2:$4:$5:$6 &&
set X $new && new=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 &&
$posix_glob set +f && set +f &&
test "$old" = "$new" && test "$old" = "$new" &&
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
then then
rm -f "$dsttmp" rm -f "$dsttmp"
else else
# If $backupsuffix is set, and the file being installed
# already exists, attempt a backup. Don't worry if it fails,
# e.g., if mv doesn't support -f.
if test -n "$backupsuffix" && test -f "$dst"; then
$doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
fi
# Rename the file to the real destination. # Rename the file to the real destination.
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
@ -500,9 +514,9 @@ do
# file should still install successfully. # file should still install successfully.
{ {
test ! -f "$dst" || test ! -f "$dst" ||
$doit $rmcmd -f "$dst" 2>/dev/null || $doit $rmcmd "$dst" 2>/dev/null ||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
} || } ||
{ echo "$0: cannot unlink or rename $dst" >&2 { echo "$0: cannot unlink or rename $dst" >&2
(exit 1); exit 1 (exit 1); exit 1
@ -519,9 +533,9 @@ do
done done
# Local variables: # Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp) # eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-start: "scriptversion=" # time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-time-zone: "UTC" # time-stamp-time-zone: "UTC0"
# time-stamp-end: "; # UTC" # time-stamp-end: "; # UTC"
# End: # End:

View file

@ -1,7 +1,7 @@
#! /bin/sh #! /bin/sh
# mkinstalldirs --- make directory hierarchy # mkinstalldirs --- make directory hierarchy
scriptversion=2009-04-28.21; # UTC scriptversion=2020-07-26.22; # UTC
# Original author: Noah Friedman <friedman@prep.ai.mit.edu> # Original author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16 # Created: 1993-05-16
@ -92,6 +92,8 @@ case $dirmode in
*) *)
if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
test ! -d ./--version; then test ! -d ./--version; then
echo "umask 22"
umask 22
echo "mkdir -m $dirmode -p -- $*" echo "mkdir -m $dirmode -p -- $*"
exec mkdir -m "$dirmode" -p -- "$@" exec mkdir -m "$dirmode" -p -- "$@"
else else
@ -104,6 +106,9 @@ case $dirmode in
;; ;;
esac esac
echo "umask 22"
umask 22
for file for file
do do
case $file in case $file in
@ -132,21 +137,16 @@ do
if test ! -d "$pathcomp"; then if test ! -d "$pathcomp"; then
errstatus=$lasterr errstatus=$lasterr
else
if test ! -z "$dirmode"; then
echo "chmod $dirmode $pathcomp"
lasterr=
chmod "$dirmode" "$pathcomp" || lasterr=$?
if test ! -z "$lasterr"; then
errstatus=$lasterr
fi
fi
fi fi
fi fi
pathcomp=$pathcomp/ pathcomp=$pathcomp/
done done
if test ! -z "$dirmode"; then
echo "chmod $dirmode $file"
chmod "$dirmode" "$file" || errstatus=$?
fi
done done
exit $errstatus exit $errstatus
@ -154,9 +154,9 @@ exit $errstatus
# Local Variables: # Local Variables:
# mode: shell-script # mode: shell-script
# sh-indentation: 2 # sh-indentation: 2
# eval: (add-hook 'write-file-hooks 'time-stamp) # eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-start: "scriptversion=" # time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-time-zone: "UTC" # time-stamp-time-zone: "UTC0"
# time-stamp-end: "; # UTC" # time-stamp-end: "; # UTC"
# End: # End:

View file

@ -5,9 +5,9 @@
SDL_ROOT=$(dirname $0)/.. SDL_ROOT=$(dirname $0)/..
cd $SDL_ROOT cd $SDL_ROOT
if [ -x "$(command -v hg)" ]; then if [ -x "$(command -v git)" ]; then
rev="$(hg parents --template 'hg-{rev}:{node|short}' 2>/dev/null)" rev=$(echo "$(git remote get-url origin 2>/dev/null)@$(git rev-list HEAD~.. 2>/dev/null)")
if [ $? = 0 ]; then if [ "$rev" != "@" ]; then
echo $rev echo $rev
exit 0 exit 0
fi fi
@ -21,5 +21,5 @@ if [ -x "$(command -v p4)" ]; then
fi fi
fi fi
echo "hg-0:baadf00d" echo ""
exit 1 exit 1

View file

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
find . -type f -exec grep -Il "Copyright" {} \; \ find . -type f -exec grep -Il "Copyright" {} \; \
| grep -v \.hg \ | grep -v \.git \
| while read file; \ | while read file; \
do \ do \
LC_ALL=C sed -b -i "s/\(.*Copyright.*\)[0-9]\{4\}\( *Sam Lantinga\)/\1`date +%Y`\2/" "$file"; \ LC_ALL=C sed -b -i "s/\(.*Copyright.*\)[0-9]\{4\}\( *Sam Lantinga\)/\1`date +%Y`\2/" "$file"; \

View file

@ -8,10 +8,9 @@ srcdir=..
header=$outdir/include/SDL_revision.h header=$outdir/include/SDL_revision.h
rev=`sh showrev.sh 2>/dev/null` rev=`sh showrev.sh 2>/dev/null`
if [ "$rev" != "" -a "$rev" != "hg-0:baadf00d" ]; then if [ "$rev" != "" ]; then
revnum=`echo $rev | sed 's,hg-\([0-9]*\).*,\1,'`
echo "#define SDL_REVISION \"$rev\"" >"$header.new" echo "#define SDL_REVISION \"$rev\"" >"$header.new"
echo "#define SDL_REVISION_NUMBER $revnum" >>"$header.new" echo "#define SDL_REVISION_NUMBER 0" >>"$header.new"
if diff $header $header.new >/dev/null 2>&1; then if diff $header $header.new >/dev/null 2>&1; then
rm "$header.new" rm "$header.new"
else else

824
externals/SDL/build-scripts/wikiheaders.pl vendored Executable file
View file

@ -0,0 +1,824 @@
#!/usr/bin/perl -w
use warnings;
use strict;
use Text::Wrap;
my $srcpath = undef;
my $wikipath = undef;
my $warn_about_missing = 0;
my $copy_direction = 0;
foreach (@ARGV) {
$warn_about_missing = 1, next if $_ eq '--warn-about-missing';
$copy_direction = 1, next if $_ eq '--copy-to-headers';
$copy_direction = -1, next if $_ eq '--copy-to-wiki';
$srcpath = $_, next if not defined $srcpath;
$wikipath = $_, next if not defined $wikipath;
}
my $wordwrap_mode = 'mediawiki';
sub wordwrap_atom { # don't call this directly.
my $str = shift;
return fill('', '', $str);
}
sub wordwrap_with_bullet_indent { # don't call this directly.
my $bullet = shift;
my $str = shift;
my $retval = '';
# You _can't_ (at least with Pandoc) have a bullet item with a newline in
# MediaWiki, so _remove_ wrapping!
if ($wordwrap_mode eq 'mediawiki') {
$retval = "$bullet$str";
$retval =~ s/\n/ /gms;
return "$retval\n";
}
my $bulletlen = length($bullet);
# wrap it and then indent each line to be under the bullet.
$Text::Wrap::columns -= $bulletlen;
my @wrappedlines = split /\n/, wordwrap_atom($str);
$Text::Wrap::columns += $bulletlen;
my $prefix = $bullet;
my $usual_prefix = ' ' x $bulletlen;
foreach (@wrappedlines) {
$retval .= "$prefix$_\n";
$prefix = $usual_prefix;
}
return $retval;
}
sub wordwrap_one_paragraph { # don't call this directly.
my $retval = '';
my $p = shift;
#print "\n\n\nPARAGRAPH: [$p]\n\n\n";
if ($p =~ s/\A([\*\-] )//) { # bullet list, starts with "* " or "- ".
my $bullet = $1;
my $item = '';
my @items = split /\n/, $p;
foreach (@items) {
if (s/\A([\*\-] )//) {
$retval .= wordwrap_with_bullet_indent($bullet, $item);
$item = '';
}
s/\A\s*//;
$item .= "$_\n"; # accumulate lines until we hit the end or another bullet.
}
if ($item ne '') {
$retval .= wordwrap_with_bullet_indent($bullet, $item);
}
} else {
$retval = wordwrap_atom($p) . "\n";
}
return $retval;
}
sub wordwrap_paragraphs { # don't call this directly.
my $str = shift;
my $retval = '';
my @paragraphs = split /\n\n/, $str;
foreach (@paragraphs) {
next if $_ eq '';
$retval .= wordwrap_one_paragraph($_);
$retval .= "\n";
}
return $retval;
}
my $wordwrap_default_columns = 76;
sub wordwrap {
my $str = shift;
my $columns = shift;
$columns = $wordwrap_default_columns if not defined $columns;
$columns += $wordwrap_default_columns if $columns < 0;
$Text::Wrap::columns = $columns;
my $retval = '';
while ($str =~ s/(.*?)(\n+\`\`\`.*?\`\`\`\n+|\n+\<syntaxhighlight.*?\<\/syntaxhighlight\>\n+)//ms) {
$retval .= wordwrap_paragraphs($1); # wrap it.
$retval .= $2; # don't wrap it.
}
return $retval . wordwrap_paragraphs($str); # wrap what's left.
}
sub wikify {
my $wikitype = shift;
my $str = shift;
if ($wikitype eq 'mediawiki') {
# Convert obvious SDL things to wikilinks.
$str =~ s/\b(SDL_[a-zA-Z0-9_]+)/[[$1]]/gms;
# Make some Markdown things into MediaWiki...
$str =~ s/\`\`\`(c|c++)(.*?)\`\`\`/<syntaxhighlight lang='$1'>$2<\/syntaxhighlight>/gms;
# <code></code> is also popular. :/
$str =~ s/\`(.*?)\`/<code>$1<\/code>/gms;
# bold+italic
$str =~ s/\*\*\*(.*?)\*\*\*/'''''$1'''''/gms;
# bold
$str =~ s/\*\*(.*?)\*\*/'''$1'''/gms;
# italic
$str =~ s/\*(.*?)\*/''$1''/gms;
# bullets
$str =~ s/^\- /* /gm;
} elsif ($wikitype eq 'md') {
# Convert obvious SDL things to wikilinks.
$str =~ s/\b(SDL_[a-zA-Z0-9_]+)/[$1]($1)/gms;
}
return $str;
}
sub dewikify {
my $wikitype = shift;
my $str = shift;
return '' if not defined $str;
my @lines = split /\n/, $str;
return '' if scalar(@lines) == 0;
my $iwikitype = 0;
if ($wikitype eq 'mediawiki') {
$iwikitype = 1;
} elsif ($wikitype eq 'md') {
$iwikitype = 2;
} else {
die("Unexpected wikitype '$wikitype'\n");
}
while (1) {
my $l = shift @lines;
last if not defined $l;
chomp($l);
$l =~ s/\A\s*//;
$l =~ s/\s*\Z//;
next if ($l eq '');
next if ($iwikitype == 1) and ($l =~ /\A\= .*? \=\Z/);
next if ($iwikitype == 1) and ($l =~ /\A\=\= .*? \=\=\Z/);
next if ($iwikitype == 2) and ($l =~ /\A\#\# /);
unshift @lines, $l;
last;
}
while (1) {
my $l = pop @lines;
last if not defined $l;
chomp($l);
$l =~ s/\A\s*//;
$l =~ s/\s*\Z//;
next if ($l eq '');
push @lines, $l;
last;
}
$str = '';
foreach (@lines) {
chomp;
s/\A\s*//;
s/\s*\Z//;
$str .= "$_\n";
}
if ($iwikitype == 1) { #($wikitype eq 'mediawiki')
# Doxygen supports Markdown (and it just simply looks better than MediaWiki
# when looking at the raw headers, so do some conversions here as necessary.
$str =~ s/\[\[(SDL_[a-zA-Z0-9_]+)\]\]/$1/gms; # Dump obvious wikilinks.
# convert mediawiki syntax highlighting to Markdown backticks.
$str =~ s/\<syntaxhighlight lang='?(.*?)'?>(.*?)<\/syntaxhighlight>/```$1$2```/gms;
# <code></code> is also popular. :/
$str =~ s/\<code>(.*?)<\/code>/`$1`/gms;
# bold+italic
$str =~ s/\'''''(.*?)'''''/***$1***/gms;
# bold
$str =~ s/\'''(.*?)'''/**$1**/gms;
# italic
$str =~ s/\''(.*?)''/*$1*/gms;
# bullets
$str =~ s/^\* /- /gm;
}
return $str;
}
sub usage {
die("USAGE: $0 <source code git clone path> <wiki git clone path> [--copy-to-headers|--copy-to-wiki] [--warn-about-missing]\n\n");
}
usage() if not defined $srcpath;
usage() if not defined $wikipath;
#usage() if $copy_direction == 0;
my @standard_wiki_sections = (
'Draft',
'[Brief]',
'Syntax',
'Function Parameters',
'Return Value',
'Remarks',
'Version',
'Code Examples',
'Related Functions'
);
# Sections that only ever exist in the wiki and shouldn't be deleted when
# not found in the headers.
my %only_wiki_sections = ( # The ones don't mean anything, I just need to check for key existence.
'Draft', 1,
'Code Examples', 1
);
my %headers = (); # $headers{"SDL_audio.h"} -> reference to an array of all lines of text in SDL_audio.h.
my %headerfuncs = (); # $headerfuncs{"SDL_OpenAudio"} -> string of header documentation for SDL_OpenAudio, with comment '*' bits stripped from the start. Newlines embedded!
my %headerdecls = ();
my %headerfuncslocation = (); # $headerfuncslocation{"SDL_OpenAudio"} -> name of header holding SDL_OpenAudio define ("SDL_audio.h" in this case).
my %headerfuncschunk = (); # $headerfuncschunk{"SDL_OpenAudio"} -> offset in array in %headers that should be replaced for this function.
my $incpath = "$srcpath/include";
opendir(DH, $incpath) or die("Can't opendir '$incpath': $!\n");
while (readdir(DH)) {
my $dent = $_;
next if not $dent =~ /\ASDL.*?\.h\Z/; # just SDL*.h headers.
open(FH, '<', "$incpath/$dent") or die("Can't open '$incpath/$dent': $!\n");
my @contents = ();
while (<FH>) {
chomp;
if (not /\A\/\*\*/) { # not doxygen comment start?
push @contents, $_;
next;
}
my @templines = ();
push @templines, $_;
my $str = '';
while (<FH>) {
chomp;
push @templines, $_;
last if /\A\s*\*\/\Z/;
s/\A\s*\*\s*//;
$str .= "$_\n";
}
my $decl = <FH>;
chomp($decl);
if (not $decl =~ /\A\s*extern\s+DECLSPEC/) {
#print "Found doxygen but no function sig:\n$str\n\n";
foreach (@templines) {
push @contents, $_;
}
push @contents, $decl;
next;
}
my @decllines = ( $decl );
if (not $decl =~ /\)\s*;/) {
while (<FH>) {
chomp;
push @decllines, $_;
s/\A\s+//;
s/\s+\Z//;
$decl .= " $_";
last if /\)\s*;/;
}
}
$decl =~ s/\s+\);\Z/);/;
$decl =~ s/\s+\Z//;
#print("DECL: [$decl]\n");
my $fn = '';
if ($decl =~ /\A\s*extern\s+DECLSPEC\s+(const\s+|)(unsigned\s+|)(.*?)\s*(\*?)\s*SDLCALL\s+(.*?)\s*\((.*?)\);/) {
$fn = $5;
#$decl =~ s/\A\s*extern\s+DECLSPEC\s+(.*?)\s+SDLCALL/$1/;
} else {
#print "Found doxygen but no function sig:\n$str\n\n";
foreach (@templines) {
push @contents, $_;
}
foreach (@decllines) {
push @contents, $_;
}
next;
}
$decl = ''; # build this with the line breaks, since it looks better for syntax highlighting.
foreach (@decllines) {
if ($decl eq '') {
$decl = $_;
$decl =~ s/\Aextern\s+DECLSPEC\s+(.*?)\s+(\*?)SDLCALL\s+/$1$2 /;
} else {
my $trimmed = $_;
$trimmed =~ s/\A\s{24}//; # 24 for shrinking to match the removed "extern DECLSPEC SDLCALL "
$decl .= $trimmed;
}
$decl .= "\n";
}
#print("$fn:\n$str\n\n");
$headerfuncs{$fn} = $str;
$headerdecls{$fn} = $decl;
$headerfuncslocation{$fn} = $dent;
$headerfuncschunk{$fn} = scalar(@contents);
push @contents, join("\n", @templines);
push @contents, join("\n", @decllines);
}
close(FH);
$headers{$dent} = \@contents;
}
closedir(DH);
# !!! FIXME: we need to parse enums and typedefs and structs and defines and and and and and...
# !!! FIXME: (but functions are good enough for now.)
my %wikitypes = (); # contains string of wiki page extension, like $wikitypes{"SDL_OpenAudio"} == 'mediawiki'
my %wikifuncs = (); # contains references to hash of strings, each string being the full contents of a section of a wiki page, like $wikifuncs{"SDL_OpenAudio"}{"Remarks"}.
my %wikisectionorder = (); # contains references to array, each array item being a key to a wikipage section in the correct order, like $wikisectionorder{"SDL_OpenAudio"}[2] == 'Remarks'
opendir(DH, $wikipath) or die("Can't opendir '$wikipath': $!\n");
while (readdir(DH)) {
my $dent = $_;
my $type = '';
if ($dent =~ /\ASDL.*?\.(md|mediawiki)\Z/) {
$type = $1;
} else {
next; # only dealing with wiki pages.
}
open(FH, '<', "$wikipath/$dent") or die("Can't open '$wikipath/$dent': $!\n");
my $current_section = '[start]';
my @section_order = ( $current_section );
my $fn = $dent;
$fn =~ s/\..*\Z//;
my %sections = ();
$sections{$current_section} = '';
while (<FH>) {
chomp;
my $orig = $_;
s/\A\s*//;
s/\s*\Z//;
if ($type eq 'mediawiki') {
if (/\A\= (.*?) \=\Z/) {
$current_section = ($1 eq $fn) ? '[Brief]' : $1;
die("Doubly-defined section '$current_section' in '$dent'!\n") if defined $sections{$current_section};
push @section_order, $current_section;
$sections{$current_section} = '';
} elsif (/\A\=\= (.*?) \=\=\Z/) {
$current_section = ($1 eq $fn) ? '[Brief]' : $1;
die("Doubly-defined section '$current_section' in '$dent'!\n") if defined $sections{$current_section};
push @section_order, $current_section;
$sections{$current_section} = '';
next;
} elsif (/\A\-\-\-\-\Z/) {
$current_section = '[footer]';
die("Doubly-defined section '$current_section' in '$dent'!\n") if defined $sections{$current_section};
push @section_order, $current_section;
$sections{$current_section} = '';
next;
}
} elsif ($type eq 'md') {
if (/\A\#+ (.*?)\Z/) {
$current_section = ($1 eq $fn) ? '[Brief]' : $1;
die("Doubly-defined section '$current_section' in '$dent'!\n") if defined $sections{$current_section};
push @section_order, $current_section;
$sections{$current_section} = '';
next;
} elsif (/\A\-\-\-\-\Z/) {
$current_section = '[footer]';
die("Doubly-defined section '$current_section' in '$dent'!\n") if defined $sections{$current_section};
push @section_order, $current_section;
$sections{$current_section} = '';
next;
}
} else {
die("Unexpected wiki file type. Fixme!\n");
}
my $str = ($current_section eq 'Code Examples') ? $orig : $_;
$sections{$current_section} .= "$str\n";
}
close(FH);
foreach (keys %sections) {
$sections{$_} =~ s/\A\n+//;
$sections{$_} =~ s/\n+\Z//;
$sections{$_} .= "\n";
}
if (0) {
foreach (@section_order) {
print("$fn SECTION '$_':\n");
print($sections{$_});
print("\n\n");
}
}
$wikitypes{$fn} = $type;
$wikifuncs{$fn} = \%sections;
$wikisectionorder{$fn} = \@section_order;
}
closedir(DH);
if ($warn_about_missing) {
foreach (keys %wikifuncs) {
my $fn = $_;
if (not defined $headerfuncs{$fn}) {
print("WARNING: $fn defined in the wiki but not the headers!\n");
}
}
foreach (keys %headerfuncs) {
my $fn = $_;
if (not defined $wikifuncs{$fn}) {
print("WARNING: $fn defined in the headers but not the wiki!\n");
}
}
}
if ($copy_direction == 1) { # --copy-to-headers
my %changed_headers = ();
$wordwrap_mode = 'md'; # the headers use Markdown format.
# if it's not in the headers already, we don't add it, so iterate what we know is already there for changes.
foreach (keys %headerfuncs) {
my $fn = $_;
next if not defined $wikifuncs{$fn}; # don't have a page for that function, skip it.
my $wikitype = $wikitypes{$fn};
my $sectionsref = $wikifuncs{$fn};
my $remarks = %$sectionsref{'Remarks'};
my $params = %$sectionsref{'Function Parameters'};
my $returns = %$sectionsref{'Return Value'};
my $version = %$sectionsref{'Version'};
my $related = %$sectionsref{'Related Functions'};
my $brief = %$sectionsref{'[Brief]'};
my $addblank = 0;
my $str = '';
$brief = dewikify($wikitype, $brief);
$brief =~ s/\A(.*?\.) /$1\n/; # \brief should only be one sentence, delimited by a period+space. Split if necessary.
my @briefsplit = split /\n/, $brief;
$brief = shift @briefsplit;
if (defined $remarks) {
$remarks = join("\n", @briefsplit) . dewikify($wikitype, $remarks);
}
if (defined $brief) {
$str .= "\n" if $addblank; $addblank = 1;
$str .= wordwrap($brief) . "\n";
}
if (defined $remarks) {
$str .= "\n" if $addblank; $addblank = 1;
$str .= wordwrap($remarks) . "\n";
}
if (defined $params) {
$str .= "\n" if $addblank; $addblank = (defined $returns) ? 0 : 1;
my @lines = split /\n/, dewikify($wikitype, $params);
if ($wikitype eq 'mediawiki') {
die("Unexpected data parsing MediaWiki table") if (shift @lines ne '{|'); # Dump the '{|' start
while (scalar(@lines) >= 3) {
my $name = shift @lines;
my $desc = shift @lines;
my $terminator = shift @lines; # the '|-' or '|}' line.
last if ($terminator ne '|-') and ($terminator ne '|}'); # we seem to have run out of table.
$name =~ s/\A\|\s*//;
$name =~ s/\A\*\*(.*?)\*\*/$1/;
$name =~ s/\A\'\'\'(.*?)\'\'\'/$1/;
$desc =~ s/\A\|\s*//;
#print STDERR "FN: $fn NAME: $name DESC: $desc TERM: $terminator\n";
my $whitespacelen = length($name) + 8;
my $whitespace = ' ' x $whitespacelen;
$desc = wordwrap($desc, -$whitespacelen);
my @desclines = split /\n/, $desc;
my $firstline = shift @desclines;
$str .= "\\param $name $firstline\n";
foreach (@desclines) {
$str .= "${whitespace}$_\n";
}
}
} else {
die("write me");
}
}
if (defined $returns) {
$str .= "\n" if $addblank; $addblank = 1;
my $r = dewikify($wikitype, $returns);
my $retstr = "\\returns";
if ($r =~ s/\AReturn(s?) //) {
$retstr = "\\return$1";
}
my $whitespacelen = length($retstr) + 1;
my $whitespace = ' ' x $whitespacelen;
$r = wordwrap($r, -$whitespacelen);
my @desclines = split /\n/, $r;
my $firstline = shift @desclines;
$str .= "$retstr $firstline\n";
foreach (@desclines) {
$str .= "${whitespace}$_\n";
}
}
if (defined $version) {
# !!! FIXME: lots of code duplication in all of these.
$str .= "\n" if $addblank; $addblank = 1;
my $v = dewikify($wikitype, $version);
my $whitespacelen = length("\\since") + 1;
my $whitespace = ' ' x $whitespacelen;
$v = wordwrap($v, -$whitespacelen);
my @desclines = split /\n/, $v;
my $firstline = shift @desclines;
$str .= "\\since $firstline\n";
foreach (@desclines) {
$str .= "${whitespace}$_\n";
}
}
if (defined $related) {
# !!! FIXME: lots of code duplication in all of these.
$str .= "\n" if $addblank; $addblank = 1;
my $v = dewikify($wikitype, $related);
my @desclines = split /\n/, $v;
foreach (@desclines) {
s/\A(\:|\* )//;
$str .= "\\sa $_\n";
}
}
my @lines = split /\n/, $str;
my $output = "/**\n";
foreach (@lines) {
chomp;
s/\s*\Z//;
if ($_ eq '') {
$output .= " *\n";
} else {
$output .= " * $_\n";
}
}
$output .= " */";
#print("$fn:\n$output\n\n");
my $header = $headerfuncslocation{$fn};
my $chunk = $headerfuncschunk{$fn};
my $contentsref = $headers{$header};
$$contentsref[$chunk] = $output;
#$$contentsref[$chunk+1] = $headerdecls{$fn};
$changed_headers{$header} = 1;
}
foreach (keys %changed_headers) {
my $contentsref = $headers{$_};
my $path = "$incpath/$_.tmp";
open(FH, '>', $path) or die("Can't open '$path': $!\n");
foreach (@$contentsref) {
print FH "$_\n";
}
close(FH);
rename($path, "$incpath/$_") or die("Can't rename '$path' to '$incpath/$_': $!\n");
}
} elsif ($copy_direction == -1) { # --copy-to-wiki
foreach (keys %headerfuncs) {
my $fn = $_;
my $wikitype = defined $wikitypes{$fn} ? $wikitypes{$fn} : 'mediawiki'; # default to MediaWiki for new stuff FOR NOW.
die("Unexpected wikitype '$wikitype'\n") if (($wikitype ne 'mediawiki') and ($wikitype ne 'md'));
#print("$fn\n"); next;
$wordwrap_mode = $wikitype;
my $raw = $headerfuncs{$fn}; # raw doxygen text with comment characters stripped from start/end and start of each line.
$raw =~ s/\A\s*\\brief\s+//; # Technically we don't need \brief (please turn on JAVADOC_AUTOBRIEF if you use Doxygen), so just in case one is present, strip it.
my @doxygenlines = split /\n/, $raw;
my $brief = '';
while (@doxygenlines) {
last if $doxygenlines[0] =~ /\A\\/; # some sort of doxygen command, assume we're past the general remarks.
last if $doxygenlines[0] =~ /\A\s*\Z/; # blank line? End of paragraph, done.
my $l = shift @doxygenlines;
chomp($l);
$l =~ s/\A\s*//;
$l =~ s/\s*\Z//;
$brief .= "$l ";
}
$brief =~ s/\A(.*?\.) /$1\n\n/; # \brief should only be one sentence, delimited by a period+space. Split if necessary.
my @briefsplit = split /\n/, $brief;
$brief = wikify($wikitype, shift @briefsplit) . "\n";
@doxygenlines = (@briefsplit, @doxygenlines);
my $remarks = '';
while (@doxygenlines) {
last if $doxygenlines[0] =~ /\A\\/; # some sort of doxygen command, assume we're past the general remarks.
my $l = shift @doxygenlines;
$l =~ s/\A\s*//;
$l =~ s/\s*\Z//;
$remarks .= "$l\n";
}
$remarks = wordwrap(wikify($wikitype, $remarks));
$remarks =~ s/\A\s*//;
$remarks =~ s/\s*\Z//;
my $decl = $headerdecls{$fn};
#$decl =~ s/\*\s+SDLCALL/ *SDLCALL/; # Try to make "void * Function" become "void *Function"
#$decl =~ s/\A\s*extern\s+DECLSPEC\s+(.*?)\s+(\*?)SDLCALL/$1$2/;
my $syntax = '';
if ($wikitype eq 'mediawiki') {
$syntax = "<syntaxhighlight lang='c'>\n$decl</syntaxhighlight>\n";
} elsif ($wikitype eq 'md') {
$syntax = "```c\n$decl\n```\n";
} else { die("Expected wikitype '$wikitype'\n"); }
my %sections = ();
$sections{'[Brief]'} = $brief; # include this section even if blank so we get a title line.
$sections{'Remarks'} = "$remarks\n" if $remarks ne '';
$sections{'Syntax'} = $syntax;
my @params = (); # have to parse these and build up the wiki tables after, since Markdown needs to know the length of the largest string. :/
while (@doxygenlines) {
my $l = shift @doxygenlines;
if ($l =~ /\A\\param\s+(.*?)\s+(.*)\Z/) {
my $arg = $1;
my $desc = $2;
while (@doxygenlines) {
my $subline = $doxygenlines[0];
$subline =~ s/\A\s*//;
last if $subline =~ /\A\\/; # some sort of doxygen command, assume we're past this thing.
last if $subline eq ''; # empty line, this param is done.
shift @doxygenlines; # dump this line from the array; we're using it.
$desc .= " $subline";
}
# We need to know the length of the longest string to make Markdown tables, so we just store these off until everything is parsed.
push @params, $arg;
push @params, $desc;
} elsif ($l =~ /\A\\r(eturns?)\s+(.*)\Z/) {
my $retstr = "R$1"; # "Return" or "Returns"
my $desc = $2;
while (@doxygenlines) {
my $subline = $doxygenlines[0];
$subline =~ s/\A\s*//;
last if $subline =~ /\A\\/; # some sort of doxygen command, assume we're past this thing.
last if $subline eq ''; # empty line, this param is done.
shift @doxygenlines; # dump this line from the array; we're using it.
$desc .= wikify($wikitype, " $subline");
}
$sections{'Return Value'} = wordwrap("$retstr $desc") . "\n";
} elsif ($l =~ /\A\\since\s+(.*)\Z/) {
my $desc = $1;
while (@doxygenlines) {
my $subline = $doxygenlines[0];
$subline =~ s/\A\s*//;
last if $subline =~ /\A\\/; # some sort of doxygen command, assume we're past this thing.
last if $subline eq ''; # empty line, this param is done.
shift @doxygenlines; # dump this line from the array; we're using it.
$desc .= wikify($wikitype, " $subline");
}
$sections{'Version'} = wordwrap($desc) . "\n";
} elsif ($l =~ /\A\\sa\s+(.*)\Z/) {
my $sa = $1;
$sections{'Related Functions'} = '' if not defined $sections{'Related Functions'};
if ($wikitype eq 'mediawiki') {
$sections{'Related Functions'} .= ":[[$sa]]\n";
} elsif ($wikitype eq 'md') {
$sections{'Related Functions'} .= "* [$sa](/$sa)\n";
} else { die("Expected wikitype '$wikitype'\n"); }
}
}
# Make sure this ends with a double-newline.
$sections{'Related Functions'} .= "\n" if defined $sections{'Related Functions'};
# We can build the wiki table now that we have all the data.
if (scalar(@params) > 0) {
my $str = '';
if ($wikitype eq 'mediawiki') {
while (scalar(@params) > 0) {
my $arg = shift @params;
my $desc = wikify($wikitype, shift @params);
$str .= ($str eq '') ? "{|\n" : "|-\n";
$str .= "|'''$arg'''\n";
$str .= "|$desc\n";
}
$str .= "|}\n";
} elsif ($wikitype eq 'md') {
my $longest_arg = 0;
my $longest_desc = 0;
my $which = 0;
foreach (@params) {
if ($which == 0) {
my $len = length($_) + 4;
$longest_arg = $len if ($len > $longest_arg);
$which = 1;
} else {
my $len = length(wikify($wikitype, $_));
$longest_desc = $len if ($len > $longest_desc);
$which = 0;
}
}
# Markdown tables are sort of obnoxious.
$str .= '| ' . (' ' x ($longest_arg+4)) . ' | ' . (' ' x $longest_desc) . " |\n";
$str .= '| ' . ('-' x ($longest_arg+4)) . ' | ' . ('-' x $longest_desc) . " |\n";
while (@params) {
my $arg = shift @params;
my $desc = wikify($wikitype, shift @params);
$str .= "| **$arg** " . (' ' x ($longest_arg - length($arg))) . "| $desc" . (' ' x ($longest_desc - length($desc))) . " |\n";
}
} else {
die("Unexpected wikitype!\n"); # should have checked this elsewhere.
}
$sections{'Function Parameters'} = $str;
}
my $path = "$wikipath/$_.${wikitype}.tmp";
open(FH, '>', $path) or die("Can't open '$path': $!\n");
my $sectionsref = $wikifuncs{$fn};
foreach (@standard_wiki_sections) {
# drop sections we either replaced or removed from the original wiki's contents.
if (not defined $only_wiki_sections{$_}) {
delete($$sectionsref{$_});
}
}
my $wikisectionorderref = $wikisectionorder{$fn};
my @ordered_sections = (@standard_wiki_sections, defined $wikisectionorderref ? @$wikisectionorderref : ()); # this copies the arrays into one.
foreach (@ordered_sections) {
my $sect = $_;
next if $sect eq '[start]';
next if (not defined $sections{$sect} and not defined $$sectionsref{$sect});
my $section = defined $sections{$sect} ? $sections{$sect} : $$sectionsref{$sect};
if ($sect eq '[footer]') {
print FH "----\n"; # It's the same in Markdown and MediaWiki.
} elsif ($sect eq '[Brief]') {
if ($wikitype eq 'mediawiki') {
print FH "= $fn =\n\n";
} elsif ($wikitype eq 'md') {
print FH "# $fn\n\n";
} else { die("Expected wikitype '$wikitype'\n"); }
} else {
if ($wikitype eq 'mediawiki') {
print FH "\n== $sect ==\n\n";
} elsif ($wikitype eq 'md') {
print FH "\n## $sect\n\n";
} else { die("Expected wikitype '$wikitype'\n"); }
}
print FH defined $sections{$sect} ? $sections{$sect} : $$sectionsref{$sect};
# make sure these don't show up twice.
delete($sections{$sect});
delete($$sectionsref{$sect});
}
print FH "\n\n";
close(FH);
rename($path, "$wikipath/$_.${wikitype}") or die("Can't rename '$path' to '$wikipath/$_.${wikitype}': $!\n");
}
}
# end of wikiheaders.pl ...

View file

@ -39,7 +39,7 @@
# #
# Base version of SDL, used for packaging purposes # Base version of SDL, used for packaging purposes
$SDLVersion = "2.0.14" $SDLVersion = "2.0.15"
# Gets the .bat file that sets up an MSBuild environment, given one of # Gets the .bat file that sets up an MSBuild environment, given one of
# Visual Studio's, "PlatformToolset"s. # Visual Studio's, "PlatformToolset"s.

View file

@ -64,6 +64,21 @@ macro(LISTTOSTR _LIST _OUTPUT)
endforeach() endforeach()
endmacro() endmacro()
macro(LISTTOSTRREV _LIST _OUTPUT)
if(${ARGC} EQUAL 3)
# prefix for each element
set(_LPREFIX ${ARGV2})
else()
set(_LPREFIX "")
endif()
# Do not use string(REPLACE ";" " ") here to avoid messing up list
# entries
foreach(_ITEM ${${_LIST}})
set(${_OUTPUT} "${${_OUTPUT}} ${_LPREFIX}${_ITEM}")
endforeach()
endmacro()
macro(CHECK_OBJC_SOURCE_COMPILES SOURCE VAR) macro(CHECK_OBJC_SOURCE_COMPILES SOURCE VAR)
set(PREV_REQUIRED_DEFS "${CMAKE_REQUIRED_DEFINITIONS}") set(PREV_REQUIRED_DEFS "${CMAKE_REQUIRED_DEFINITIONS}")
set(CMAKE_REQUIRED_DEFINITIONS "-x objective-c ${PREV_REQUIRED_DEFS}") set(CMAKE_REQUIRED_DEFINITIONS "-x objective-c ${PREV_REQUIRED_DEFS}")

View file

@ -128,6 +128,37 @@ macro(CheckALSA)
endif() endif()
endmacro() endmacro()
# Requires:
# - PkgCheckModules
# Optional:
# - PIPEWIRE_SHARED opt
# - HAVE_DLOPEN opt
macro(CheckPipewire)
if(PIPEWIRE)
pkg_check_modules(PKG_PIPEWIRE libpipewire-0.3>=0.3.20)
if(PKG_PIPEWIRE_FOUND)
set(HAVE_PIPEWIRE TRUE)
file(GLOB PIPEWIRE_SOURCES ${SDL2_SOURCE_DIR}/src/audio/pipewire/*.c)
set(SOURCE_FILES ${SOURCE_FILES} ${PIPEWIRE_SOURCES})
set(SDL_AUDIO_DRIVER_PIPEWIRE 1)
list(APPEND EXTRA_CFLAGS ${PKG_PIPEWIRE_CFLAGS})
if(PIPEWIRE_SHARED)
if(NOT HAVE_DLOPEN)
message_warn("You must have SDL_LoadObject() support for dynamic Pipewire loading")
else()
FindLibraryAndSONAME("pipewire-0.3")
set(SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC "\"${PIPEWIRE_0.3_LIB_SONAME}\"")
set(HAVE_PIPEWIRE_SHARED TRUE)
endif()
else()
list(APPEND EXTRA_LDFLAGS ${PKG_PIPEWIRE_LDFLAGS})
endif()
set(HAVE_SDL_AUDIO TRUE)
endif()
endif()
endmacro()
# Requires: # Requires:
# - PkgCheckModules # - PkgCheckModules
# Optional: # Optional:
@ -400,7 +431,7 @@ macro(CheckX11)
check_include_file(X11/Xcursor/Xcursor.h HAVE_XCURSOR_H) check_include_file(X11/Xcursor/Xcursor.h HAVE_XCURSOR_H)
check_include_file(X11/extensions/Xinerama.h HAVE_XINERAMA_H) check_include_file(X11/extensions/Xinerama.h HAVE_XINERAMA_H)
check_include_file(X11/extensions/XInput2.h HAVE_XINPUT_H) check_include_file(X11/extensions/XInput2.h HAVE_XINPUT2_H)
check_include_file(X11/extensions/Xrandr.h HAVE_XRANDR_H) check_include_file(X11/extensions/Xrandr.h HAVE_XRANDR_H)
check_include_file(X11/extensions/Xrender.h HAVE_XRENDER_H) check_include_file(X11/extensions/Xrender.h HAVE_XRENDER_H)
check_include_file(X11/extensions/scrnsaver.h HAVE_XSS_H) check_include_file(X11/extensions/scrnsaver.h HAVE_XSS_H)
@ -498,7 +529,7 @@ macro(CheckX11)
set(SDL_VIDEO_DRIVER_X11_XINERAMA 1) set(SDL_VIDEO_DRIVER_X11_XINERAMA 1)
endif() endif()
if(VIDEO_X11_XINPUT AND HAVE_XINPUT_H) if(VIDEO_X11_XINPUT AND HAVE_XINPUT2_H)
set(HAVE_VIDEO_X11_XINPUT TRUE) set(HAVE_VIDEO_X11_XINPUT TRUE)
if(HAVE_X11_SHARED AND XI_LIB) if(HAVE_X11_SHARED AND XI_LIB)
set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 "\"${XI_LIB_SONAME}\"") set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 "\"${XI_LIB_SONAME}\"")
@ -564,7 +595,7 @@ macro(CheckX11)
endif() endif()
endmacro() endmacro()
macro(WaylandProtocolGen _SCANNER _XML _PROTL) macro(WaylandProtocolGen _SCANNER _CODE_MODE _XML _PROTL)
set(_WAYLAND_PROT_C_CODE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols/${_PROTL}-protocol.c") set(_WAYLAND_PROT_C_CODE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols/${_PROTL}-protocol.c")
set(_WAYLAND_PROT_H_CODE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols/${_PROTL}-client-protocol.h") set(_WAYLAND_PROT_H_CODE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols/${_PROTL}-client-protocol.h")
@ -579,7 +610,7 @@ macro(WaylandProtocolGen _SCANNER _XML _PROTL)
OUTPUT "${_WAYLAND_PROT_C_CODE}" OUTPUT "${_WAYLAND_PROT_C_CODE}"
DEPENDS "${_WAYLAND_PROT_H_CODE}" DEPENDS "${_WAYLAND_PROT_H_CODE}"
COMMAND "${_SCANNER}" COMMAND "${_SCANNER}"
ARGS code "${_XML}" "${_WAYLAND_PROT_C_CODE}" ARGS "${_CODE_MODE}" "${_XML}" "${_WAYLAND_PROT_C_CODE}"
) )
set(SOURCE_FILES ${SOURCE_FILES} "${_WAYLAND_PROT_C_CODE}") set(SOURCE_FILES ${SOURCE_FILES} "${_WAYLAND_PROT_C_CODE}")
@ -594,6 +625,7 @@ endmacro()
macro(CheckWayland) macro(CheckWayland)
if(VIDEO_WAYLAND) if(VIDEO_WAYLAND)
pkg_check_modules(WAYLAND wayland-client wayland-scanner wayland-egl wayland-cursor egl xkbcommon) pkg_check_modules(WAYLAND wayland-client wayland-scanner wayland-egl wayland-cursor egl xkbcommon)
pkg_check_modules(WAYLAND_SCANNER_1_15 "wayland-scanner>=1.15")
if(WAYLAND_FOUND) if(WAYLAND_FOUND)
execute_process( execute_process(
@ -610,6 +642,12 @@ macro(CheckWayland)
endif() endif()
if(WAYLAND_FOUND) if(WAYLAND_FOUND)
if(WAYLAND_SCANNER_1_15_FOUND)
set(WAYLAND_SCANNER_CODE_MODE "private-code")
else()
set(WAYLAND_SCANNER_CODE_MODE "code")
endif()
link_directories( link_directories(
${WAYLAND_LIBRARY_DIRS} ${WAYLAND_LIBRARY_DIRS}
) )
@ -629,7 +667,7 @@ macro(CheckWayland)
file(GLOB WAYLAND_PROTOCOLS_XML RELATIVE "${SDL2_SOURCE_DIR}/wayland-protocols/" "${SDL2_SOURCE_DIR}/wayland-protocols/*.xml") file(GLOB WAYLAND_PROTOCOLS_XML RELATIVE "${SDL2_SOURCE_DIR}/wayland-protocols/" "${SDL2_SOURCE_DIR}/wayland-protocols/*.xml")
foreach(_XML ${WAYLAND_PROTOCOLS_XML}) foreach(_XML ${WAYLAND_PROTOCOLS_XML})
string(REGEX REPLACE "\\.xml$" "" _PROTL "${_XML}") string(REGEX REPLACE "\\.xml$" "" _PROTL "${_XML}")
WaylandProtocolGen("${WAYLAND_SCANNER}" "${SDL2_SOURCE_DIR}/wayland-protocols/${_XML}" "${_PROTL}") WaylandProtocolGen("${WAYLAND_SCANNER}" "${WAYLAND_SCANNER_CODE_MODE}" "${SDL2_SOURCE_DIR}/wayland-protocols/${_XML}" "${_PROTL}")
endforeach() endforeach()
if(VIDEO_WAYLAND_QT_TOUCH) if(VIDEO_WAYLAND_QT_TOUCH)
@ -739,6 +777,22 @@ macro(CheckVivante)
endif(VIDEO_VIVANTE) endif(VIDEO_VIVANTE)
endmacro(CheckVivante) endmacro(CheckVivante)
# Requires:
# - libglvnd
macro(CheckOpenGLKMSDRM)
if(VIDEO_OPENGL AND HAVE_VIDEO_KMSDRM)
check_c_source_compiles("
#include <GL/gl.h>
int main(int argc, char** argv) {}" HAVE_VIDEO_OPENGL)
if(HAVE_VIDEO_OPENGL)
set(HAVE_VIDEO_OPENGL TRUE)
set(SDL_VIDEO_OPENGL 1)
set(SDL_VIDEO_RENDER_OGL 1)
endif()
endif()
endmacro()
# Requires: # Requires:
# - nada # - nada
macro(CheckOpenGLX11) macro(CheckOpenGLX11)
@ -759,8 +813,34 @@ endmacro()
# Requires: # Requires:
# - PkgCheckModules # - PkgCheckModules
macro(CheckOpenGLESX11) macro(CheckEGL)
pkg_check_modules(EGL egl) pkg_check_modules(EGL egl)
string(REPLACE "-D_THREAD_SAFE;" "-D_THREAD_SAFE=1;" EGL_CFLAGS "${EGL_CFLAGS}")
endmacro()
# Requires:
# - PkgCheckModules
macro(CheckEGLKMSDRM)
if (HAVE_VIDEO_OPENGLES OR HAVE_VIDEO_OPENGL)
CheckEGL()
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${EGL_CFLAGS}")
check_c_source_compiles("
#define EGL_API_FB
#define MESA_EGL_NO_X11_HEADERS
#define EGL_NO_X11
#include <EGL/egl.h>
#include <EGL/eglext.h>
int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGL_EGL)
if(HAVE_VIDEO_OPENGL_EGL)
set(SDL_VIDEO_OPENGL_EGL 1)
endif()
endif()
endmacro()
# Requires:
# - PkgCheckModules
macro(CheckOpenGLESX11)
CheckEGL()
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${EGL_CFLAGS}") set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${EGL_CFLAGS}")
if(VIDEO_OPENGLES) if(VIDEO_OPENGLES)
check_c_source_compiles(" check_c_source_compiles("
@ -839,6 +919,9 @@ macro(CheckPTHREAD)
elseif(HAIKU) elseif(HAIKU)
set(PTHREAD_CFLAGS "-D_REENTRANT") set(PTHREAD_CFLAGS "-D_REENTRANT")
set(PTHREAD_LDFLAGS "") set(PTHREAD_LDFLAGS "")
elseif(EMSCRIPTEN)
set(PTHREAD_CFLAGS "-D_REENTRANT -pthread")
set(PTHREAD_LDFLAGS "-pthread")
else() else()
set(PTHREAD_CFLAGS "-D_REENTRANT") set(PTHREAD_CFLAGS "-D_REENTRANT")
set(PTHREAD_LDFLAGS "-lpthread") set(PTHREAD_LDFLAGS "-lpthread")
@ -847,17 +930,13 @@ macro(CheckPTHREAD)
# Run some tests # Run some tests
set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${PTHREAD_CFLAGS} ${PTHREAD_LDFLAGS}") set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${PTHREAD_CFLAGS} ${PTHREAD_LDFLAGS}")
if(CMAKE_CROSSCOMPILING) check_c_source_compiles("
set(HAVE_PTHREADS 1)
else()
check_c_source_runs("
#include <pthread.h> #include <pthread.h>
int main(int argc, char** argv) { int main(int argc, char** argv) {
pthread_attr_t type; pthread_attr_t type;
pthread_attr_init(&type); pthread_attr_init(&type);
return 0; return 0;
}" HAVE_PTHREADS) }" HAVE_PTHREADS)
endif()
if(HAVE_PTHREADS) if(HAVE_PTHREADS)
set(SDL_THREAD_PTHREAD 1) set(SDL_THREAD_PTHREAD 1)
list(APPEND EXTRA_CFLAGS ${PTHREAD_CFLAGS}) list(APPEND EXTRA_CFLAGS ${PTHREAD_CFLAGS})
@ -866,6 +945,7 @@ macro(CheckPTHREAD)
list(APPEND SDL_LIBS ${PTHREAD_LDFLAGS}) list(APPEND SDL_LIBS ${PTHREAD_LDFLAGS})
check_c_source_compiles(" check_c_source_compiles("
#define _GNU_SOURCE 1
#include <pthread.h> #include <pthread.h>
int main(int argc, char **argv) { int main(int argc, char **argv) {
pthread_mutexattr_t attr; pthread_mutexattr_t attr;
@ -876,6 +956,7 @@ macro(CheckPTHREAD)
set(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1) set(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1)
else() else()
check_c_source_compiles(" check_c_source_compiles("
#define _GNU_SOURCE 1
#include <pthread.h> #include <pthread.h>
int main(int argc, char **argv) { int main(int argc, char **argv) {
pthread_mutexattr_t attr; pthread_mutexattr_t attr;
@ -1056,7 +1137,7 @@ macro(CheckUSBHID)
return 0; return 0;
}" HAVE_MACHINE_JOYSTICK) }" HAVE_MACHINE_JOYSTICK)
if(HAVE_MACHINE_JOYSTICK) if(HAVE_MACHINE_JOYSTICK)
set(SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H 1) set(SDL_HAVE_MACHINE_JOYSTICK_H 1)
endif() endif()
set(SDL_JOYSTICK_USBHID 1) set(SDL_JOYSTICK_USBHID 1)
file(GLOB BSD_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/bsd/*.c) file(GLOB BSD_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/bsd/*.c)
@ -1152,7 +1233,7 @@ endmacro(CheckRPI)
macro(CheckKMSDRM) macro(CheckKMSDRM)
if(VIDEO_KMSDRM) if(VIDEO_KMSDRM)
pkg_check_modules(KMSDRM libdrm gbm egl) pkg_check_modules(KMSDRM libdrm gbm egl)
if(KMSDRM_FOUND) if(KMSDRM_FOUND AND HAVE_VIDEO_OPENGL_EGL)
link_directories( link_directories(
${KMSDRM_LIBRARY_DIRS} ${KMSDRM_LIBRARY_DIRS}
) )
@ -1163,8 +1244,7 @@ macro(CheckKMSDRM)
set(HAVE_SDL_VIDEO TRUE) set(HAVE_SDL_VIDEO TRUE)
file(GLOB KMSDRM_SOURCES ${SDL2_SOURCE_DIR}/src/video/kmsdrm/*.c) file(GLOB KMSDRM_SOURCES ${SDL2_SOURCE_DIR}/src/video/kmsdrm/*.c)
file(GLOB KMSDRM_LEGACY_SOURCES ${SDL2_SOURCE_DIR}/src/video/kmsdrm_legacy/*.c) set(SOURCE_FILES ${SOURCE_FILES} ${KMSDRM_SOURCES})
set(SOURCE_FILES ${SOURCE_FILES} ${KMSDRM_SOURCES} ${KMSDRM_LEGACY_SOURCES})
list(APPEND EXTRA_CFLAGS ${KMSDRM_CFLAGS}) list(APPEND EXTRA_CFLAGS ${KMSDRM_CFLAGS})

1119
externals/SDL/configure vendored

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,9 @@
libsdl2 (2.0.15) UNRELEASED; urgency=low
* Updated SDL to version 2.0.15 for development builds
-- Sam Lantinga <slouken@libsdl.org> Tue, 22 Dec 2020 10:29:01 -0800
libsdl2 (2.0.14) UNRELEASED; urgency=low libsdl2 (2.0.14) UNRELEASED; urgency=low
* Updated SDL to version 2.0.14 * Updated SDL to version 2.0.14

View file

@ -13,30 +13,44 @@ Build-Depends: debhelper (>= 9),
dpkg-dev (>= 1.16.1~), dpkg-dev (>= 1.16.1~),
fcitx-libs-dev [linux-any], fcitx-libs-dev [linux-any],
libasound2-dev [linux-any], libasound2-dev [linux-any],
libdbus-1-dev,
libegl1-mesa-dev [!hurd-any],
libdrm-dev [linux-any],
libgl1-mesa-dev, libgl1-mesa-dev,
libgles-dev [!hurd-any],
libpulse-dev, libpulse-dev,
libudev-dev [linux-any], libudev-dev [linux-any],
libdbus-1-dev [linux-any], libdbus-1-dev [linux-any],
libibus-1.0-dev[linux-any], libibus-1.0-dev[linux-any],
libpulse-dev,
libsndio-dev,
libudev-dev [linux-any],
libusb2-dev [kfreebsd-any], libusb2-dev [kfreebsd-any],
libusbhid-dev [kfreebsd-any], libusbhid-dev [kfreebsd-any],
libwayland-dev [linux-any],
libx11-dev, libx11-dev,
libxcursor-dev, libxcursor-dev,
libxext-dev, libxext-dev,
libxi-dev, libxi-dev,
libxinerama-dev, libxinerama-dev,
libxkbcommon-dev,
libxrandr-dev, libxrandr-dev,
libxss-dev, libxss-dev,
libxxf86vm-dev libxxf86vm-dev,
libxt-dev,
libxv-dev,
pkg-config,
libsamplerate0-dev,
wayland-protocols
Homepage: http://www.libsdl.org/ Homepage: http://www.libsdl.org/
Package: libsdl2 Package: libsdl2-2.0-0
Architecture: any Architecture: any
Multi-Arch: same Multi-Arch: same
Pre-Depends: ${misc:Pre-Depends} Pre-Depends: ${misc:Pre-Depends}
Depends: ${misc:Depends}, Depends: ${misc:Depends},
${shlibs:Depends}, ${shlibs:Depends},
libudev0 [linux-any], libudev1 [linux-any],
libdbus-1-3 [linux-any] libdbus-1-3 [linux-any]
Conflicts: libsdl-1.3-0 Conflicts: libsdl-1.3-0
Replaces: libsdl-1.3-0 Replaces: libsdl-1.3-0
@ -51,7 +65,7 @@ Section: libdevel
Architecture: any Architecture: any
Multi-Arch: same Multi-Arch: same
Depends: ${misc:Depends}, Depends: ${misc:Depends},
libsdl2 (= ${binary:Version}), libsdl2-2.0-0 (= ${binary:Version}),
libc6-dev, libc6-dev,
libgl1-mesa-dev libgl1-mesa-dev
Conflicts: libsdl-1.3-dev Conflicts: libsdl-1.3-dev
@ -68,7 +82,7 @@ Section: debug
Architecture: any Architecture: any
Multi-Arch: same Multi-Arch: same
Depends: ${misc:Depends}, Depends: ${misc:Depends},
libsdl2 (= ${binary:Version}), libsdl2-2.0-0 (= ${binary:Version}),
Description: Simple DirectMedia Layer debug files Description: Simple DirectMedia Layer debug files
SDL is a library that allows programs portable low level access to a video SDL is a library that allows programs portable low level access to a video
framebuffer, audio output, mouse, and keyboard. framebuffer, audio output, mouse, and keyboard.

View file

@ -4,7 +4,7 @@ Upstream-Contact: Sam Lantinga <slouken@libsdl.org>
Source: http://www.libsdl.org/ Source: http://www.libsdl.org/
Files: * Files: *
Copyright: 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright: 1997-2021 Sam Lantinga <slouken@libsdl.org>
License: zlib/libpng License: zlib/libpng
Files: src/libm/* Files: src/libm/*
@ -12,7 +12,7 @@ Copyright: 1993 by Sun Microsystems, Inc. All rights reserved.
License: SunPro License: SunPro
Files: src/main/windows/SDL_windows_main.c Files: src/main/windows/SDL_windows_main.c
Copyright: 2020 Sam Lantinga Copyright: 2021 Sam Lantinga
License: PublicDomain_Sam_Lantinga License: PublicDomain_Sam_Lantinga
Comment: SDL_main.c, placed in the public domain by Sam Lantinga 4/13/98 Comment: SDL_main.c, placed in the public domain by Sam Lantinga 4/13/98
@ -32,7 +32,7 @@ Copyright: 1995 Erik Corry
License: BrownUn_UnCalifornia_ErikCorry License: BrownUn_UnCalifornia_ErikCorry
Files: src/test/SDL_test_md5.c Files: src/test/SDL_test_md5.c
Copyright: 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright: 1997-2021 Sam Lantinga <slouken@libsdl.org>
1990 RSA Data Security, Inc. 1990 RSA Data Security, Inc.
License: zlib/libpng and RSA_Data_Security License: zlib/libpng and RSA_Data_Security
@ -46,12 +46,12 @@ Copyright: 1994-2003 The XFree86 Project, Inc.
License: MIT/X11 License: MIT/X11
Files: test/testhaptic.c Files: test/testhaptic.c
Copyright: 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright: 1997-2021 Sam Lantinga <slouken@libsdl.org>
2008 Edgar Simo Serra 2008 Edgar Simo Serra
License: BSD_3_clause License: BSD_3_clause
Files: test/testrumble.c Files: test/testrumble.c
Copyright: 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright: 1997-2021 Sam Lantinga <slouken@libsdl.org>
2011 Edgar Simo Serra 2011 Edgar Simo Serra
License: BSD_3_clause License: BSD_3_clause
@ -169,7 +169,7 @@ License: BSD_3_clause
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Comment: Comment:
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
. .
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages

View file

@ -1,4 +1,4 @@
BUGS.txt BUGS.txt
CREDITS.txt CREDITS.txt
README.txt README.md
README-SDL.txt README-SDL.txt

View file

@ -0,0 +1 @@
usr/lib/*/libSDL2-2.0.so.0*

1
externals/SDL/debian/libsdl2-2.0-0.install vendored Executable file
View file

@ -0,0 +1 @@
usr/lib/*/libSDL2-2.0.so.0*

View file

@ -10,7 +10,6 @@ If you are using the older ant build process, it is no longer officially
supported, but you can use the "android-project-ant" directory as a template. supported, but you can use the "android-project-ant" directory as a template.
================================================================================
Requirements Requirements
================================================================================ ================================================================================
@ -23,7 +22,6 @@ https://developer.android.com/tools/sdk/ndk/index.html
Minimum API level supported by SDL: 16 (Android 4.1) Minimum API level supported by SDL: 16 (Android 4.1)
================================================================================
How the port works How the port works
================================================================================ ================================================================================
@ -42,7 +40,6 @@ dispatches to native functions implemented in the SDL library:
src/core/android/SDL_android.c src/core/android/SDL_android.c
================================================================================
Building an app Building an app
================================================================================ ================================================================================
@ -120,7 +117,6 @@ Here's an explanation of the files in the Android project, so you can customize
src/main/java/org/libsdl/app/SDLActivity.java - the Java class handling the initialization and binding to SDL. Be very careful changing this, as the SDL library relies on this implementation. You should instead subclass this for your application. src/main/java/org/libsdl/app/SDLActivity.java - the Java class handling the initialization and binding to SDL. Be very careful changing this, as the SDL library relies on this implementation. You should instead subclass this for your application.
================================================================================
Customizing your application name Customizing your application name
================================================================================ ================================================================================
@ -151,7 +147,6 @@ Then replace "SDLActivity" in AndroidManifest.xml with the name of your
class, .e.g. "MyGame" class, .e.g. "MyGame"
================================================================================
Customizing your application icon Customizing your application icon
================================================================================ ================================================================================
@ -160,7 +155,6 @@ the drawable directories under the res directory. There are several directories
for different screen sizes. for different screen sizes.
================================================================================
Loading assets Loading assets
================================================================================ ================================================================================
@ -189,7 +183,6 @@ disable this behaviour, see for example:
http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/ http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/
================================================================================
Pause / Resume behaviour Pause / Resume behaviour
================================================================================ ================================================================================
@ -205,12 +198,36 @@ app can continue to operate as it was.
However, there's a chance (on older hardware, or on systems under heavy load), However, there's a chance (on older hardware, or on systems under heavy load),
where the GL context can not be restored. In that case you have to listen for where the GL context can not be restored. In that case you have to listen for
a specific message, (which is not yet implemented!) and restore your textures a specific message (SDL_RENDER_DEVICE_RESET) and restore your textures
manually or quit the app (which is actually the kind of behaviour you'll see manually or quit the app.
under iOS, if the OS can not restore your GL context it will just kill your app)
You should not use the SDL renderer API while the app going in background:
- SDL_APP_WILLENTERBACKGROUND:
after you read this message, GL context gets backed-up and you should not
use the SDL renderer API.
- SDL_APP_DIDENTERFOREGROUND:
GL context is restored, and the SDL renderer API is available (unless you
receive SDL_RENDER_DEVICE_RESET).
Mouse / Touch events
================================================================================ ================================================================================
In some case, SDL generates synthetic mouse (resp. touch) events for touch
(resp. mouse) devices.
To enable/disable this behavior, see SDL_hints.h:
- SDL_HINT_TOUCH_MOUSE_EVENTS
- SDL_HINT_MOUSE_TOUCH_EVENTS
Misc
================================================================================
For some device, it appears to works better setting explicitly GL attributes
before creating a window:
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
Threads and the Java VM Threads and the Java VM
================================================================================ ================================================================================
@ -226,7 +243,6 @@ your thread automatically anyway (when you make an SDL call), but it'll never
detach it. detach it.
================================================================================
Using STL Using STL
================================================================================ ================================================================================
@ -239,7 +255,6 @@ For more information go here:
https://developer.android.com/ndk/guides/cpp-support https://developer.android.com/ndk/guides/cpp-support
================================================================================
Using the emulator Using the emulator
================================================================================ ================================================================================
@ -252,7 +267,6 @@ Notice that this software emulator is incredibly slow and needs a lot of disk sp
Using a real device works better. Using a real device works better.
================================================================================
Troubleshooting Troubleshooting
================================================================================ ================================================================================
@ -332,7 +346,6 @@ If you need to build without optimization turned on, you can create a file calle
APP_OPTIM := debug APP_OPTIM := debug
================================================================================
Memory debugging Memory debugging
================================================================================ ================================================================================
@ -384,7 +397,6 @@ When you're done instrumenting with valgrind, you can disable the wrapper:
adb shell setprop wrap.org.libsdl.app "" adb shell setprop wrap.org.libsdl.app ""
================================================================================
Graphics debugging Graphics debugging
================================================================================ ================================================================================
@ -398,7 +410,6 @@ The Tegra Graphics Debugger is available from NVidia here:
https://developer.nvidia.com/tegra-graphics-debugger https://developer.nvidia.com/tegra-graphics-debugger
================================================================================
Why is API level 16 the minimum required? Why is API level 16 the minimum required?
================================================================================ ================================================================================
@ -408,7 +419,6 @@ about 99% of the Android devices accessing Google Play support API level 16 or
higher (January 2018). higher (January 2018).
================================================================================
A note regarding the use of the "dirty rectangles" rendering technique A note regarding the use of the "dirty rectangles" rendering technique
================================================================================ ================================================================================
@ -427,7 +437,6 @@ screen each frame.
Reference: http://www.khronos.org/registry/egl/specs/EGLTechNote0001.html Reference: http://www.khronos.org/registry/egl/specs/EGLTechNote0001.html
================================================================================
Ending your application Ending your application
================================================================================ ================================================================================
@ -445,7 +454,6 @@ Don't call exit() as it stops the activity badly.
NB: "Back button" can be handled as a SDL_KEYDOWN/UP events, with Keycode NB: "Back button" can be handled as a SDL_KEYDOWN/UP events, with Keycode
SDLK_AC_BACK, for any purpose. SDLK_AC_BACK, for any purpose.
================================================================================
Known issues Known issues
================================================================================ ================================================================================

19
externals/SDL/docs/README-git.md vendored Executable file
View file

@ -0,0 +1,19 @@
git
=========
The latest development version of SDL is available via git.
Git allows you to get up-to-the-minute fixes and enhancements;
as a developer works on a source tree, you can use "git" to mirror that
source tree instead of waiting for an official release. Please look
at the Git website ( https://git-scm.com/ ) for more
information on using git, where you can also download software for
macOS, Windows, and Unix systems.
git clone https://github.com/libsdl-org/SDL
If you are building SDL via configure, you will need to run autogen.sh
before running configure.
There is a web interface to the Git repository at:
http://github.com/libsdl-org/SDL/

View file

@ -1,22 +1,4 @@
Mercurial We are no longer hosted in Mercurial. Please see README-git.md for details.
=========
The latest development version of SDL is available via Mercurial. Thanks!
Mercurial allows you to get up-to-the-minute fixes and enhancements;
as a developer works on a source tree, you can use "hg" to mirror that
source tree instead of waiting for an official release. Please look
at the Mercurial website ( https://www.mercurial-scm.org/ ) for more
information on using hg, where you can also download software for
Mac OS X, Windows, and Unix systems.
hg clone http://hg.libsdl.org/SDL
If you are building SDL via configure, you will need to run autogen.sh
before running configure.
There is a web interface to the subversion repository at:
http://hg.libsdl.org/SDL/
There is an RSS feed available at that URL, for those that want to
track commits in real time.

27
externals/SDL/docs/README-kmsbsd.md vendored Executable file
View file

@ -0,0 +1,27 @@
KMSDRM on *BSD
==================================================
KMSDRM is supported on FreeBSD and OpenBSD. DragonFlyBSD is not tested yet, but should work. NetBSD isn't supported yet because the application will crash when creating the KMSDRM screen.
WSCONS support has been brought back, but only as an input backend. It will not be brought back as a video backend to ease maintenance.
OpenBSD note: Note that the video backend assumes that the user has read/write permissions to the /dev/drm* devices.
SDL2 WSCONS input backend features
===================================================
1. It is keymap-aware; it will work properly with different keymaps.
2. It has mouse support.
3. Accent input is supported.
4. Compose keys are supported.
5. AltGr and Meta Shift keys work as intended.
Partially working or no input on OpenBSD/NetBSD.
==================================================
The WSCONS input backend needs read/write access to the /dev/wskbd* devices, without which it will not work properly. /dev/wsmouse must also be read/write accessible, otherwise mouse input will not work.
Partially working or no input on FreeBSD.
==================================================
The evdev devices are only accessible to the root user by default. Edit devfs rules to allow access to such devices. The /dev/kbd* devices are also only accessible to the root user by default. Edit devfs rules to allow access to such devices.

View file

@ -9,18 +9,18 @@ at runtime, and you won't get a missing library error, at least with the
default configuration parameters. default configuration parameters.
================================================================================
Build Dependencies Build Dependencies
================================================================================ --------------------------------------------------------------------------------
Ubuntu 20.04, all available features enabled: Ubuntu 20.04, all available features enabled:
sudo apt-get install build-essential mercurial make cmake autoconf automake \ sudo apt-get install build-essential git make cmake autoconf automake \
libtool libasound2-dev libpulse-dev libaudio-dev libx11-dev libxext-dev \ libtool pkg-config libasound2-dev libpulse-dev libaudio-dev libjack-dev \
libxrandr-dev libxcursor-dev libxi-dev libxinerama-dev libxxf86vm-dev \ libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev \
libxss-dev libgl1-mesa-dev libdbus-1-dev libudev-dev libgles2-mesa-dev \ libxinerama-dev libxxf86vm-dev libxss-dev libgl1-mesa-dev libdbus-1-dev \
libegl1-mesa-dev libibus-1.0-dev fcitx-libs-dev libsamplerate0-dev \ libudev-dev libgles2-mesa-dev libegl1-mesa-dev libibus-1.0-dev \
libsndio-dev libwayland-dev libxkbcommon-dev fcitx-libs-dev libsamplerate0-dev libsndio-dev libwayland-dev \
libxkbcommon-dev libdrm-dev libgbm-dev
NOTES: NOTES:
- This includes all the audio targets except arts and esd, because Ubuntu - This includes all the audio targets except arts and esd, because Ubuntu
@ -34,9 +34,8 @@ NOTES:
configure script to include DirectFB support. Send patches. :) configure script to include DirectFB support. Send patches. :)
================================================================================
Joystick does not work Joystick does not work
================================================================================ --------------------------------------------------------------------------------
If you compiled or are using a version of SDL with udev support (and you should!) If you compiled or are using a version of SDL with udev support (and you should!)
there's a few issues that may cause SDL to fail to detect your joystick. To there's a few issues that may cause SDL to fail to detect your joystick. To

114
externals/SDL/docs/README-visualc.md vendored Executable file
View file

@ -0,0 +1,114 @@
Using SDL with Microsoft Visual C++
===================================
### by [Lion Kimbro](mailto:snowlion@sprynet.com) with additions by [James Turk](mailto:james@conceptofzero.net)
You can either use the precompiled libraries from the [SDL](https://www.libsdl.org/download.php) web site, or you can build SDL
yourself.
### Building SDL
0. To build SDL, your machine must, at a minimum, have the DirectX9.0c SDK installed. It may or may not be retrievable from
the [Microsoft](https://www.microsoft.com) website, so you might need to locate it [online](https://duckduckgo.com/?q=directx9.0c+sdk+download&t=h_&ia=web).
_Editor's note: I've been able to successfully build SDL using Visual Studio 2019 **without** the DX9.0c SDK_
1. Open the Visual Studio solution file at `./VisualC/SDL.sln`.
2. Your IDE will likely prompt you to upgrade this solution file to whatever later version of the IDE you're using. In the `Retarget Projects` dialog,
all of the affected project files should be checked allowing you to use the latest `Windows SDK Version` you have installed, along with
the `Platform Toolset`.
If you choose *NOT* to upgrade to use the latest `Windows SDK Version` or `Platform Toolset`, then you'll need the `Visual Studio 2010 Platform Toolset`.
3. Build the `.dll` and `.lib` files by right clicking on each project in turn (Projects are listed in the _Workspace_
panel in the _FileView_ tab), and selecting `Build`.
You may get a few warnings, but you should not get any errors.
Later, we will refer to the following `.lib` and `.dll` files that have just been generated:
- `./VisualC/Win32/Debug/SDL2.dll` or `./VisualC/Win32/Release/SDL2.dll`
- `./VisualC/Win32/Debug/SDL2.lib` or `./VisualC/Win32/Release/SDL2.lib`
- `./VisualC/Win32/Debug/SDL2main.lib` or `./VisualC/Win32/Release/SDL2main.lib`
_Note for the `x64` versions, just replace `Win32` in the path with `x64`_
### Creating a Project with SDL
- Create a project as a `Win32 Application`.
- Create a C++ file for your project.
- Set the C runtime to `Multi-threaded DLL` in the menu:
`Project|Settings|C/C++ tab|Code Generation|Runtime Library `.
- Add the SDL `include` directory to your list of includes in the menu:
`Project|Settings|C/C++ tab|Preprocessor|Additional include directories `
*VC7 Specific: Instead of doing this, I find it easier to add the
include and library directories to the list that VC7 keeps. Do this by
selecting Tools|Options|Projects|VC++ Directories and under the "Show
Directories For:" dropbox select "Include Files", and click the "New
Directory Icon" and add the [SDLROOT]\\include directory (e.g. If you
installed to c:\\SDL\\ add c:\\SDL\\include). Proceed to change the
dropbox selection to "Library Files" and add [SDLROOT]\\lib.*
The "include directory" I am referring to is the `./include` folder.
Now we're going to use the files that we had created earlier in the *Build SDL* step.
Copy the following file into your Project directory:
- `SDL2.dll`
Add the following files to your project (It is not necessary to copy them to your project directory):
- `SDL2.lib`
- `SDL2main.lib`
To add them to your project, right click on your project, and select
`Add files to project`.
**Instead of adding the files to your project, it is more desirable to add them to the linker options: Project|Properties|Linker|Command Line
and type the names of the libraries to link with in the "Additional Options:" box. Note: This must be done for each build configuration
(e.g. Release,Debug).**
### Hello SDL2
Here's a sample SDL snippet to verify everything is setup in your IDE:
```
#include "SDL.h"
int main( int argc, char* argv[] )
{
const int WIDTH = 640;
const int HEIGHT = 480;
SDL_Window* window = NULL;
SDL_Renderer* renderer = NULL;
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("SDL2 Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
```
### That's it!
I hope that this document has helped you get through the most difficult part of using the SDL: installing it.
Suggestions for improvements should be posted to the [Github Issues](https://github.com/libsdl-org/SDL/issues).
### Credits
Thanks to [Paulus Esterhazy](mailto:pesterhazy@gmx.net), for the work on VC++ port.
This document was originally called "VisualC.txt", and was written by [Sam Lantinga](mailto:slouken@libsdl.org).
Later, it was converted to HTML and expanded into the document that you see today by [Lion Kimbro](mailto:snowlion@sprynet.com).
Minor Fixes and Visual C++ 7 Information (In Green) was added by [James Turk](mailto:james@conceptofzero.net)

27
externals/SDL/docs/README-vita.md vendored Executable file
View file

@ -0,0 +1,27 @@
PS Vita
=======
SDL port for the Sony Playstation Vita ans Sony Playstation TV
Credit to
* xerpi and rsn8887 for initial (vita2d) port
* vitasdk/dolcesdk devs
* CBPS discord (Namely Graphene and SonicMastr)
Building
--------
To build for the PSP, make sure you have vitasdk and cmake installed and run:
```
cmake -S. -Bbuild -DCMAKE_TOOLCHAIN_FILE=${VITASDK}/share/vita.toolchain.cmake -DCMAKE_BUILD_TYPE=Release
cmake --build build
cmake --install build
```
Notes
-----
* There are two renderers: native gxm and pigs-in-a-blanket gles2.
By default gxm one is used. gles2 renderer is slow and only usable if you want to bind SDL_Texture to GL context.
You can create gles2 renderer by using hint or `1` as a renderer index in `SDL_CreateRenderer`.
* By default SDL emits mouse events for touch events on every touchscreen.
Vita has two touchscreens, so it's recommended to use `SDL_SetHint(SDL_HINT_TOUCH_MOUSE_EVENTS, "0");` and handle touch events instead.
* Support for L2/R2/R3/R3 buttons, haptic feedback and gamepad led only available on PSTV, or when using external ds4 gamepad on vita.

View file

@ -21,7 +21,7 @@ SDL is written in C, works natively with C++, and there are bindings
available for several other languages, including C# and Python. available for several other languages, including C# and Python.
This library is distributed under the zlib license, which can be found This library is distributed under the zlib license, which can be found
in the file "COPYING.txt". in the file "LICENSE.txt".
The best way to learn how to use SDL is to check out the header files in The best way to learn how to use SDL is to check out the header files in
the "include" subdirectory and the programs in the "test" subdirectory. the "include" subdirectory and the programs in the "test" subdirectory.
@ -35,7 +35,7 @@ More documentation and FAQs are available online at [the wiki](http://wiki.libsd
- [DynAPI](README-dynapi.md) - [DynAPI](README-dynapi.md)
- [Emscripten](README-emscripten.md) - [Emscripten](README-emscripten.md)
- [Gesture](README-gesture.md) - [Gesture](README-gesture.md)
- [Mercurial](README-hg.md) - [Git](README-git.md)
- [iOS](README-ios.md) - [iOS](README-ios.md)
- [Linux](README-linux.md) - [Linux](README-linux.md)
- [OS X](README-macosx.md) - [OS X](README-macosx.md)
@ -49,12 +49,14 @@ More documentation and FAQs are available online at [the wiki](http://wiki.libsd
- [WinCE](README-wince.md) - [WinCE](README-wince.md)
- [Windows](README-windows.md) - [Windows](README-windows.md)
- [WinRT](README-winrt.md) - [WinRT](README-winrt.md)
- [PSVita](README-vita.md)
If you need help with the library, or just want to discuss SDL related If you need help with the library, or just want to discuss SDL related
issues, you can join the [developers mailing list](http://www.libsdl.org/mailing-list.php) issues, you can join the [SDL Discourse](https://discourse.libsdl.org/),
which can be used as a web forum or a mailing list, at your preference.
If you want to report bugs or contribute patches, please submit them to If you want to report bugs or contribute patches, please submit them to
[bugzilla](https://bugzilla.libsdl.org/) [our bug tracker](https://github.com/libsdl-org/SDL/issues)
Enjoy! Enjoy!

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -93,37 +93,121 @@ extern "C" {
/* @} */ /* @} */
/** /**
* This function initializes the subsystems specified by \c flags * 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_RWFromFile) 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
* - `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_GAMECONTROLLER`: controller subsystem; automatically
* initializes the joystick subsystem
* - `SDL_INIT_EVENTS`: events subsystem
* - `SDL_INIT_EVERYTHING`: all of the above subsystems
* - `SDL_INIT_NOPARACHUTE`: compatibility; this flag is ignored
*
* 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.
*
* \param flags subsystem initialization flags
* \returns 0 on success or a negative error code on failure; call
* SDL_GetError() for more information.
*
* \sa SDL_InitSubSystem
* \sa SDL_Quit
* \sa SDL_SetMainReady
* \sa SDL_WasInit
*/ */
extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags); extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags);
/** /**
* This function initializes specific SDL subsystems * Compatibility function to initialize the SDL library.
* *
* Subsystem initialization is ref-counted, you must call * In SDL2, this function and SDL_Init() are interchangeable.
* SDL_QuitSubSystem() for each SDL_InitSubSystem() to correctly *
* shutdown a subsystem manually (or call SDL_Quit() to force shutdown). * \param flags any of the flags used by SDL_Init(); see SDL_Init for details.
* If a subsystem is already loaded then this call will * \returns 0 on success or a negative error code on failure; call
* increase the ref-count and return. * SDL_GetError() for more information.
*
* \sa SDL_Init
* \sa SDL_Quit
* \sa SDL_QuitSubSystem
*/ */
extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags); extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags);
/** /**
* This function cleans up specific SDL subsystems * Shut down specific SDL subsystems.
*
* If you start a subsystem using a call to that subsystem's init function
* (for example SDL_VideoInit()) instead of SDL_Init() or SDL_InitSubSystem(),
* SDL_QuitSubSystem() and SDL_WasInit() will not work. You will need to use
* that subsystem's quit function (SDL_VideoQuit()) directly instead. But
* generally, you should not be using those functions directly anyhow; use
* SDL_Init() instead.
*
* 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.
*
* \sa SDL_InitSubSystem
* \sa SDL_Quit
*/ */
extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags); extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags);
/** /**
* This function returns a mask of the specified subsystems which have * Get a mask of the specified subsystems which are currently initialized.
* previously been initialized.
* *
* If \c flags is 0, it returns a mask of all initialized subsystems. * \param flags any of the flags used by SDL_Init(); see SDL_Init for details.
* \returns If `flags` is 0 it returns a mask of all initialized subsystems,
* otherwise it returns the initialization status of the specified
* subsystems.
*
* The return value does not include SDL_INIT_NOPARACHUTE.
*
* \sa SDL_Init
* \sa SDL_InitSubSystem
*/ */
extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags); extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags);
/** /**
* This function cleans up all initialized subsystems. You should * Clean up all initialized subsystems.
* call it upon all exit conditions. *
* 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.
*
* If you start a subsystem using a call to that subsystem's init function
* (for example SDL_VideoInit()) instead of SDL_Init() or SDL_InitSubSystem(),
* then you must use that subsystem's quit function (SDL_VideoQuit()) to shut
* it down before calling SDL_Quit(). But generally, you should not be using
* those functions directly anyhow; use SDL_Init() instead.
*
* 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.
*
* \sa SDL_Init
* \sa SDL_QuitSubSystem
*/ */
extern DECLSPEC void SDLCALL SDL_Quit(void); extern DECLSPEC void SDLCALL SDL_Quit(void);

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -53,8 +53,10 @@ assert can have unique static variables associated with it.
#define SDL_TriggerBreakpoint() __debugbreak() #define SDL_TriggerBreakpoint() __debugbreak()
#elif ( (!defined(__NACL__)) && ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))) ) #elif ( (!defined(__NACL__)) && ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))) )
#define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" ) #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" )
#elif ( defined(__APPLE__) && defined(__arm64__) ) /* this might work on other ARM targets, but this is a known quantity... */ #elif ( defined(__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" ) #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "brk #22\n\t" )
#elif defined(__APPLE__) && defined(__arm__)
#define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "bkpt #22\n\t" )
#elif defined(__386__) && defined(__WATCOMC__) #elif defined(__386__) && defined(__WATCOMC__)
#define SDL_TriggerBreakpoint() { _asm { int 0x03 } } #define SDL_TriggerBreakpoint() { _asm { int 0x03 } }
#elif defined(HAVE_SIGNAL_H) && !defined(__WATCOMC__) #elif defined(HAVE_SIGNAL_H) && !defined(__WATCOMC__)
@ -187,71 +189,89 @@ extern DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *,
#define SDL_assert_always(condition) SDL_enabled_assert(condition) #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.
*/
typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)( typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)(
const SDL_AssertData* data, void* userdata); const SDL_AssertData* data, void* userdata);
/** /**
* \brief Set an application-defined assertion handler. * Set an application-defined assertion handler.
* *
* This allows an app to show its own assertion UI and/or force the * This function allows an application to show its own assertion UI and/or
* response to an assertion failure. If the app doesn't provide this, SDL * force the response to an assertion failure. If the application doesn't
* will try to do the right thing, popping up a system-specific GUI dialog, * provide this, SDL will try to do the right thing, popping up a
* and probably minimizing any fullscreen windows. * 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 * 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. * it will only fire from one thread at a time.
* *
* Setting the callback to NULL restores SDL's original internal handler.
*
* This callback is NOT reset to SDL's internal handler upon SDL_Quit()! * This callback is NOT reset to SDL's internal handler upon SDL_Quit()!
* *
* Return SDL_AssertState value of how to handle the assertion failure. * \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`
* *
* \param handler Callback function, called when an assertion fails. * \sa SDL_GetAssertionHandler
* \param userdata A pointer passed to the callback as-is.
*/ */
extern DECLSPEC void SDLCALL SDL_SetAssertionHandler( extern DECLSPEC void SDLCALL SDL_SetAssertionHandler(
SDL_AssertionHandler handler, SDL_AssertionHandler handler,
void *userdata); void *userdata);
/** /**
* \brief Get the default assertion handler. * Get the default assertion handler.
* *
* This returns the function pointer that is called by default when an * This returns the function pointer that is called by default when an
* assertion is triggered. This is an internal function provided by SDL, * assertion is triggered. This is an internal function provided by SDL, that
* that is used for assertions when SDL_SetAssertionHandler() hasn't been * is used for assertions when SDL_SetAssertionHandler() hasn't been used to
* used to provide a different function. * provide a different function.
* *
* \return The default SDL_AssertionHandler that is called when an assert triggers. * \returns the default SDL_AssertionHandler that is called when an assert
* triggers.
*
* \since This function is available since SDL 2.0.2.
*
* \sa SDL_GetAssertionHandler
*/ */
extern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetDefaultAssertionHandler(void); extern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetDefaultAssertionHandler(void);
/** /**
* \brief Get the current assertion handler. * Get the current assertion handler.
* *
* This returns the function pointer that is called when an assertion is * This returns the function pointer that is called when an assertion is
* triggered. This is either the value last passed to * triggered. This is either the value last passed to
* SDL_SetAssertionHandler(), or if no application-specified function is * SDL_SetAssertionHandler(), or if no application-specified function is set,
* set, is equivalent to calling SDL_GetDefaultAssertionHandler(). * is equivalent to calling SDL_GetDefaultAssertionHandler().
* *
* \param puserdata Pointer to a void*, which will store the "userdata" * The parameter `puserdata` is a pointer to a void*, which will store the
* pointer that was passed to SDL_SetAssertionHandler(). * "userdata" pointer that was passed to SDL_SetAssertionHandler(). This value
* This value will always be NULL for the default handler. * will always be NULL for the default handler. If you don't care about this
* If you don't care about this data, it is safe to pass * data, it is safe to pass a NULL pointer to this function to ignore it.
* a NULL pointer to this function to ignore it. *
* \return The SDL_AssertionHandler that is called when an assert triggers. * \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 2.0.2.
*
* \sa SDL_SetAssertionHandler
*/ */
extern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void **puserdata); extern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void **puserdata);
/** /**
* \brief Get a list of all assertion failures. * Get a list of all assertion failures.
* *
* Get all assertions triggered since last call to SDL_ResetAssertionReport(), * This function gets all assertions triggered since the last call to
* or the start of the program. * SDL_ResetAssertionReport(), or the start of the program.
* *
* The proper way to examine this data looks something like this: * The proper way to examine this data looks something like this:
* *
* <code> * ```c
* const SDL_AssertData *item = SDL_GetAssertionReport(); * const SDL_AssertData *item = SDL_GetAssertionReport();
* while (item) { * while (item) {
* printf("'%s', %s (%s:%d), triggered %u times, always ignore: %s.\\n", * printf("'%s', %s (%s:%d), triggered %u times, always ignore: %s.\\n",
@ -260,17 +280,22 @@ extern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void **puse
* item->always_ignore ? "yes" : "no"); * item->always_ignore ? "yes" : "no");
* item = item->next; * item = item->next;
* } * }
* </code> * ```
*
* \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.
* *
* \return List of all assertions.
* \sa SDL_ResetAssertionReport * \sa SDL_ResetAssertionReport
*/ */
extern DECLSPEC const SDL_AssertData * SDLCALL SDL_GetAssertionReport(void); extern DECLSPEC const SDL_AssertData * SDLCALL SDL_GetAssertionReport(void);
/** /**
* \brief Reset the list of all assertion failures. * Clear the list of all assertion failures.
* *
* Reset list of all assertions triggered. * 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.
* *
* \sa SDL_GetAssertionReport * \sa SDL_GetAssertionReport
*/ */

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -89,25 +89,47 @@ extern "C" {
typedef int SDL_SpinLock; typedef int SDL_SpinLock;
/** /**
* \brief Try to lock a spin lock by setting it to a non-zero value. * Try to lock a spin lock by setting it to a non-zero value.
* *
* \param lock Points to the lock. * ***Please note that spinlocks are dangerous if you don't know what you're
* doing. Please be careful using any sort of spinlock!***
* *
* \return SDL_TRUE if the lock succeeded, SDL_FALSE if the lock is already held. * \param lock a pointer to a lock variable
* \returns SDL_TRUE if the lock succeeded, SDL_FALSE if the lock is already
* held.
*
* \sa SDL_AtomicLock
* \sa SDL_AtomicUnlock
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_AtomicTryLock(SDL_SpinLock *lock); extern DECLSPEC SDL_bool SDLCALL SDL_AtomicTryLock(SDL_SpinLock *lock);
/** /**
* \brief Lock a spin lock by setting it to a non-zero value. * Lock a spin lock by setting it to a non-zero value.
* *
* \param lock Points to the lock. * ***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
*
* \sa SDL_AtomicTryLock
* \sa SDL_AtomicUnlock
*/ */
extern DECLSPEC void SDLCALL SDL_AtomicLock(SDL_SpinLock *lock); extern DECLSPEC void SDLCALL SDL_AtomicLock(SDL_SpinLock *lock);
/** /**
* \brief Unlock a spin lock by setting it to 0. Always returns immediately * Unlock a spin lock by setting it to 0.
* *
* \param lock Points to the lock. * 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 2.0.0.
*
* \sa SDL_AtomicLock
* \sa SDL_AtomicTryLock
*/ */
extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock); extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock);
@ -216,32 +238,68 @@ typedef void (*SDL_KernelMemoryBarrierFunc)();
typedef struct { int value; } SDL_atomic_t; typedef struct { int value; } SDL_atomic_t;
/** /**
* \brief Set an atomic variable to a new value if it is currently an old value. * Set an atomic variable to a new value if it is
* currently an old value.
* *
* \return SDL_TRUE if the atomic variable was set, SDL_FALSE otherwise. * ***Note: If you don't know what this function is for, you shouldn't use
* it!***
* *
* \note If you don't know what this function is for, you shouldn't use it! * \param a a pointer to an SDL_atomic_t 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.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_AtomicCASPtr
* \sa SDL_AtomicGet
* \sa SDL_AtomicSet
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCAS(SDL_atomic_t *a, int oldval, int newval); extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCAS(SDL_atomic_t *a, int oldval, int newval);
/** /**
* \brief Set an atomic variable to a value. * Set an atomic variable to a value.
* *
* \return The previous value of the 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_atomic_t variable to be modified
* \param v the desired value
* \returns the previous value of the atomic variable.
*
* \sa SDL_AtomicGet
*/ */
extern DECLSPEC int SDLCALL SDL_AtomicSet(SDL_atomic_t *a, int v); extern DECLSPEC int SDLCALL SDL_AtomicSet(SDL_atomic_t *a, int v);
/** /**
* \brief Get the value of an atomic variable * 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_atomic_t variable
* \returns the current value of an atomic variable.
*
* \sa SDL_AtomicSet
*/ */
extern DECLSPEC int SDLCALL SDL_AtomicGet(SDL_atomic_t *a); extern DECLSPEC int SDLCALL SDL_AtomicGet(SDL_atomic_t *a);
/** /**
* \brief Add to an atomic variable. * Add to an atomic variable.
* *
* \return The previous value of the atomic variable. * This function also acts as a full memory barrier.
* *
* \note This same style can be used for any number operation * ***Note: If you don't know what this function is for, you shouldn't use
* it!***
*
* \param a a pointer to an SDL_atomic_t variable to be modified
* \param v the desired value to add
* \returns the previous value of the atomic variable.
*
* \sa SDL_AtomicDecRef
* \sa SDL_AtomicIncRef
*/ */
extern DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_atomic_t *a, int v); extern DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_atomic_t *a, int v);
@ -263,23 +321,51 @@ extern DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_atomic_t *a, int v);
#endif #endif
/** /**
* \brief Set a pointer to a new value if it is currently an old value. * Set a pointer to a new value if it is currently an old
* value.
* *
* \return SDL_TRUE if the pointer was set, SDL_FALSE otherwise. * ***Note: If you don't know what this function is for, you shouldn't use
* it!***
* *
* \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.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_AtomicCAS
* \sa SDL_AtomicGetPtr
* \sa SDL_AtomicSetPtr
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCASPtr(void **a, void *oldval, void *newval); extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCASPtr(void **a, void *oldval, void *newval);
/** /**
* \brief Set a pointer to a value atomically. * Set a pointer to a value atomically.
* *
* \return The previous value of the pointer. * ***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.
*
* \sa SDL_AtomicCASPtr
* \sa SDL_AtomicGetPtr
*/ */
extern DECLSPEC void* SDLCALL SDL_AtomicSetPtr(void **a, void* v); extern DECLSPEC void* SDLCALL SDL_AtomicSetPtr(void **a, void* v);
/** /**
* \brief Get the value of a pointer atomically. * 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.
*
* \sa SDL_AtomicCASPtr
* \sa SDL_AtomicSetPtr
*/ */
extern DECLSPEC void* SDLCALL SDL_AtomicGetPtr(void **a); extern DECLSPEC void* SDLCALL SDL_AtomicGetPtr(void **a);

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -19,6 +19,8 @@
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
/* !!! FIXME: several functions in here need Doxygen comments. */
/** /**
* \file SDL_audio.h * \file SDL_audio.h
* *
@ -265,55 +267,68 @@ extern DECLSPEC void SDLCALL SDL_AudioQuit(void);
/* @} */ /* @} */
/** /**
* This function returns the name of the current audio driver, or NULL * Get the name of the current audio driver.
* if no driver has been initialized. *
* The returned string points to internal static memory and thus never becomes
* invalid, even if you quit the audio subsystem and initialize a new driver
* (although such a case would return a different static string from another
* call to this function, of course). As such, you should not modify or free
* the returned string.
*
* \returns the name of the current audio driver or NULL if no driver has been
* initialized.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_AudioInit
*/ */
extern DECLSPEC const char *SDLCALL SDL_GetCurrentAudioDriver(void); extern DECLSPEC const char *SDLCALL SDL_GetCurrentAudioDriver(void);
/** /**
* This function opens the audio device with the desired parameters, and * This function is a legacy means of opening the audio device.
* returns 0 if successful, placing the actual hardware parameters in the
* structure pointed to by \c obtained. If \c obtained is NULL, the audio
* data passed to the callback function will be guaranteed to be in the
* requested format, and will be automatically converted to the hardware
* audio format if necessary. This function returns -1 if it failed
* to open the audio device, or couldn't set up the audio thread.
* *
* When filling in the desired audio spec structure, * This function remains for compatibility with SDL 1.2, but also because it's
* - \c desired->freq should be the desired audio frequency in samples-per- * slightly easier to use than the new functions in SDL 2.0. The new, more
* second. * powerful, and preferred way to do this is SDL_OpenAudioDevice().
* - \c desired->format should be the desired audio format.
* - \c desired->samples is the desired size of the audio buffer, in
* samples. This number should be a power of two, and may be adjusted by
* the audio driver to a value more suitable for the hardware. Good values
* seem to range between 512 and 8096 inclusive, depending on the
* application and CPU speed. Smaller values yield faster response time,
* but can lead to underflow if the application is doing heavy processing
* and cannot fill the audio buffer in time. A stereo sample consists of
* both right and left channels in LR ordering.
* Note that the number of samples is directly related to time by the
* following formula: \code ms = (samples*1000)/freq \endcode
* - \c desired->size is the size in bytes of the audio buffer, and is
* calculated by SDL_OpenAudio().
* - \c desired->silence is the value used to set the buffer to silence,
* and is calculated by SDL_OpenAudio().
* - \c desired->callback should be set to a function that will be called
* when the audio device is ready for more data. It is passed a pointer
* to the audio buffer, and the length in bytes of the audio buffer.
* This function usually runs in a separate thread, and so you should
* protect data structures that it accesses by calling SDL_LockAudio()
* and SDL_UnlockAudio() in your code. Alternately, you may pass a NULL
* pointer here, and call SDL_QueueAudio() with some frequency, to queue
* more audio samples to be played (or for capture devices, call
* SDL_DequeueAudio() with some frequency, to obtain audio samples).
* - \c desired->userdata is passed as the first parameter to your callback
* function. If you passed a NULL callback, this value is ignored.
* *
* The audio device starts out playing silence when it's opened, and should * This function is roughly equivalent to:
* be enabled for playing by calling \c SDL_PauseAudio(0) when you are ready *
* for your audio callback function to be called. Since the audio driver * ```c++
* may modify the requested size of the audio buffer, you should allocate * SDL_OpenAudioDevice(NULL, 0, desired, obtained, SDL_AUDIO_ALLOW_ANY_CHANGE);
* any local mixing buffers after you open the audio device. * ```
*
* With two notable exceptions:
*
* - If `obtained` is NULL, we use `desired` (and allow no changes), which
* means desired will be modified to have the correct values for silence,
* etc, and SDL will convert any differences between your app's specific
* request and the hardware behind the scenes.
* - The return value is always success or failure, and not a device ID, which
* means you can only have one device open at a time with this function.
*
* \param desired an SDL_AudioSpec structure representing the desired output
* format. Please refer to the SDL_OpenAudioDevice documentation
* for details on how to prepare this structure.
* \param obtained an SDL_AudioSpec structure filled in with the actual
* parameters, or NULL.
* \returns This function opens the audio device with the desired parameters,
* and returns 0 if successful, placing the actual hardware
* parameters in the structure pointed to by `obtained`.
*
* If `obtained` is NULL, the audio data passed to the callback
* function will be guaranteed to be in the requested format, and
* will be automatically converted to the actual hardware audio
* format if necessary. If `obtained` is NULL, `desired` will
* have fields modified.
*
* This function returns a negative error code on failure to open the
* audio device or failure to set up the audio thread; call
* SDL_GetError() for more information.
*
* \sa SDL_CloseAudio
* \sa SDL_LockAudio
* \sa SDL_PauseAudio
* \sa SDL_UnlockAudio
*/ */
extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired, extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired,
SDL_AudioSpec * obtained); SDL_AudioSpec * obtained);
@ -330,59 +345,215 @@ extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired,
typedef Uint32 SDL_AudioDeviceID; typedef Uint32 SDL_AudioDeviceID;
/** /**
* Get the number of available devices exposed by the current driver. * Get the number of built-in audio devices.
* Only valid after a successfully initializing the audio subsystem. *
* Returns -1 if an explicit list of devices can't be determined; this is * This function is only valid after successfully initializing the audio
* not an error. For example, if SDL is set up to talk to a remote audio * subsystem.
* server, it can't list every one available on the Internet, but it will *
* still allow a specific host to be specified to SDL_OpenAudioDevice(). * Note that audio capture support is not implemented as of SDL 2.0.4, so the
* `iscapture` parameter is for future expansion and should always be zero
* for now.
*
* This function will return -1 if an explicit list of devices can't be
* determined. Returning -1 is not an error. For example, if SDL is set up to
* talk to a remote audio server, it can't list every one available on the
* Internet, but it will still allow a specific host to be specified in
* SDL_OpenAudioDevice().
* *
* In many common cases, when this function returns a value <= 0, it can still * In many common cases, when this function returns a value <= 0, it can still
* successfully open the default device (NULL for first argument of * successfully open the default device (NULL for first argument of
* SDL_OpenAudioDevice()). * SDL_OpenAudioDevice()).
*
* This function may trigger a complete redetect of available hardware. It
* should not be called for each iteration of a loop, but rather once at the
* start of a loop:
*
* ```c++
* // Don't do this:
* for (int i = 0; i < SDL_GetNumAudioDevices(0); i++)
*
* // do this instead:
* const int count = SDL_GetNumAudioDevices(0);
* for (int i = 0; i < count; ++i) { do_something_here(); }
* ```
*
* \param iscapture zero to request playback devices, non-zero to request
* recording devices
* \returns the number of available devices exposed by the current driver or
* -1 if an explicit list of devices can't be determined. A return
* value of -1 does not necessarily mean an error condition.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_GetAudioDeviceName
* \sa SDL_OpenAudioDevice
*/ */
extern DECLSPEC int SDLCALL SDL_GetNumAudioDevices(int iscapture); extern DECLSPEC int SDLCALL SDL_GetNumAudioDevices(int iscapture);
/** /**
* Get the human-readable name of a specific audio device. * Get the human-readable name of a specific audio device.
* Must be a value between 0 and (number of audio devices-1). *
* Only valid after a successfully initializing the audio subsystem. * This function is only valid after successfully initializing the audio
* The values returned by this function reflect the latest call to * subsystem. The values returned by this function reflect the latest call to
* SDL_GetNumAudioDevices(); recall that function to redetect available * SDL_GetNumAudioDevices(); re-call that function to redetect available
* hardware. * hardware.
* *
* The string returned by this function is UTF-8 encoded, read-only, and * The string returned by this function is UTF-8 encoded, read-only, and
* managed internally. You are not to free it. If you need to keep the * managed internally. You are not to free it. If you need to keep the string
* string for any length of time, you should make your own copy of it, as it * for any length of time, you should make your own copy of it, as it will be
* will be invalid next time any of several other SDL functions is called. * invalid next time any of several other SDL functions are called.
*
* \param index the index of the audio device; valid values range from 0 to
* SDL_GetNumAudioDevices() - 1
* \param iscapture non-zero to query the list of recording devices, zero to
* query the list of output devices.
* \returns the name of the audio device at the requested index, or NULL on
* error.
*
* \sa SDL_GetNumAudioDevices
*/ */
extern DECLSPEC const char *SDLCALL SDL_GetAudioDeviceName(int index, extern DECLSPEC const char *SDLCALL SDL_GetAudioDeviceName(int index,
int iscapture); int iscapture);
/**
* Get the preferred audio format of a specific audio device.
*
* This function is only valid after a successfully initializing the audio
* subsystem. The values returned by this function reflect the latest call to
* SDL_GetNumAudioDevices(); re-call that function to redetect available
* hardware.
*
* `spec` will be filled with the sample rate, sample format, and channel
* count. All other values in the structure are filled with 0. When the
* supported struct members are 0, SDL was unable to get the property from the
* backend.
*
* \param index the index of the audio device; valid values range from 0 to
* SDL_GetNumAudioDevices() - 1
* \param iscapture non-zero to query the list of recording devices, zero to
* query the list of output devices.
* \param spec The SDL_AudioSpec to be initialized by this function.
* \returns 0 on success, nonzero on error
*
* \sa SDL_GetNumAudioDevices
*/
extern DECLSPEC int SDLCALL SDL_GetAudioDeviceSpec(int index,
int iscapture,
SDL_AudioSpec *spec);
/** /**
* Open a specific audio device. Passing in a device name of NULL requests * Open a specific audio device.
* the most reasonable default (and is equivalent to calling SDL_OpenAudio()).
* *
* The device name is a UTF-8 string reported by SDL_GetAudioDeviceName(), but * SDL_OpenAudio(), unlike this function, always acts on device ID 1. As such,
* this function will never return a 1 so as not to conflict with the legacy
* function.
*
* Please note that SDL 2.0 before 2.0.5 did not support recording; as such,
* this function would fail if `iscapture` was not zero. Starting with SDL
* 2.0.5, recording is implemented and this value can be non-zero.
*
* Passing in a `device` name of NULL requests the most reasonable default
* (and is equivalent to what SDL_OpenAudio() does to choose a device). The
* `device` name is a UTF-8 string reported by SDL_GetAudioDeviceName(), but
* some drivers allow arbitrary and driver-specific strings, such as a * some drivers allow arbitrary and driver-specific strings, such as a
* hostname/IP address for a remote audio server, or a filename in the * hostname/IP address for a remote audio server, or a filename in the
* diskaudio driver. * diskaudio driver.
* *
* \return 0 on error, a valid device ID that is >= 2 on success. * When filling in the desired audio spec structure:
* *
* SDL_OpenAudio(), unlike this function, always acts on device ID 1. * - `desired->freq` should be the frequency in sample-frames-per-second (Hz).
* - `desired->format` should be the audio format (`AUDIO_S16SYS`, etc).
* - `desired->samples` is the desired size of the audio buffer, in
* _sample frames_ (with stereo output, two samples--left and right--would
* make a single sample frame). This number should be a power of two, and
* may be adjusted by the audio driver to a value more suitable for the
* hardware. Good values seem to range between 512 and 8096 inclusive,
* depending on the application and CPU speed. Smaller values reduce
* latency, but can lead to underflow if the application is doing heavy
* processing and cannot fill the audio buffer in time. Note that the
* number of sample frames is directly related to time by the following
* formula: `ms = (sampleframes*1000)/freq`
* - `desired->size` is the size in _bytes_ of the audio buffer, and is
* calculated by SDL_OpenAudioDevice(). You don't initialize this.
* - `desired->silence` is the value used to set the buffer to silence,
* and is calculated by SDL_OpenAudioDevice(). You don't initialize this.
* - `desired->callback` should be set to a function that will be called
* when the audio device is ready for more data. It is passed a pointer
* to the audio buffer, and the length in bytes of the audio buffer.
* This function usually runs in a separate thread, and so you should
* protect data structures that it accesses by calling SDL_LockAudioDevice()
* and SDL_UnlockAudioDevice() in your code. Alternately, you may pass a NULL
* pointer here, and call SDL_QueueAudio() with some frequency, to queue
* more audio samples to be played (or for capture devices, call
* SDL_DequeueAudio() with some frequency, to obtain audio samples).
* - `desired->userdata` is passed as the first parameter to your callback
* function. If you passed a NULL callback, this value is ignored.
*
* `allowed_changes` can have the following flags OR'd together:
*
* - `SDL_AUDIO_ALLOW_FREQUENCY_CHANGE`
* - `SDL_AUDIO_ALLOW_FORMAT_CHANGE`
* - `SDL_AUDIO_ALLOW_CHANNELS_CHANGE`
* - `SDL_AUDIO_ALLOW_ANY_CHANGE`
*
* These flags specify how SDL should behave when a device cannot offer a
* specific feature. If the application requests a feature that the hardware
* doesn't offer, SDL will always try to get the closest equivalent.
*
* For example, if you ask for float32 audio format, but the sound card only
* supports int16, SDL will set the hardware to int16. If you had set
* SDL_AUDIO_ALLOW_FORMAT_CHANGE, SDL will change the format in the
* `obtained` structure. If that flag was *not* set, SDL will prepare to
* convert your callback's float32 audio to int16 before feeding it to the
* hardware and will keep the originally requested format in the `obtained`
* structure.
*
* If your application can only handle one specific data format, pass a zero
* for `allowed_changes` and let SDL transparently handle any differences.
*
* An opened audio device starts out paused, and should be enabled for playing
* by calling SDL_PauseAudioDevice(devid, 0) when you are ready for your audio
* callback function to be called. Since the audio driver may modify the
* requested size of the audio buffer, you should allocate any local mixing
* buffers after you open the audio device.
*
* The audio callback runs in a separate thread in most cases; you can prevent
* race conditions between your callback and other threads without fully
* pausing playback with SDL_LockAudioDevice(). For more information about the
* callback, see SDL_AudioSpec.
*
* \param device a UTF-8 string reported by SDL_GetAudioDeviceName() or a
* driver-specific name as appropriate. NULL requests the most
* reasonable default device.
* \param iscapture non-zero to specify a device should be opened for
* recording, not playback
* \param desired an SDL_AudioSpec structure representing the desired output
* format; see SDL_OpenAudio() for more information
* \param obtained an SDL_AudioSpec structure filled in with the actual output
* format; see SDL_OpenAudio() for more information
* \param allowed_changes 0, or one or more flags OR'd together
* \returns a valid device ID that is > 0 on success or 0 on failure; call
* SDL_GetError() for more information.
*
* For compatibility with SDL 1.2, this will never return 1, since
* SDL reserves that ID for the legacy SDL_OpenAudio() function.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_CloseAudioDevice
* \sa SDL_GetAudioDeviceName
* \sa SDL_LockAudioDevice
* \sa SDL_OpenAudio
* \sa SDL_PauseAudioDevice
* \sa SDL_UnlockAudioDevice
*/ */
extern DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(const char extern DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(
*device, const char *device,
int iscapture, int iscapture,
const const SDL_AudioSpec *desired,
SDL_AudioSpec * SDL_AudioSpec *obtained,
desired, int allowed_changes);
SDL_AudioSpec *
obtained,
int
allowed_changes);
@ -399,9 +570,7 @@ typedef enum
SDL_AUDIO_PAUSED SDL_AUDIO_PAUSED
} SDL_AudioStatus; } SDL_AudioStatus;
extern DECLSPEC SDL_AudioStatus SDLCALL SDL_GetAudioStatus(void); extern DECLSPEC SDL_AudioStatus SDLCALL SDL_GetAudioStatus(void);
extern DECLSPEC SDL_AudioStatus SDLCALL SDL_GetAudioDeviceStatus(SDL_AudioDeviceID dev);
extern DECLSPEC SDL_AudioStatus SDLCALL
SDL_GetAudioDeviceStatus(SDL_AudioDeviceID dev);
/* @} *//* Audio State */ /* @} *//* Audio State */
/** /**
@ -420,56 +589,79 @@ extern DECLSPEC void SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev,
/* @} *//* Pause audio functions */ /* @} *//* Pause audio functions */
/** /**
* \brief Load the audio data of a WAVE file into memory * Load the audio data of a WAVE file into memory.
* *
* Loading a WAVE file requires \c src, \c spec, \c audio_buf and \c audio_len * 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 * to be valid pointers. The entire data portion of the file is then loaded
* into memory and decoded if necessary. * into memory and decoded if necessary.
* *
* If \c freesrc is non-zero, the data source gets automatically closed and * If `freesrc` is non-zero, the data source gets automatically closed and
* freed before the function returns. * freed before the function returns.
* *
* Supported are RIFF WAVE files with the formats PCM (8, 16, 24, and 32 bits), * Supported formats are RIFF WAVE files with the formats PCM (8, 16, 24, and
* IEEE Float (32 bits), Microsoft ADPCM and IMA ADPCM (4 bits), and A-law and * 32 bits), IEEE Float (32 bits), Microsoft ADPCM and IMA ADPCM (4 bits),
* µ-law (8 bits). Other formats are currently unsupported and cause an error. * and A-law and mu-law (8 bits). Other formats are currently unsupported and
* cause an error.
* *
* If this function succeeds, the pointer returned by it is equal to \c spec * If this function succeeds, the pointer returned by it is equal to `spec`
* and the pointer to the audio data allocated by the function is written to * and the pointer to the audio data allocated by the function is written to
* \c audio_buf and its length in bytes to \c audio_len. The \ref SDL_AudioSpec * `audio_buf` and its length in bytes to `audio_len`. The SDL_AudioSpec
* members \c freq, \c channels, and \c format are set to the values of the * members `freq`, `channels`, and `format` are set to the values of the
* audio data in the buffer. The \c samples member is set to a sane default and * audio data in the buffer. The `samples` member is set to a sane default
* all others are set to zero. * and all others are set to zero.
* *
* It's necessary to use SDL_FreeWAV() to free the audio data returned in * It's necessary to use SDL_FreeWAV() to free the audio data returned in
* \c audio_buf when it is no longer used. * `audio_buf` when it is no longer used.
* *
* Because of the underspecification of the Waveform format, there are many * Because of the underspecification of the .WAV format, there are many
* problematic files in the wild that cause issues with strict decoders. To * problematic files in the wild that cause issues with strict decoders. To
* provide compatibility with these files, this decoder is lenient in regards * 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 * 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, * 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 * and `SDL_HINT_WAVE_FACT_CHUNK` can be used to tune the behavior of the
* loading process. * loading process.
* *
* Any file that is invalid (due to truncation, corruption, or wrong values in * Any file that is invalid (due to truncation, corruption, or wrong values in
* the headers), too big, or unsupported causes an error. Additionally, any * the headers), too big, or unsupported causes an error. Additionally, any
* critical I/O error from the data source will terminate the loading process * 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 * with an error. The function returns NULL on error and in all cases (with the
* exception of \c src being NULL), an appropriate error message will be set. * exception of `src` being NULL), an appropriate error message will be set.
* *
* It is required that the data source supports seeking. * It is required that the data source supports seeking.
* *
* Example: * Example:
* \code * ```c++
* SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...); * SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, &spec, &buf, &len);
* \endcode * ```
* *
* \param src The data source with the WAVE data * Note that the SDL_LoadWAV macro does this same thing for you, but in a less
* \param freesrc A integer value that makes the function close the data source if non-zero * messy way:
* \param spec A pointer filled with the audio format of the audio data *
* \param audio_buf A pointer filled with the audio data allocated by the function * ```c++
* SDL_LoadWAV("sample.wav", &spec, &buf, &len);
* ```
*
* \param src The data source for the WAVE data
* \param freesrc If non-zero, SDL will _always_ free the data source
* \param spec An SDL_AudioSpec that will be filled in with the wave file's
* format details
* \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 * \param audio_len A pointer filled with the length of the audio data buffer in bytes
* \return NULL on error, or non-NULL on success. * \returns This function, if successfully called, returns `spec`, which will
* be filled with the audio data format of the wave source data.
* `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 NULL 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_FreeWAV() to dispose of it.
*
* \sa SDL_FreeWAV
* \sa SDL_LoadWAV
*/ */
extern DECLSPEC SDL_AudioSpec *SDLCALL SDL_LoadWAV_RW(SDL_RWops * src, extern DECLSPEC SDL_AudioSpec *SDLCALL SDL_LoadWAV_RW(SDL_RWops * src,
int freesrc, int freesrc,
@ -485,18 +677,50 @@ extern DECLSPEC SDL_AudioSpec *SDLCALL SDL_LoadWAV_RW(SDL_RWops * src,
SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len) SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len)
/** /**
* This function frees data previously allocated with SDL_LoadWAV_RW() * Free data previously allocated with SDL_LoadWAV() or SDL_LoadWAV_RW().
*
* After a WAVE file has been opened with SDL_LoadWAV() or SDL_LoadWAV_RW()
* its data can eventually be freed with SDL_FreeWAV(). It is safe to call
* this function with a NULL pointer.
*
* \param audio_buf a pointer to the buffer created by SDL_LoadWAV() or
* SDL_LoadWAV_RW()
*
* \sa SDL_LoadWAV
* \sa SDL_LoadWAV_RW
*/ */
extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 * audio_buf); extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 * audio_buf);
/** /**
* This function takes a source format and rate and a destination format * Initialize an SDL_AudioCVT structure for conversion.
* and rate, and initializes the \c cvt structure with information needed
* by SDL_ConvertAudio() to convert a buffer of audio data from one format
* to the other. An unsupported format causes an error and -1 will be returned.
* *
* \return 0 if no conversion is needed, 1 if the audio filter is set up, * Before an SDL_AudioCVT structure can be used to convert audio data it must
* or -1 on error. * be initialized with source and destination information.
*
* This function will zero out every field of the SDL_AudioCVT, so it must be
* called before the application fills in the final buffer information.
*
* Once this function has returned successfully, and reported that a
* conversion is necessary, the application fills in the rest of the fields in
* SDL_AudioCVT, now that it knows how large a buffer it needs to allocate,
* and then can call SDL_ConvertAudio() to complete the conversion.
*
* \param cvt an SDL_AudioCVT structure filled in with audio conversion
* information
* \param src_format the source format of the audio data; for more info see
* SDL_AudioFormat
* \param src_channels the number of channels in the source
* \param src_rate the frequency (sample-frames-per-second) of the source
* \param dst_format the destination format of the audio data; for more info
* see SDL_AudioFormat
* \param dst_channels the number of channels in the destination
* \param dst_rate the frequency (sample-frames-per-second) of the
* destination
* \returns 1 if the audio filter is prepared, 0 if no conversion is needed,
* or a negative error code on failure; call SDL_GetError() for more
* information.
*
* \sa SDL_ConvertAudio
*/ */
extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT * cvt, extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT * cvt,
SDL_AudioFormat src_format, SDL_AudioFormat src_format,
@ -507,16 +731,40 @@ extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT * cvt,
int dst_rate); int dst_rate);
/** /**
* Once you have initialized the \c cvt structure using SDL_BuildAudioCVT(), * Convert audio data to a desired audio format.
* created an audio buffer \c cvt->buf, and filled it with \c cvt->len bytes of *
* audio data in the source format, this function will convert it in-place * This function does the actual audio data conversion, after the application
* has called SDL_BuildAudioCVT() to prepare the conversion information and
* then filled in the buffer details.
*
* Once the application has initialized the `cvt` structure using
* SDL_BuildAudioCVT(), allocated an audio buffer and filled it with audio
* data in the source format, this function will convert the buffer, in-place,
* to the desired format. * to the desired format.
* *
* The data conversion may expand the size of the audio data, so the buffer * The data conversion may go through several passes; any given pass may
* \c cvt->buf should be allocated after the \c cvt structure is initialized by * possibly temporarily increase the size of the data. For example, SDL might
* SDL_BuildAudioCVT(), and should be \c cvt->len*cvt->len_mult bytes long. * expand 16-bit data to 32 bits before resampling to a lower frequency,
* shrinking the data size after having grown it briefly. Since the supplied
* buffer will be both the source and destination, converting as necessary
* in-place, the application must allocate a buffer that will fully contain
* the data during its largest conversion pass. After SDL_BuildAudioCVT()
* returns, the application should set the `cvt->len` field to the size, in
* bytes, of the source data, and allocate a buffer that is
* `cvt->len * cvt->len_mult` bytes long for the `buf` field.
* *
* \return 0 on success or -1 if \c cvt->buf is NULL. * The source data should be copied into this buffer before the call to
* SDL_ConvertAudio(). Upon successful return, this buffer will contain the
* converted audio, and `cvt->len_cvt` will be the size of the converted data,
* in bytes. Any bytes in the buffer past `cvt->len_cvt` are undefined once
* this function returns.
*
* \param cvt an SDL_AudioCVT structure that was previously set up by
* SDL_BuildAudioCVT().
* \returns 0 if the conversion was completed successfully or a negative error
* code on failure; call SDL_GetError() for more information.
*
* \sa SDL_BuildAudioCVT
*/ */
extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT * cvt); extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT * cvt);
@ -532,7 +780,7 @@ struct _SDL_AudioStream;
typedef struct _SDL_AudioStream SDL_AudioStream; typedef struct _SDL_AudioStream SDL_AudioStream;
/** /**
* Create a new audio stream * Create a new audio stream.
* *
* \param src_format The format of the source audio * \param src_format The format of the source audio
* \param src_channels The number of channels of the source audio * \param src_channels The number of channels of the source audio
@ -540,7 +788,7 @@ typedef struct _SDL_AudioStream SDL_AudioStream;
* \param dst_format The format of the desired audio output * \param dst_format The format of the desired audio output
* \param dst_channels The number of channels of the desired audio output * \param dst_channels The number of channels of the desired audio output
* \param dst_rate The sampling rate of the desired audio output * \param dst_rate The sampling rate of the desired audio output
* \return 0 on success, or -1 on error. * \returns 0 on success, or -1 on error.
* *
* \sa SDL_AudioStreamPut * \sa SDL_AudioStreamPut
* \sa SDL_AudioStreamGet * \sa SDL_AudioStreamGet
@ -557,12 +805,12 @@ extern DECLSPEC SDL_AudioStream * SDLCALL SDL_NewAudioStream(const SDL_AudioForm
const int dst_rate); const int dst_rate);
/** /**
* Add data to be converted/resampled to the stream * Add data to be converted/resampled to the stream.
* *
* \param stream The stream the audio data is being added to * \param stream The stream the audio data is being added to
* \param buf A pointer to the audio data to add * \param buf A pointer to the audio data to add
* \param len The number of bytes to write to the stream * \param len The number of bytes to write to the stream
* \return 0 on success, or -1 on error. * \returns 0 on success, or -1 on error.
* *
* \sa SDL_NewAudioStream * \sa SDL_NewAudioStream
* \sa SDL_AudioStreamGet * \sa SDL_AudioStreamGet
@ -579,7 +827,7 @@ extern DECLSPEC int SDLCALL SDL_AudioStreamPut(SDL_AudioStream *stream, const vo
* \param stream The stream the audio is being requested from * \param stream The stream the audio is being requested from
* \param buf A buffer to fill with audio data * \param buf A buffer to fill with audio data
* \param len The maximum number of bytes to fill * \param len The maximum number of bytes to fill
* \return The number of bytes read from the stream, or -1 on error * \returns the number of bytes read from the stream, or -1 on error
* *
* \sa SDL_NewAudioStream * \sa SDL_NewAudioStream
* \sa SDL_AudioStreamPut * \sa SDL_AudioStreamPut
@ -648,19 +896,55 @@ extern DECLSPEC void SDLCALL SDL_FreeAudioStream(SDL_AudioStream *stream);
#define SDL_MIX_MAXVOLUME 128 #define SDL_MIX_MAXVOLUME 128
/** /**
* This takes two audio buffers of the playing audio format and mixes * This function is a legacy means of mixing audio.
* them, performing addition, volume adjustment, and overflow clipping. *
* The volume ranges from 0 - 128, and should be set to ::SDL_MIX_MAXVOLUME * This function is equivalent to calling
* for full audio volume. Note this does not change hardware volume. *
* This is provided for convenience -- you can mix your own audio data. * ```c++
* SDL_MixAudioFormat(dst, src, format, len, volume);
* ```
*
* where `format` is the obtained format of the audio device from the legacy
* SDL_OpenAudio() function.
*
* \param dst the destination for the mixed audio
* \param src the source audio buffer to be mixed
* \param len the length of the audio buffer in bytes
* \param volume ranges from 0 - 128, and should be set to SDL_MIX_MAXVOLUME
* for full audio volume
*
* \sa SDL_MixAudioFormat
*/ */
extern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 * dst, const Uint8 * src, extern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 * dst, const Uint8 * src,
Uint32 len, int volume); Uint32 len, int volume);
/** /**
* This works like SDL_MixAudio(), but you specify the audio format instead of * Mix audio data in a specified format.
* using the format of audio device 1. Thus it can be used when no audio *
* device is open at all. * 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_MixAudioFormat() 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 - 128, and should be set to SDL_MIX_MAXVOLUME
* for full audio volume
*/ */
extern DECLSPEC void SDLCALL SDL_MixAudioFormat(Uint8 * dst, extern DECLSPEC void SDLCALL SDL_MixAudioFormat(Uint8 * dst,
const Uint8 * src, const Uint8 * src,
@ -670,159 +954,161 @@ extern DECLSPEC void SDLCALL SDL_MixAudioFormat(Uint8 * dst,
/** /**
* Queue more audio on non-callback devices. * Queue more audio on non-callback devices.
* *
* (If you are looking to retrieve queued audio from a non-callback capture * If you are looking to retrieve queued audio from a non-callback capture
* device, you want SDL_DequeueAudio() instead. This will return -1 to * device, you want SDL_DequeueAudio() instead. SDL_QueueAudio() will return
* signify an error if you use it with capture devices.) * -1 to signify an error if you use it with capture devices.
* *
* SDL offers two ways to feed audio to the device: you can either supply a * SDL offers two ways to feed audio to the device: you can either supply a
* callback that SDL triggers with some frequency to obtain more audio * callback that SDL triggers with some frequency to obtain more audio (pull
* (pull method), or you can supply no callback, and then SDL will expect * method), or you can supply no callback, and then SDL will expect you to
* you to supply data at regular intervals (push method) with this function. * supply data at regular intervals (push method) with this function.
* *
* There are no limits on the amount of data you can queue, short of * There are no limits on the amount of data you can queue, short of
* exhaustion of address space. Queued data will drain to the device as * exhaustion of address space. Queued data will drain to the device as
* necessary without further intervention from you. If the device needs * necessary without further intervention from you. If the device needs audio
* audio but there is not enough queued, it will play silence to make up * but there is not enough queued, it will play silence to make up the
* the difference. This means you will have skips in your audio playback * difference. This means you will have skips in your audio playback if you
* if you aren't routinely queueing sufficient data. * aren't routinely queueing sufficient data.
* *
* This function copies the supplied data, so you are safe to free it when * This function copies the supplied data, so you are safe to free it when the
* the function returns. This function is thread-safe, but queueing to the * function returns. This function is thread-safe, but queueing to the same
* same device from two threads at once does not promise which buffer will * device from two threads at once does not promise which buffer will be
* be queued first. * queued first.
* *
* You may not queue audio on a device that is using an application-supplied * You may not queue audio on a device that is using an application-supplied
* callback; doing so returns an error. You have to use the audio callback * callback; doing so returns an error. You have to use the audio callback or
* or queue audio with this function, but not both. * queue audio with this function, but not both.
* *
* You should not call SDL_LockAudio() on the device before queueing; SDL * You should not call SDL_LockAudio() on the device before queueing; SDL
* handles locking internally for this function. * handles locking internally for this function.
* *
* \param dev The device ID to which we will queue audio. * \param dev the device ID to which we will queue audio
* \param data The data to queue to the device for later playback. * \param data the data to queue to the device for later playback
* \param len The number of bytes (not samples!) to which (data) points. * \param len the number of bytes (not samples!) to which `data` points
* \return 0 on success, or -1 on error. * \returns 0 on success or a negative error code on failure; call
* SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.4.
* *
* \sa SDL_GetQueuedAudioSize
* \sa SDL_ClearQueuedAudio * \sa SDL_ClearQueuedAudio
* \sa SDL_GetQueuedAudioSize
*/ */
extern DECLSPEC int SDLCALL SDL_QueueAudio(SDL_AudioDeviceID dev, const void *data, Uint32 len); extern DECLSPEC int SDLCALL SDL_QueueAudio(SDL_AudioDeviceID dev, const void *data, Uint32 len);
/** /**
* Dequeue more audio on non-callback devices. * Dequeue more audio on non-callback devices.
* *
* (If you are looking to queue audio for output on a non-callback playback * If you are looking to queue audio for output on a non-callback playback
* device, you want SDL_QueueAudio() instead. This will always return 0 * device, you want SDL_QueueAudio() instead. SDL_DequeueAudio() will always
* if you use it with playback devices.) * return 0 if you use it with playback devices.
* *
* SDL offers two ways to retrieve audio from a capture device: you can * SDL offers two ways to retrieve audio from a capture device: you can either
* either supply a callback that SDL triggers with some frequency as the * supply a callback that SDL triggers with some frequency as the device
* device records more audio data, (push method), or you can supply no * records more audio data, (push method), or you can supply no callback, and
* callback, and then SDL will expect you to retrieve data at regular * then SDL will expect you to retrieve data at regular intervals (pull
* intervals (pull method) with this function. * method) with this function.
* *
* There are no limits on the amount of data you can queue, short of * There are no limits on the amount of data you can queue, short of
* exhaustion of address space. Data from the device will keep queuing as * exhaustion of address space. Data from the device will keep queuing as
* necessary without further intervention from you. This means you will * necessary without further intervention from you. This means you will
* eventually run out of memory if you aren't routinely dequeueing data. * eventually run out of memory if you aren't routinely dequeueing data.
* *
* Capture devices will not queue data when paused; if you are expecting * Capture devices will not queue data when paused; if you are expecting to
* to not need captured audio for some length of time, use * not need captured audio for some length of time, use SDL_PauseAudioDevice()
* SDL_PauseAudioDevice() to stop the capture device from queueing more * to stop the capture device from queueing more data. This can be useful
* data. This can be useful during, say, level loading times. When * during, say, level loading times. When unpaused, capture devices will start
* unpaused, capture devices will start queueing data from that point, * queueing data from that point, having flushed any capturable data available
* having flushed any capturable data available while paused. * while paused.
* *
* This function is thread-safe, but dequeueing from the same device from * This function is thread-safe, but dequeueing from the same device from two
* two threads at once does not promise which thread will dequeued data * threads at once does not promise which thread will dequeue data first.
* first.
* *
* You may not dequeue audio from a device that is using an * You may not dequeue audio from a device that is using an
* application-supplied callback; doing so returns an error. You have to use * application-supplied callback; doing so returns an error. You have to use
* the audio callback, or dequeue audio with this function, but not both. * the audio callback, or dequeue audio with this function, but not both.
* *
* You should not call SDL_LockAudio() on the device before queueing; SDL * You should not call SDL_LockAudio() on the device before dequeueing; SDL
* handles locking internally for this function. * handles locking internally for this function.
* *
* \param dev The device ID from which we will dequeue audio. * \param dev the device ID from which we will dequeue audio
* \param data A pointer into where audio data should be copied. * \param data a pointer into where audio data should be copied
* \param len The number of bytes (not samples!) to which (data) points. * \param len the number of bytes (not samples!) to which (data) points
* \return number of bytes dequeued, which could be less than requested. * \returns number of bytes dequeued, which could be less than requested; call
* SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.5.
* *
* \sa SDL_GetQueuedAudioSize
* \sa SDL_ClearQueuedAudio * \sa SDL_ClearQueuedAudio
* \sa SDL_GetQueuedAudioSize
*/ */
extern DECLSPEC Uint32 SDLCALL SDL_DequeueAudio(SDL_AudioDeviceID dev, void *data, Uint32 len); extern DECLSPEC Uint32 SDLCALL SDL_DequeueAudio(SDL_AudioDeviceID dev, void *data, Uint32 len);
/** /**
* Get the number of bytes of still-queued audio. * Get the number of bytes of still-queued audio.
* *
* For playback device: * For playback devices: this is the number of bytes that have been queued
* for playback with SDL_QueueAudio(), but have not yet been sent to the
* hardware.
* *
* This is the number of bytes that have been queued for playback with * Once we've sent it to the hardware, this function can not decide the exact
* SDL_QueueAudio(), but have not yet been sent to the hardware. This * byte boundary of what has been played. It's possible that we just gave the
* number may shrink at any time, so this only informs of pending data. * hardware several kilobytes right before you called this function, but it
* hasn't played any of it yet, or maybe half of it, etc.
* *
* Once we've sent it to the hardware, this function can not decide the * For capture devices, this is the number of bytes that have been captured by
* exact byte boundary of what has been played. It's possible that we just * the device and are waiting for you to dequeue. This number may grow at any
* gave the hardware several kilobytes right before you called this * time, so this only informs of the lower-bound of available data.
* function, but it hasn't played any of it yet, or maybe half of it, etc.
* *
* For capture devices: * You may not queue or dequeue audio on a device that is using an
* * application-supplied callback; calling this function on such a device
* This is the number of bytes that have been captured by the device and * always returns 0. You have to use the audio callback or queue audio, but
* are waiting for you to dequeue. This number may grow at any time, so * not both.
* this only informs of the lower-bound of available data.
*
* You may not queue audio on a device that is using an application-supplied
* callback; calling this function on such a device always returns 0.
* You have to queue audio with SDL_QueueAudio()/SDL_DequeueAudio(), or use
* the audio callback, but not both.
* *
* You should not call SDL_LockAudio() on the device before querying; SDL * You should not call SDL_LockAudio() on the device before querying; SDL
* handles locking internally for this function. * handles locking internally for this function.
* *
* \param dev The device ID of which we will query queued audio size. * \param dev the device ID of which we will query queued audio size
* \return Number of bytes (not samples!) of queued audio. * \returns the number of bytes (not samples!) of queued audio.
*
* \since This function is available since SDL 2.0.4.
* *
* \sa SDL_QueueAudio
* \sa SDL_ClearQueuedAudio * \sa SDL_ClearQueuedAudio
* \sa SDL_QueueAudio
* \sa SDL_DequeueAudio
*/ */
extern DECLSPEC Uint32 SDLCALL SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev); extern DECLSPEC Uint32 SDLCALL SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev);
/** /**
* Drop any queued audio data. For playback devices, this is any queued data * Drop any queued audio data waiting to be sent to the hardware.
* still waiting to be submitted to the hardware. For capture devices, this
* is any data that was queued by the device that hasn't yet been dequeued by
* the application.
* *
* Immediately after this call, SDL_GetQueuedAudioSize() will return 0. For * Immediately after this call, SDL_GetQueuedAudioSize() will return 0. For
* playback devices, the hardware will start playing silence if more audio * output devices, the hardware will start playing silence if more audio isn't
* isn't queued. Unpaused capture devices will start filling the queue again * queued. For capture devices, the hardware will start filling the empty
* as soon as they have more data available (which, depending on the state * queue with new data if the capture device isn't paused.
* of the hardware and the thread, could be before this function call
* returns!).
* *
* This will not prevent playback of queued audio that's already been sent * This will not prevent playback of queued audio that's already been sent to
* to the hardware, as we can not undo that, so expect there to be some * the hardware, as we can not undo that, so expect there to be some fraction
* fraction of a second of audio that might still be heard. This can be * of a second of audio that might still be heard. This can be useful if you
* useful if you want to, say, drop any pending music during a level change * want to, say, drop any pending music or any unprocessed microphone input
* in your game. * during a level change in your game.
* *
* You may not queue audio on a device that is using an application-supplied * You may not queue or dequeue audio on a device that is using an
* callback; calling this function on such a device is always a no-op. * application-supplied callback; calling this function on such a device
* You have to queue audio with SDL_QueueAudio()/SDL_DequeueAudio(), or use * always returns 0. You have to use the audio callback or queue audio, but
* the audio callback, but not both. * not both.
* *
* You should not call SDL_LockAudio() on the device before clearing the * You should not call SDL_LockAudio() on the device before clearing the
* queue; SDL handles locking internally for this function. * queue; SDL handles locking internally for this function.
* *
* This function always succeeds and thus returns void. * This function always succeeds and thus returns void.
* *
* \param dev The device ID of which to clear the audio queue. * \param dev the device ID of which to clear the audio queue
*
* \since This function is available since SDL 2.0.4.
* *
* \sa SDL_QueueAudio
* \sa SDL_GetQueuedAudioSize * \sa SDL_GetQueuedAudioSize
* \sa SDL_QueueAudio
* \sa SDL_DequeueAudio
*/ */
extern DECLSPEC void SDLCALL SDL_ClearQueuedAudio(SDL_AudioDeviceID dev); extern DECLSPEC void SDLCALL SDL_ClearQueuedAudio(SDL_AudioDeviceID dev);
@ -843,7 +1129,17 @@ extern DECLSPEC void SDLCALL SDL_UnlockAudioDevice(SDL_AudioDeviceID dev);
/* @} *//* Audio lock functions */ /* @} *//* Audio lock functions */
/** /**
* This function shuts down audio processing and closes the audio device. * This function is a legacy means of closing the audio device.
*
* This function is equivalent to calling
*
* ```c++
* SDL_CloseAudioDevice(1);
* ```
*
* and is only useful if you used the legacy SDL_OpenAudio() function.
*
* \sa SDL_OpenAudio
*/ */
extern DECLSPEC void SDLCALL SDL_CloseAudio(void); extern DECLSPEC void SDLCALL SDL_CloseAudio(void);
extern DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID dev); extern DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID dev);

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -48,10 +48,9 @@ extern "C" {
* \return Index of the most significant bit, or -1 if the value is 0. * \return Index of the most significant bit, or -1 if the value is 0.
*/ */
#if defined(__WATCOMC__) && defined(__386__) #if defined(__WATCOMC__) && defined(__386__)
extern _inline int _SDL_clz_watcom (Uint32); extern _inline int _SDL_bsr_watcom (Uint32);
#pragma aux _SDL_clz_watcom = \ #pragma aux _SDL_bsr_watcom = \
"bsr eax, eax" \ "bsr eax, eax" \
"xor eax, 31" \
parm [eax] nomemory \ parm [eax] nomemory \
value [eax] \ value [eax] \
modify exact [eax] nomemory; modify exact [eax] nomemory;
@ -72,7 +71,13 @@ SDL_MostSignificantBitIndex32(Uint32 x)
if (x == 0) { if (x == 0) {
return -1; return -1;
} }
return 31 - _SDL_clz_watcom(x); return _SDL_bsr_watcom(x);
#elif defined(_MSC_VER)
unsigned long index;
if (_BitScanReverse(&index, x)) {
return index;
}
return -1;
#else #else
/* Based off of Bit Twiddling Hacks by Sean Eron Anderson /* Based off of Bit Twiddling Hacks by Sean Eron Anderson
* <seander@cs.stanford.edu>, released in the public domain. * <seander@cs.stanford.edu>, released in the public domain.

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -91,19 +91,96 @@ typedef enum
} SDL_BlendFactor; } SDL_BlendFactor;
/** /**
* \brief Create a custom blend mode, which may or may not be supported by a given renderer * Compose a custom blend mode for renderers.
* *
* \param srcColorFactor source color factor * The functions SDL_SetRenderDrawBlendMode and SDL_SetTextureBlendMode accept
* \param dstColorFactor destination color factor * the SDL_BlendMode returned by this function if the renderer supports it.
* \param colorOperation color operation
* \param srcAlphaFactor source alpha factor
* \param dstAlphaFactor destination alpha factor
* \param alphaOperation alpha operation
* *
* The result of the blend mode operation will be: * A blend mode controls how the pixels from a drawing operation (source) get
* dstRGB = dstRGB * dstColorFactor colorOperation srcRGB * srcColorFactor * combined with the pixels from the render target (destination). First, the
* and * components of the source and destination pixels get multiplied with their
* dstA = dstA * dstAlphaFactor alphaOperation srcA * srcAlphaFactor * 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 in
* SDL 2.0.6. All renderers support the four blend modes listed in the
* SDL_BlendMode enumeration.
*
* - **direct3d**: Supports `SDL_BLENDOPERATION_ADD` with all factors.
* - **direct3d11**: Supports all operations with all factors. However, some
* factors produce unexpected results with `SDL_BLENDOPERATION_MINIMUM` and
* `SDL_BLENDOPERATION_MAXIMUM`.
* - **opengl**: Supports the `SDL_BLENDOPERATION_ADD` operation with all
* factors. OpenGL versions 1.1, 1.2, and 1.3 do not work correctly with
* SDL 2.0.6.
* - **opengles**: Supports the `SDL_BLENDOPERATION_ADD` operation with all
* factors. Color and alpha factors need to be the same. OpenGL ES 1
* implementation specific: May also support `SDL_BLENDOPERATION_SUBTRACT`
* and `SDL_BLENDOPERATION_REV_SUBTRACT`. May support color and alpha
* operations being different from each other. May support color and alpha
* factors being different from each other.
* - **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 in SDL 2.0.6.
*
* \sa SDL_SetRenderDrawBlendMode
* \sa SDL_GetRenderDrawBlendMode
* \sa SDL_SetTextureBlendMode
* \sa SDL_GetTextureBlendMode
*/ */
extern DECLSPEC SDL_BlendMode SDLCALL SDL_ComposeCustomBlendMode(SDL_BlendFactor srcColorFactor, extern DECLSPEC SDL_BlendMode SDLCALL SDL_ComposeCustomBlendMode(SDL_BlendFactor srcColorFactor,
SDL_BlendFactor dstColorFactor, SDL_BlendFactor dstColorFactor,

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -39,23 +39,41 @@ extern "C" {
/* Function prototypes */ /* Function prototypes */
/** /**
* \brief Put UTF-8 text into the clipboard * Put UTF-8 text into the clipboard.
* *
* \sa SDL_GetClipboardText() * \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.
*
* \sa SDL_GetClipboardText
* \sa SDL_HasClipboardText
*/ */
extern DECLSPEC int SDLCALL SDL_SetClipboardText(const char *text); extern DECLSPEC int SDLCALL SDL_SetClipboardText(const char *text);
/** /**
* \brief Get UTF-8 text from the clipboard, which must be freed with SDL_free() * Get UTF-8 text from the clipboard, which must be freed with SDL_free().
* *
* \sa SDL_SetClipboardText() * This functions returns NULL if there was not enough memory left for a copy
* of the clipboard's content.
*
* \returns the clipboard text on success or NULL on failure; call
* SDL_GetError() for more information. Caller must call SDL_free()
* on the returned pointer when done with it.
*
* \sa SDL_HasClipboardText
* \sa SDL_SetClipboardText
*/ */
extern DECLSPEC char * SDLCALL SDL_GetClipboardText(void); extern DECLSPEC char * SDLCALL SDL_GetClipboardText(void);
/** /**
* \brief Returns a flag indicating whether the clipboard exists and contains a text string that is non-empty * Query whether the clipboard exists and contains a non-empty text string.
* *
* \sa SDL_GetClipboardText() * \returns SDL_TRUE if the clipboard has text, or SDL_FALSE if it does not.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_GetClipboardText
* \sa SDL_SetClipboardText
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasClipboardText(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasClipboardText(void);

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -38,7 +38,7 @@
/* C datatypes */ /* C datatypes */
/* Define SIZEOF_VOIDP for 64/32 architectures */ /* Define SIZEOF_VOIDP for 64/32 architectures */
#ifdef __LP64__ #if defined(__LP64__) || defined(_LP64) || defined(_WIN64)
#define SIZEOF_VOIDP 8 #define SIZEOF_VOIDP 8
#else #else
#define SIZEOF_VOIDP 4 #define SIZEOF_VOIDP 4
@ -96,6 +96,7 @@
#cmakedefine HAVE_WCSLEN 1 #cmakedefine HAVE_WCSLEN 1
#cmakedefine HAVE_WCSLCPY 1 #cmakedefine HAVE_WCSLCPY 1
#cmakedefine HAVE_WCSLCAT 1 #cmakedefine HAVE_WCSLCAT 1
#cmakedefine HAVE__WCSDUP 1
#cmakedefine HAVE_WCSDUP 1 #cmakedefine HAVE_WCSDUP 1
#cmakedefine HAVE_WCSSTR 1 #cmakedefine HAVE_WCSSTR 1
#cmakedefine HAVE_WCSCMP 1 #cmakedefine HAVE_WCSCMP 1
@ -116,7 +117,6 @@
#cmakedefine HAVE_STRRCHR 1 #cmakedefine HAVE_STRRCHR 1
#cmakedefine HAVE_STRSTR 1 #cmakedefine HAVE_STRSTR 1
#cmakedefine HAVE_STRTOK_R 1 #cmakedefine HAVE_STRTOK_R 1
#cmakedefine HAVE_STRTOK_S 1
#cmakedefine HAVE_ITOA 1 #cmakedefine HAVE_ITOA 1
#cmakedefine HAVE__LTOA 1 #cmakedefine HAVE__LTOA 1
#cmakedefine HAVE__UITOA 1 #cmakedefine HAVE__UITOA 1
@ -166,8 +166,12 @@
#cmakedefine HAVE_LOGF 1 #cmakedefine HAVE_LOGF 1
#cmakedefine HAVE_LOG10 1 #cmakedefine HAVE_LOG10 1
#cmakedefine HAVE_LOG10F 1 #cmakedefine HAVE_LOG10F 1
#cmakedefine HAVE_LROUND 1
#cmakedefine HAVE_LROUNDF 1
#cmakedefine HAVE_POW 1 #cmakedefine HAVE_POW 1
#cmakedefine HAVE_POWF 1 #cmakedefine HAVE_POWF 1
#cmakedefine HAVE_ROUND 1
#cmakedefine HAVE_ROUNDF 1
#cmakedefine HAVE_SCALBN 1 #cmakedefine HAVE_SCALBN 1
#cmakedefine HAVE_SCALBNF 1 #cmakedefine HAVE_SCALBNF 1
#cmakedefine HAVE_SIN 1 #cmakedefine HAVE_SIN 1
@ -203,6 +207,7 @@
#cmakedefine HAVE_STDARG_H 1 #cmakedefine HAVE_STDARG_H 1
#cmakedefine HAVE_STDDEF_H 1 #cmakedefine HAVE_STDDEF_H 1
#cmakedefine HAVE_FLOAT_H 1 #cmakedefine HAVE_FLOAT_H 1
#else #else
/* We may need some replacement for stdarg.h here */ /* We may need some replacement for stdarg.h here */
#include <stdarg.h> #include <stdarg.h>
@ -259,6 +264,8 @@
#cmakedefine SDL_AUDIO_DRIVER_ALSA @SDL_AUDIO_DRIVER_ALSA@ #cmakedefine SDL_AUDIO_DRIVER_ALSA @SDL_AUDIO_DRIVER_ALSA@
#cmakedefine SDL_AUDIO_DRIVER_ALSA_DYNAMIC @SDL_AUDIO_DRIVER_ALSA_DYNAMIC@ #cmakedefine SDL_AUDIO_DRIVER_ALSA_DYNAMIC @SDL_AUDIO_DRIVER_ALSA_DYNAMIC@
#cmakedefine SDL_AUDIO_DRIVER_ANDROID @SDL_AUDIO_DRIVER_ANDROID@ #cmakedefine SDL_AUDIO_DRIVER_ANDROID @SDL_AUDIO_DRIVER_ANDROID@
#cmakedefine SDL_AUDIO_DRIVER_OPENSLES @SDL_AUDIO_DRIVER_OPENSLES@
#cmakedefine SDL_AUDIO_DRIVER_AAUDIO @SDL_AUDIO_DRIVER_AAUDIO@
#cmakedefine SDL_AUDIO_DRIVER_ARTS @SDL_AUDIO_DRIVER_ARTS@ #cmakedefine SDL_AUDIO_DRIVER_ARTS @SDL_AUDIO_DRIVER_ARTS@
#cmakedefine SDL_AUDIO_DRIVER_ARTS_DYNAMIC @SDL_AUDIO_DRIVER_ARTS_DYNAMIC@ #cmakedefine SDL_AUDIO_DRIVER_ARTS_DYNAMIC @SDL_AUDIO_DRIVER_ARTS_DYNAMIC@
#cmakedefine SDL_AUDIO_DRIVER_COREAUDIO @SDL_AUDIO_DRIVER_COREAUDIO@ #cmakedefine SDL_AUDIO_DRIVER_COREAUDIO @SDL_AUDIO_DRIVER_COREAUDIO@
@ -279,6 +286,8 @@
#cmakedefine SDL_AUDIO_DRIVER_OSS @SDL_AUDIO_DRIVER_OSS@ #cmakedefine SDL_AUDIO_DRIVER_OSS @SDL_AUDIO_DRIVER_OSS@
#cmakedefine SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H @SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H@ #cmakedefine SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H @SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H@
#cmakedefine SDL_AUDIO_DRIVER_PAUDIO @SDL_AUDIO_DRIVER_PAUDIO@ #cmakedefine SDL_AUDIO_DRIVER_PAUDIO @SDL_AUDIO_DRIVER_PAUDIO@
#cmakedefine SDL_AUDIO_DRIVER_PIPEWIRE @SDL_AUDIO_DRIVER_PIPEWIRE@
#cmakedefine SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC @SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC@
#cmakedefine SDL_AUDIO_DRIVER_PULSEAUDIO @SDL_AUDIO_DRIVER_PULSEAUDIO@ #cmakedefine SDL_AUDIO_DRIVER_PULSEAUDIO @SDL_AUDIO_DRIVER_PULSEAUDIO@
#cmakedefine SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC @SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC@ #cmakedefine SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC @SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC@
#cmakedefine SDL_AUDIO_DRIVER_QSA @SDL_AUDIO_DRIVER_QSA@ #cmakedefine SDL_AUDIO_DRIVER_QSA @SDL_AUDIO_DRIVER_QSA@
@ -287,6 +296,8 @@
#cmakedefine SDL_AUDIO_DRIVER_SUNAUDIO @SDL_AUDIO_DRIVER_SUNAUDIO@ #cmakedefine SDL_AUDIO_DRIVER_SUNAUDIO @SDL_AUDIO_DRIVER_SUNAUDIO@
#cmakedefine SDL_AUDIO_DRIVER_WASAPI @SDL_AUDIO_DRIVER_WASAPI@ #cmakedefine SDL_AUDIO_DRIVER_WASAPI @SDL_AUDIO_DRIVER_WASAPI@
#cmakedefine SDL_AUDIO_DRIVER_WINMM @SDL_AUDIO_DRIVER_WINMM@ #cmakedefine SDL_AUDIO_DRIVER_WINMM @SDL_AUDIO_DRIVER_WINMM@
#cmakedefine SDL_AUDIO_DRIVER_OS2 @SDL_AUDIO_DRIVER_OS2@
#cmakedefine SDL_AUDIO_DRIVER_VITA @SDL_AUDIO_DRIVER_VITA@
/* Enable various input drivers */ /* Enable various input drivers */
#cmakedefine SDL_INPUT_LINUXEV @SDL_INPUT_LINUXEV@ #cmakedefine SDL_INPUT_LINUXEV @SDL_INPUT_LINUXEV@
@ -300,11 +311,13 @@
#cmakedefine SDL_JOYSTICK_MFI @SDL_JOYSTICK_MFI@ #cmakedefine SDL_JOYSTICK_MFI @SDL_JOYSTICK_MFI@
#cmakedefine SDL_JOYSTICK_LINUX @SDL_JOYSTICK_LINUX@ #cmakedefine SDL_JOYSTICK_LINUX @SDL_JOYSTICK_LINUX@
#cmakedefine SDL_JOYSTICK_WINMM @SDL_JOYSTICK_WINMM@ #cmakedefine SDL_JOYSTICK_WINMM @SDL_JOYSTICK_WINMM@
#cmakedefine SDL_JOYSTICK_OS2 @SDL_JOYSTICK_OS2@
#cmakedefine SDL_JOYSTICK_USBHID @SDL_JOYSTICK_USBHID@ #cmakedefine SDL_JOYSTICK_USBHID @SDL_JOYSTICK_USBHID@
#cmakedefine SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H @SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H@ #cmakedefine SDL_HAVE_MACHINE_JOYSTICK_H @SDL_HAVE_MACHINE_JOYSTICK_H@
#cmakedefine SDL_JOYSTICK_HIDAPI @SDL_JOYSTICK_HIDAPI@ #cmakedefine SDL_JOYSTICK_HIDAPI @SDL_JOYSTICK_HIDAPI@
#cmakedefine SDL_JOYSTICK_EMSCRIPTEN @SDL_JOYSTICK_EMSCRIPTEN@ #cmakedefine SDL_JOYSTICK_EMSCRIPTEN @SDL_JOYSTICK_EMSCRIPTEN@
#cmakedefine SDL_JOYSTICK_VIRTUAL @SDL_JOYSTICK_VIRTUAL@ #cmakedefine SDL_JOYSTICK_VIRTUAL @SDL_JOYSTICK_VIRTUAL@
#cmakedefine SDL_JOYSTICK_VITA @SDL_JOYSTICK_VITA@
#cmakedefine SDL_HAPTIC_DUMMY @SDL_HAPTIC_DUMMY@ #cmakedefine SDL_HAPTIC_DUMMY @SDL_HAPTIC_DUMMY@
#cmakedefine SDL_HAPTIC_LINUX @SDL_HAPTIC_LINUX@ #cmakedefine SDL_HAPTIC_LINUX @SDL_HAPTIC_LINUX@
#cmakedefine SDL_HAPTIC_IOKIT @SDL_HAPTIC_IOKIT@ #cmakedefine SDL_HAPTIC_IOKIT @SDL_HAPTIC_IOKIT@
@ -318,28 +331,35 @@
#cmakedefine SDL_SENSOR_COREMOTION @SDL_SENSOR_COREMOTION@ #cmakedefine SDL_SENSOR_COREMOTION @SDL_SENSOR_COREMOTION@
#cmakedefine SDL_SENSOR_WINDOWS @SDL_SENSOR_WINDOWS@ #cmakedefine SDL_SENSOR_WINDOWS @SDL_SENSOR_WINDOWS@
#cmakedefine SDL_SENSOR_DUMMY @SDL_SENSOR_DUMMY@ #cmakedefine SDL_SENSOR_DUMMY @SDL_SENSOR_DUMMY@
#cmakedefine SDL_SENSOR_VITA @SDL_SENSOR_VITA@
/* Enable various shared object loading systems */ /* Enable various shared object loading systems */
#cmakedefine SDL_LOADSO_DLOPEN @SDL_LOADSO_DLOPEN@ #cmakedefine SDL_LOADSO_DLOPEN @SDL_LOADSO_DLOPEN@
#cmakedefine SDL_LOADSO_DUMMY @SDL_LOADSO_DUMMY@ #cmakedefine SDL_LOADSO_DUMMY @SDL_LOADSO_DUMMY@
#cmakedefine SDL_LOADSO_LDG @SDL_LOADSO_LDG@ #cmakedefine SDL_LOADSO_LDG @SDL_LOADSO_LDG@
#cmakedefine SDL_LOADSO_WINDOWS @SDL_LOADSO_WINDOWS@ #cmakedefine SDL_LOADSO_WINDOWS @SDL_LOADSO_WINDOWS@
#cmakedefine SDL_LOADSO_OS2 @SDL_LOADSO_OS2@
/* Enable various threading systems */ /* Enable various threading systems */
#cmakedefine SDL_THREAD_GENERIC_COND_SUFFIX @SDL_THREAD_GENERIC_COND_SUFFIX@
#cmakedefine SDL_THREAD_PTHREAD @SDL_THREAD_PTHREAD@ #cmakedefine SDL_THREAD_PTHREAD @SDL_THREAD_PTHREAD@
#cmakedefine SDL_THREAD_PTHREAD_RECURSIVE_MUTEX @SDL_THREAD_PTHREAD_RECURSIVE_MUTEX@ #cmakedefine SDL_THREAD_PTHREAD_RECURSIVE_MUTEX @SDL_THREAD_PTHREAD_RECURSIVE_MUTEX@
#cmakedefine SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP @SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP@ #cmakedefine SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP @SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP@
#cmakedefine SDL_THREAD_WINDOWS @SDL_THREAD_WINDOWS@ #cmakedefine SDL_THREAD_WINDOWS @SDL_THREAD_WINDOWS@
#cmakedefine SDL_THREAD_OS2 @SDL_THREAD_OS2@
#cmakedefine SDL_THREAD_VITA @SDL_THREAD_VITA@
/* Enable various timer systems */ /* Enable various timer systems */
#cmakedefine SDL_TIMER_HAIKU @SDL_TIMER_HAIKU@ #cmakedefine SDL_TIMER_HAIKU @SDL_TIMER_HAIKU@
#cmakedefine SDL_TIMER_DUMMY @SDL_TIMER_DUMMY@ #cmakedefine SDL_TIMER_DUMMY @SDL_TIMER_DUMMY@
#cmakedefine SDL_TIMER_UNIX @SDL_TIMER_UNIX@ #cmakedefine SDL_TIMER_UNIX @SDL_TIMER_UNIX@
#cmakedefine SDL_TIMER_WINDOWS @SDL_TIMER_WINDOWS@ #cmakedefine SDL_TIMER_WINDOWS @SDL_TIMER_WINDOWS@
#cmakedefine SDL_TIMER_WINCE @SDL_TIMER_WINCE@ #cmakedefine SDL_TIMER_OS2 @SDL_TIMER_OS2@
#cmakedefine SDL_TIMER_VITA @SDL_TIMER_VITA@
/* Enable various video drivers */ /* Enable various video drivers */
#cmakedefine SDL_VIDEO_DRIVER_ANDROID @SDL_VIDEO_DRIVER_ANDROID@ #cmakedefine SDL_VIDEO_DRIVER_ANDROID @SDL_VIDEO_DRIVER_ANDROID@
#cmakedefine SDL_VIDEO_DRIVER_EMSCRIPTEN @SDL_VIDEO_DRIVER_EMSCRIPTEN@
#cmakedefine SDL_VIDEO_DRIVER_HAIKU @SDL_VIDEO_DRIVER_HAIKU@ #cmakedefine SDL_VIDEO_DRIVER_HAIKU @SDL_VIDEO_DRIVER_HAIKU@
#cmakedefine SDL_VIDEO_DRIVER_COCOA @SDL_VIDEO_DRIVER_COCOA@ #cmakedefine SDL_VIDEO_DRIVER_COCOA @SDL_VIDEO_DRIVER_COCOA@
#cmakedefine SDL_VIDEO_DRIVER_UIKIT @SDL_VIDEO_DRIVER_UIKIT@ #cmakedefine SDL_VIDEO_DRIVER_UIKIT @SDL_VIDEO_DRIVER_UIKIT@
@ -353,6 +373,8 @@
#cmakedefine SDL_VIDEO_DRIVER_RPI @SDL_VIDEO_DRIVER_RPI@ #cmakedefine SDL_VIDEO_DRIVER_RPI @SDL_VIDEO_DRIVER_RPI@
#cmakedefine SDL_VIDEO_DRIVER_VIVANTE @SDL_VIDEO_DRIVER_VIVANTE@ #cmakedefine SDL_VIDEO_DRIVER_VIVANTE @SDL_VIDEO_DRIVER_VIVANTE@
#cmakedefine SDL_VIDEO_DRIVER_VIVANTE_VDK @SDL_VIDEO_DRIVER_VIVANTE_VDK@ #cmakedefine SDL_VIDEO_DRIVER_VIVANTE_VDK @SDL_VIDEO_DRIVER_VIVANTE_VDK@
#cmakedefine SDL_VIDEO_DRIVER_OS2 @SDL_VIDEO_DRIVER_OS2@
#cmakedefine SDL_VIDEO_DRIVER_QNX @SDL_VIDEO_DRIVER_QNX@
#cmakedefine SDL_VIDEO_DRIVER_KMSDRM @SDL_VIDEO_DRIVER_KMSDRM@ #cmakedefine SDL_VIDEO_DRIVER_KMSDRM @SDL_VIDEO_DRIVER_KMSDRM@
#cmakedefine SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC @SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC@ #cmakedefine SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC @SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC@
@ -364,7 +386,6 @@
#cmakedefine SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR @SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR@ #cmakedefine SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR @SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR@
#cmakedefine SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON @SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON@ #cmakedefine SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON @SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON@
#cmakedefine SDL_VIDEO_DRIVER_EMSCRIPTEN @SDL_VIDEO_DRIVER_EMSCRIPTEN@
#cmakedefine SDL_VIDEO_DRIVER_X11 @SDL_VIDEO_DRIVER_X11@ #cmakedefine SDL_VIDEO_DRIVER_X11 @SDL_VIDEO_DRIVER_X11@
#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC @SDL_VIDEO_DRIVER_X11_DYNAMIC@ #cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC @SDL_VIDEO_DRIVER_X11_DYNAMIC@
#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT @SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT@ #cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT @SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT@
@ -386,6 +407,7 @@
#cmakedefine SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS @SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS@ #cmakedefine SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS @SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS@
#cmakedefine SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY @SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY@ #cmakedefine SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY @SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY@
#cmakedefine SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM @SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM@ #cmakedefine SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM @SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM@
#cmakedefine SDL_VIDEO_DRIVER_VITA @SDL_VIDEO_DRIVER_VITA@
#cmakedefine SDL_VIDEO_RENDER_D3D @SDL_VIDEO_RENDER_D3D@ #cmakedefine SDL_VIDEO_RENDER_D3D @SDL_VIDEO_RENDER_D3D@
#cmakedefine SDL_VIDEO_RENDER_D3D11 @SDL_VIDEO_RENDER_D3D11@ #cmakedefine SDL_VIDEO_RENDER_D3D11 @SDL_VIDEO_RENDER_D3D11@
@ -394,6 +416,7 @@
#cmakedefine SDL_VIDEO_RENDER_OGL_ES2 @SDL_VIDEO_RENDER_OGL_ES2@ #cmakedefine SDL_VIDEO_RENDER_OGL_ES2 @SDL_VIDEO_RENDER_OGL_ES2@
#cmakedefine SDL_VIDEO_RENDER_DIRECTFB @SDL_VIDEO_RENDER_DIRECTFB@ #cmakedefine SDL_VIDEO_RENDER_DIRECTFB @SDL_VIDEO_RENDER_DIRECTFB@
#cmakedefine SDL_VIDEO_RENDER_METAL @SDL_VIDEO_RENDER_METAL@ #cmakedefine SDL_VIDEO_RENDER_METAL @SDL_VIDEO_RENDER_METAL@
#cmakedefine SDL_VIDEO_RENDER_VITA_GXM @SDL_VIDEO_RENDER_VITA_GXM@
/* Enable OpenGL support */ /* Enable OpenGL support */
#cmakedefine SDL_VIDEO_OPENGL @SDL_VIDEO_OPENGL@ #cmakedefine SDL_VIDEO_OPENGL @SDL_VIDEO_OPENGL@
@ -423,6 +446,7 @@
#cmakedefine SDL_POWER_HAIKU @SDL_POWER_HAIKU@ #cmakedefine SDL_POWER_HAIKU @SDL_POWER_HAIKU@
#cmakedefine SDL_POWER_EMSCRIPTEN @SDL_POWER_EMSCRIPTEN@ #cmakedefine SDL_POWER_EMSCRIPTEN @SDL_POWER_EMSCRIPTEN@
#cmakedefine SDL_POWER_HARDWIRED @SDL_POWER_HARDWIRED@ #cmakedefine SDL_POWER_HARDWIRED @SDL_POWER_HARDWIRED@
#cmakedefine SDL_POWER_VITA @SDL_POWER_VITA@
/* Enable system filesystem support */ /* Enable system filesystem support */
#cmakedefine SDL_FILESYSTEM_ANDROID @SDL_FILESYSTEM_ANDROID@ #cmakedefine SDL_FILESYSTEM_ANDROID @SDL_FILESYSTEM_ANDROID@
@ -432,6 +456,8 @@
#cmakedefine SDL_FILESYSTEM_UNIX @SDL_FILESYSTEM_UNIX@ #cmakedefine SDL_FILESYSTEM_UNIX @SDL_FILESYSTEM_UNIX@
#cmakedefine SDL_FILESYSTEM_WINDOWS @SDL_FILESYSTEM_WINDOWS@ #cmakedefine SDL_FILESYSTEM_WINDOWS @SDL_FILESYSTEM_WINDOWS@
#cmakedefine SDL_FILESYSTEM_EMSCRIPTEN @SDL_FILESYSTEM_EMSCRIPTEN@ #cmakedefine SDL_FILESYSTEM_EMSCRIPTEN @SDL_FILESYSTEM_EMSCRIPTEN@
#cmakedefine SDL_FILESYSTEM_OS2 @SDL_FILESYSTEM_OS2@
#cmakedefine SDL_FILESYSTEM_VITA @SDL_FILESYSTEM_VITA@
/* Enable assembly routines */ /* Enable assembly routines */
#cmakedefine SDL_ASSEMBLY_ROUTINES @SDL_ASSEMBLY_ROUTINES@ #cmakedefine SDL_ASSEMBLY_ROUTINES @SDL_ASSEMBLY_ROUTINES@

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -42,11 +42,12 @@
#undef volatile #undef volatile
/* C datatypes */ /* C datatypes */
#ifdef __LP64__ #if defined(__LP64__) || defined(_LP64) || defined(_WIN64)
#define SIZEOF_VOIDP 8 #define SIZEOF_VOIDP 8
#else #else
#define SIZEOF_VOIDP 4 #define SIZEOF_VOIDP 4
#endif #endif
#undef HAVE_GCC_ATOMICS #undef HAVE_GCC_ATOMICS
#undef HAVE_GCC_SYNC_LOCK_TEST_AND_SET #undef HAVE_GCC_SYNC_LOCK_TEST_AND_SET
@ -99,6 +100,7 @@
#undef HAVE_WCSLEN #undef HAVE_WCSLEN
#undef HAVE_WCSLCPY #undef HAVE_WCSLCPY
#undef HAVE_WCSLCAT #undef HAVE_WCSLCAT
#undef HAVE__WCSDUP
#undef HAVE_WCSDUP #undef HAVE_WCSDUP
#undef HAVE_WCSSTR #undef HAVE_WCSSTR
#undef HAVE_WCSCMP #undef HAVE_WCSCMP
@ -119,7 +121,6 @@
#undef HAVE_STRRCHR #undef HAVE_STRRCHR
#undef HAVE_STRSTR #undef HAVE_STRSTR
#undef HAVE_STRTOK_R #undef HAVE_STRTOK_R
#undef HAVE_STRTOK_S
#undef HAVE_ITOA #undef HAVE_ITOA
#undef HAVE__LTOA #undef HAVE__LTOA
#undef HAVE__UITOA #undef HAVE__UITOA
@ -170,8 +171,12 @@
#undef HAVE_LOGF #undef HAVE_LOGF
#undef HAVE_LOG10 #undef HAVE_LOG10
#undef HAVE_LOG10F #undef HAVE_LOG10F
#undef HAVE_LROUND
#undef HAVE_LROUNDF
#undef HAVE_POW #undef HAVE_POW
#undef HAVE_POWF #undef HAVE_POWF
#undef HAVE_ROUND
#undef HAVE_ROUNDF
#undef HAVE_SCALBN #undef HAVE_SCALBN
#undef HAVE_SCALBNF #undef HAVE_SCALBNF
#undef HAVE_SIN #undef HAVE_SIN
@ -279,6 +284,8 @@
#undef SDL_AUDIO_DRIVER_OSS #undef SDL_AUDIO_DRIVER_OSS
#undef SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H #undef SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H
#undef SDL_AUDIO_DRIVER_PAUDIO #undef SDL_AUDIO_DRIVER_PAUDIO
#undef SDL_AUDIO_DRIVER_PIPEWIRE
#undef SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC
#undef SDL_AUDIO_DRIVER_PULSEAUDIO #undef SDL_AUDIO_DRIVER_PULSEAUDIO
#undef SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC #undef SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC
#undef SDL_AUDIO_DRIVER_QSA #undef SDL_AUDIO_DRIVER_QSA
@ -287,11 +294,13 @@
#undef SDL_AUDIO_DRIVER_SUNAUDIO #undef SDL_AUDIO_DRIVER_SUNAUDIO
#undef SDL_AUDIO_DRIVER_WASAPI #undef SDL_AUDIO_DRIVER_WASAPI
#undef SDL_AUDIO_DRIVER_WINMM #undef SDL_AUDIO_DRIVER_WINMM
#undef SDL_AUDIO_DRIVER_OS2
/* Enable various input drivers */ /* Enable various input drivers */
#undef SDL_INPUT_LINUXEV #undef SDL_INPUT_LINUXEV
#undef SDL_INPUT_FBSDKBIO #undef SDL_INPUT_FBSDKBIO
#undef SDL_INPUT_LINUXKD #undef SDL_INPUT_LINUXKD
#undef SDL_INPUT_WSCONS
#undef SDL_JOYSTICK_HAIKU #undef SDL_JOYSTICK_HAIKU
#undef SDL_JOYSTICK_DINPUT #undef SDL_JOYSTICK_DINPUT
#undef SDL_JOYSTICK_XINPUT #undef SDL_JOYSTICK_XINPUT
@ -301,8 +310,9 @@
#undef SDL_JOYSTICK_LINUX #undef SDL_JOYSTICK_LINUX
#undef SDL_JOYSTICK_ANDROID #undef SDL_JOYSTICK_ANDROID
#undef SDL_JOYSTICK_WINMM #undef SDL_JOYSTICK_WINMM
#undef SDL_JOYSTICK_OS2
#undef SDL_JOYSTICK_USBHID #undef SDL_JOYSTICK_USBHID
#undef SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H #undef SDL_HAVE_MACHINE_JOYSTICK_H
#undef SDL_JOYSTICK_HIDAPI #undef SDL_JOYSTICK_HIDAPI
#undef SDL_JOYSTICK_RAWINPUT #undef SDL_JOYSTICK_RAWINPUT
#undef SDL_JOYSTICK_EMSCRIPTEN #undef SDL_JOYSTICK_EMSCRIPTEN
@ -325,18 +335,22 @@
#undef SDL_LOADSO_DUMMY #undef SDL_LOADSO_DUMMY
#undef SDL_LOADSO_LDG #undef SDL_LOADSO_LDG
#undef SDL_LOADSO_WINDOWS #undef SDL_LOADSO_WINDOWS
#undef SDL_LOADSO_OS2
/* Enable various threading systems */ /* Enable various threading systems */
#undef SDL_THREAD_GENERIC_COND_SUFFIX
#undef SDL_THREAD_PTHREAD #undef SDL_THREAD_PTHREAD
#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX
#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP
#undef SDL_THREAD_WINDOWS #undef SDL_THREAD_WINDOWS
#undef SDL_THREAD_OS2
/* Enable various timer systems */ /* Enable various timer systems */
#undef SDL_TIMER_HAIKU #undef SDL_TIMER_HAIKU
#undef SDL_TIMER_DUMMY #undef SDL_TIMER_DUMMY
#undef SDL_TIMER_UNIX #undef SDL_TIMER_UNIX
#undef SDL_TIMER_WINDOWS #undef SDL_TIMER_WINDOWS
#undef SDL_TIMER_OS2
/* Enable various video drivers */ /* Enable various video drivers */
#undef SDL_VIDEO_DRIVER_HAIKU #undef SDL_VIDEO_DRIVER_HAIKU
@ -381,6 +395,7 @@
#undef SDL_VIDEO_DRIVER_NACL #undef SDL_VIDEO_DRIVER_NACL
#undef SDL_VIDEO_DRIVER_VIVANTE #undef SDL_VIDEO_DRIVER_VIVANTE
#undef SDL_VIDEO_DRIVER_VIVANTE_VDK #undef SDL_VIDEO_DRIVER_VIVANTE_VDK
#undef SDL_VIDEO_DRIVER_OS2
#undef SDL_VIDEO_DRIVER_QNX #undef SDL_VIDEO_DRIVER_QNX
#undef SDL_VIDEO_RENDER_D3D #undef SDL_VIDEO_RENDER_D3D
@ -427,6 +442,7 @@
#undef SDL_FILESYSTEM_NACL #undef SDL_FILESYSTEM_NACL
#undef SDL_FILESYSTEM_ANDROID #undef SDL_FILESYSTEM_ANDROID
#undef SDL_FILESYSTEM_EMSCRIPTEN #undef SDL_FILESYSTEM_EMSCRIPTEN
#undef SDL_FILESYSTEM_OS2
/* Enable assembly routines */ /* Enable assembly routines */
#undef SDL_ASSEMBLY_ROUTINES #undef SDL_ASSEMBLY_ROUTINES

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -111,8 +111,12 @@
#define HAVE_LOGF 1 #define HAVE_LOGF 1
#define HAVE_LOG10 1 #define HAVE_LOG10 1
#define HAVE_LOG10F 1 #define HAVE_LOG10F 1
#define HAVE_LROUND 1
#define HAVE_LROUNDF 1
#define HAVE_POW 1 #define HAVE_POW 1
#define HAVE_POWF 1 #define HAVE_POWF 1
#define HAVE_ROUND 1
#define HAVE_ROUNDF 1
#define HAVE_SCALBN 1 #define HAVE_SCALBN 1
#define HAVE_SCALBNF 1 #define HAVE_SCALBNF 1
#define HAVE_SIN 1 #define HAVE_SIN 1
@ -129,11 +133,16 @@
#define HAVE_SYSCONF 1 #define HAVE_SYSCONF 1
#define HAVE_CLOCK_GETTIME 1 #define HAVE_CLOCK_GETTIME 1
#ifdef __LP64__
#define SIZEOF_VOIDP 8
#else
#define SIZEOF_VOIDP 4 #define SIZEOF_VOIDP 4
#endif
/* Enable various audio drivers */ /* Enable various audio drivers */
#define SDL_AUDIO_DRIVER_ANDROID 1 #define SDL_AUDIO_DRIVER_ANDROID 1
#define SDL_AUDIO_DRIVER_OPENSLES 1 #define SDL_AUDIO_DRIVER_OPENSLES 1
#define SDL_AUDIO_DRIVER_AAUDIO 0
#define SDL_AUDIO_DRIVER_DUMMY 1 #define SDL_AUDIO_DRIVER_DUMMY 1
/* Enable various input drivers */ /* Enable various input drivers */

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -112,8 +112,12 @@
#define HAVE_LOGF 1 #define HAVE_LOGF 1
#define HAVE_LOG10 1 #define HAVE_LOG10 1
#define HAVE_LOG10F 1 #define HAVE_LOG10F 1
#define HAVE_LROUND 1
#define HAVE_LROUNDF 1
#define HAVE_POW 1 #define HAVE_POW 1
#define HAVE_POWF 1 #define HAVE_POWF 1
#define HAVE_ROUND 1
#define HAVE_ROUNDF 1
#define HAVE_SCALBN 1 #define HAVE_SCALBN 1
#define HAVE_SCALBNF 1 #define HAVE_SCALBNF 1
#define HAVE_SIN 1 #define HAVE_SIN 1
@ -166,10 +170,12 @@
#define SDL_VIDEO_DRIVER_DUMMY 1 #define SDL_VIDEO_DRIVER_DUMMY 1
/* Enable OpenGL ES */ /* Enable OpenGL ES */
#if !TARGET_OS_MACCATALYST
#define SDL_VIDEO_OPENGL_ES2 1 #define SDL_VIDEO_OPENGL_ES2 1
#define SDL_VIDEO_OPENGL_ES 1 #define SDL_VIDEO_OPENGL_ES 1
#define SDL_VIDEO_RENDER_OGL_ES 1 #define SDL_VIDEO_RENDER_OGL_ES 1
#define SDL_VIDEO_RENDER_OGL_ES2 1 #define SDL_VIDEO_RENDER_OGL_ES2 1
#endif
/* Metal supported on 64-bit devices running iOS 8.0 and tvOS 9.0 and newer /* Metal supported on 64-bit devices running iOS 8.0 and tvOS 9.0 and newer
Also supported in simulator from iOS 13.0 and tvOS 13.0 Also supported in simulator from iOS 13.0 and tvOS 13.0

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -115,8 +115,12 @@
#define HAVE_LOGF 1 #define HAVE_LOGF 1
#define HAVE_LOG10 1 #define HAVE_LOG10 1
#define HAVE_LOG10F 1 #define HAVE_LOG10F 1
#define HAVE_LROUND 1
#define HAVE_LROUNDF 1
#define HAVE_POW 1 #define HAVE_POW 1
#define HAVE_POWF 1 #define HAVE_POWF 1
#define HAVE_ROUND 1
#define HAVE_ROUNDF 1
#define HAVE_SCALBN 1 #define HAVE_SCALBN 1
#define HAVE_SCALBNF 1 #define HAVE_SCALBNF 1
#define HAVE_SIN 1 #define HAVE_SIN 1

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -25,13 +25,16 @@
#include "SDL_platform.h" #include "SDL_platform.h"
#define SIZEOF_VOIDP 4
#define SDL_AUDIO_DRIVER_DUMMY 1 #define SDL_AUDIO_DRIVER_DUMMY 1
#define SDL_AUDIO_DRIVER_DISK 1 #define SDL_AUDIO_DRIVER_DISK 1
#define SDL_AUDIO_DRIVER_OS2 1 #define SDL_AUDIO_DRIVER_OS2 1
#define SDL_POWER_DISABLED 1 #define SDL_POWER_DISABLED 1
#define SDL_JOYSTICK_DISABLED 1
#define SDL_HAPTIC_DISABLED 1 #define SDL_HAPTIC_DISABLED 1
#define SDL_JOYSTICK_DISABLED 1
/*#undef SDL_JOYSTICK_OS2 */
/*#undef SDL_JOYSTICK_HIDAPI */ /*#undef SDL_JOYSTICK_HIDAPI */
/*#undef SDL_JOYSTICK_VIRTUAL */ /*#undef SDL_JOYSTICK_VIRTUAL */
@ -42,9 +45,6 @@
/* Enable OpenGL support */ /* Enable OpenGL support */
/* #undef SDL_VIDEO_OPENGL */ /* #undef SDL_VIDEO_OPENGL */
/* Enable Vulkan support */
/* #undef SDL_VIDEO_VULKAN */
#define SDL_THREAD_OS2 1 #define SDL_THREAD_OS2 1
#define SDL_LOADSO_OS2 1 #define SDL_LOADSO_OS2 1
#define SDL_TIMER_OS2 1 #define SDL_TIMER_OS2 1
@ -105,14 +105,22 @@
#define HAVE_WCSCMP 1 #define HAVE_WCSCMP 1
#define HAVE__WCSICMP 1 #define HAVE__WCSICMP 1
#define HAVE__WCSNICMP 1 #define HAVE__WCSNICMP 1
#define HAVE_WCSLEN 1
#define HAVE_WCSLCPY 1
#define HAVE_WCSLCAT 1
/* #undef HAVE_WCSDUP */
#define HAVE__WCSDUP 1
#define HAVE_WCSSTR 1
#define HAVE_WCSCMP 1
#define HAVE_WCSNCMP 1
#define HAVE_STRLEN 1 #define HAVE_STRLEN 1
#define HAVE_STRLCPY 1 #define HAVE_STRLCPY 1
#define HAVE_STRLCAT 1 #define HAVE_STRLCAT 1
#define HAVE__STRREV 1 #define HAVE__STRREV 1
#define HAVE__STRUPR 1 #define HAVE__STRUPR 1
#define HAVE__STRLWR 1 #define HAVE__STRLWR 1
#define HAVE_INDEX 1 /* #undef HAVE_INDEX */
#define HAVE_RINDEX 1 /* #undef HAVE_RINDEX */
#define HAVE_STRCHR 1 #define HAVE_STRCHR 1
#define HAVE_STRRCHR 1 #define HAVE_STRRCHR 1
#define HAVE_STRSTR 1 #define HAVE_STRSTR 1
@ -129,14 +137,6 @@
#define HAVE_STRTOD 1 #define HAVE_STRTOD 1
#define HAVE_ATOI 1 #define HAVE_ATOI 1
#define HAVE_ATOF 1 #define HAVE_ATOF 1
#define HAVE_WCSLEN 1
#define HAVE_WCSLCPY 1
#define HAVE_WCSLCAT 1
/* #define HAVE_WCSDUP 1 */
/* #define wcsdup _wcsdup */
#define HAVE_WCSSTR 1
#define HAVE_WCSCMP 1
#define HAVE_WCSNCMP 1
#define HAVE_STRCMP 1 #define HAVE_STRCMP 1
#define HAVE_STRNCMP 1 #define HAVE_STRNCMP 1
#define HAVE_STRICMP 1 #define HAVE_STRICMP 1
@ -184,5 +184,9 @@
/* #undef HAVE_TANF */ /* #undef HAVE_TANF */
/* #undef HAVE_TRUNC */ /* #undef HAVE_TRUNC */
/* #undef HAVE_TRUNCF */ /* #undef HAVE_TRUNCF */
/* #undef HAVE_LROUND */
/* #undef HAVE_LROUNDF */
/* #undef HAVE_ROUND */
/* #undef HAVE_ROUNDF */
#endif /* SDL_config_os2_h_ */ #endif /* SDL_config_os2_h_ */

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -95,6 +95,10 @@
#define HAVE_FLOOR 1 #define HAVE_FLOOR 1
#define HAVE_LOG 1 #define HAVE_LOG 1
#define HAVE_LOG10 1 #define HAVE_LOG10 1
#define HAVE_LROUND 1
#define HAVE_LROUNDF 1
#define HAVE_ROUND 1
#define HAVE_ROUNDF 1
#define HAVE_SCALBN 1 #define HAVE_SCALBN 1
#define HAVE_SIN 1 #define HAVE_SIN 1
#define HAVE_SINF 1 #define HAVE_SINF 1

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -28,7 +28,7 @@
/* This is a set of defines to configure the SDL features */ /* This is a set of defines to configure the SDL features */
#if !defined(_STDINT_H_) && (!defined(HAVE_STDINT_H) || !_HAVE_STDINT_H) #if !defined(_STDINT_H_) && (!defined(HAVE_STDINT_H) || !_HAVE_STDINT_H)
#if defined(__GNUC__) || defined(__DMC__) || defined(__WATCOMC__) #if defined(__GNUC__) || defined(__DMC__) || defined(__WATCOMC__) || defined(__clang__)
#define HAVE_STDINT_H 1 #define HAVE_STDINT_H 1
#elif defined(_MSC_VER) #elif defined(_MSC_VER)
typedef signed __int8 int8_t; typedef signed __int8 int8_t;
@ -119,9 +119,6 @@ typedef unsigned int uintptr_t;
#define HAVE_STRRCHR 1 #define HAVE_STRRCHR 1
#define HAVE_STRSTR 1 #define HAVE_STRSTR 1
/* #undef HAVE_STRTOK_R */ /* #undef HAVE_STRTOK_R */
#if defined(_MSC_VER)
#define HAVE_STRTOK_S 1
#endif
/* These functions have security warnings, so we won't use them */ /* These functions have security warnings, so we won't use them */
/* #undef HAVE__LTOA */ /* #undef HAVE__LTOA */
/* #undef HAVE__ULTOA */ /* #undef HAVE__ULTOA */
@ -136,6 +133,7 @@ typedef unsigned int uintptr_t;
#define HAVE__STRNICMP 1 #define HAVE__STRNICMP 1
#define HAVE__WCSICMP 1 #define HAVE__WCSICMP 1
#define HAVE__WCSNICMP 1 #define HAVE__WCSNICMP 1
#define HAVE__WCSDUP 1
#define HAVE_ACOS 1 #define HAVE_ACOS 1
#define HAVE_ACOSF 1 #define HAVE_ACOSF 1
#define HAVE_ASIN 1 #define HAVE_ASIN 1
@ -172,7 +170,12 @@ typedef unsigned int uintptr_t;
/* These functions were added with the VC++ 2013 C runtime library */ /* These functions were added with the VC++ 2013 C runtime library */
#if _MSC_VER >= 1800 #if _MSC_VER >= 1800
#define HAVE_STRTOLL 1 #define HAVE_STRTOLL 1
#define HAVE_STRTOULL 1
#define HAVE_VSSCANF 1 #define HAVE_VSSCANF 1
#define HAVE_LROUND 1
#define HAVE_LROUNDF 1
#define HAVE_ROUND 1
#define HAVE_ROUNDF 1
#define HAVE_SCALBN 1 #define HAVE_SCALBN 1
#define HAVE_SCALBNF 1 #define HAVE_SCALBNF 1
#define HAVE_TRUNC 1 #define HAVE_TRUNC 1
@ -233,6 +236,7 @@ typedef unsigned int uintptr_t;
#define SDL_LOADSO_WINDOWS 1 #define SDL_LOADSO_WINDOWS 1
/* Enable various threading systems */ /* Enable various threading systems */
#define SDL_THREAD_GENERIC_COND_SUFFIX 1
#define SDL_THREAD_WINDOWS 1 #define SDL_THREAD_WINDOWS 1
/* Enable various timer systems */ /* Enable various timer systems */

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -126,17 +126,13 @@ typedef unsigned int uintptr_t;
#define HAVE_STRLEN 1 #define HAVE_STRLEN 1
#define HAVE__STRREV 1 #define HAVE__STRREV 1
#define HAVE__STRUPR 1 #define HAVE__STRUPR 1
//#define HAVE__STRLWR 1 // TODO, WinRT: consider using _strlwr_s instead
#define HAVE_STRCHR 1 #define HAVE_STRCHR 1
#define HAVE_STRRCHR 1 #define HAVE_STRRCHR 1
#define HAVE_STRSTR 1 #define HAVE_STRSTR 1
#define HAVE_STRTOK_S 1
//#define HAVE_ITOA 1 // TODO, WinRT: consider using _itoa_s instead
//#define HAVE__LTOA 1 // TODO, WinRT: consider using _ltoa_s instead
//#define HAVE__ULTOA 1 // TODO, WinRT: consider using _ultoa_s instead
#define HAVE_STRTOL 1 #define HAVE_STRTOL 1
#define HAVE_STRTOUL 1 #define HAVE_STRTOUL 1
//#define HAVE_STRTOLL 1 /* #undef HAVE_STRTOLL */
/* #undef HAVE_STRTOULL */
#define HAVE_STRTOD 1 #define HAVE_STRTOD 1
#define HAVE_ATOI 1 #define HAVE_ATOI 1
#define HAVE_ATOF 1 #define HAVE_ATOF 1
@ -145,7 +141,12 @@ typedef unsigned int uintptr_t;
#define HAVE__STRICMP 1 #define HAVE__STRICMP 1
#define HAVE__STRNICMP 1 #define HAVE__STRNICMP 1
#define HAVE_VSNPRINTF 1 #define HAVE_VSNPRINTF 1
//#define HAVE_SSCANF 1 // TODO, WinRT: consider using sscanf_s instead /* TODO, WinRT: consider using ??_s versions of the following */
/* #undef HAVE__STRLWR */
/* #undef HAVE_ITOA */
/* #undef HAVE__LTOA */
/* #undef HAVE__ULTOA */
/* #undef HAVE_SSCANF */
#define HAVE_M_PI 1 #define HAVE_M_PI 1
#define HAVE_ACOS 1 #define HAVE_ACOS 1
#define HAVE_ACOSF 1 #define HAVE_ACOSF 1
@ -172,8 +173,12 @@ typedef unsigned int uintptr_t;
#define HAVE_LOGF 1 #define HAVE_LOGF 1
#define HAVE_LOG10 1 #define HAVE_LOG10 1
#define HAVE_LOG10F 1 #define HAVE_LOG10F 1
#define HAVE_LROUND 1
#define HAVE_LROUNDF 1
#define HAVE_POW 1 #define HAVE_POW 1
#define HAVE_POWF 1 #define HAVE_POWF 1
#define HAVE_ROUND 1
#define HAVE_ROUNDF 1
#define HAVE__SCALB 1 #define HAVE__SCALB 1
#define HAVE_SIN 1 #define HAVE_SIN 1
#define HAVE_SINF 1 #define HAVE_SINF 1
@ -208,6 +213,7 @@ typedef unsigned int uintptr_t;
/* Enable various threading systems */ /* Enable various threading systems */
#if (NTDDI_VERSION >= NTDDI_WINBLUE) #if (NTDDI_VERSION >= NTDDI_WINBLUE)
#define SDL_THREAD_GENERIC_COND_SUFFIX 1
#define SDL_THREAD_WINDOWS 1 #define SDL_THREAD_WINDOWS 1
#else #else
/* WinRT on Windows 8.0 and Windows Phone 8.0 don't support CreateThread() */ /* WinRT on Windows 8.0 and Windows Phone 8.0 don't support CreateThread() */

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -107,8 +107,12 @@
#define HAVE_LOGF 1 #define HAVE_LOGF 1
#define HAVE_LOG10 1 #define HAVE_LOG10 1
#define HAVE_LOG10F 1 #define HAVE_LOG10F 1
#define HAVE_LROUND 1
#define HAVE_LROUNDF 1
#define HAVE_POW 1 #define HAVE_POW 1
#define HAVE_POWF 1 #define HAVE_POWF 1
#define HAVE_ROUND 1
#define HAVE_ROUNDF 1
#define HAVE_SCALBN 1 #define HAVE_SCALBN 1
#define HAVE_SCALBNF 1 #define HAVE_SCALBNF 1
#define HAVE_SIN 1 #define HAVE_SIN 1

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -34,11 +34,20 @@
/* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */ /* 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)) #if defined(_MSC_VER) && (_MSC_VER >= 1500) && (defined(_M_IX86) || defined(_M_X64))
#ifdef __clang__ #ifdef __clang__
/* Many of the intrinsics SDL uses are not implemented by clang with Visual Studio */ /* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version,
#undef __MMX__ so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */
#undef __SSE__
#undef __SSE2__ #ifndef __PRFCHWINTRIN_H
#else #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 <intrin.h> #include <intrin.h>
#ifndef _WIN64 #ifndef _WIN64
#ifndef __MMX__ #ifndef __MMX__
@ -54,9 +63,11 @@
#ifndef __SSE2__ #ifndef __SSE2__
#define __SSE2__ #define __SSE2__
#endif #endif
#endif /* __clang__ */
#elif defined(__MINGW64_VERSION_MAJOR) #elif defined(__MINGW64_VERSION_MAJOR)
#include <intrin.h> #include <intrin.h>
#if !defined(SDL_DISABLE_ARM_NEON_H) && defined(__ARM_NEON)
# include <arm_neon.h>
#endif
#else #else
/* altivec.h redefining bool causes a number of problems, see bugs 3993 and 4392, so you need to explicitly define SDL_ENABLE_ALTIVEC_H to have it included. */ /* altivec.h redefining bool causes a number of problems, see bugs 3993 and 4392, so you need to explicitly define SDL_ENABLE_ALTIVEC_H to have it included. */
#if defined(HAVE_ALTIVEC_H) && defined(__ALTIVEC__) && !defined(__APPLE_ALTIVEC__) && defined(SDL_ENABLE_ALTIVEC_H) #if defined(HAVE_ALTIVEC_H) && defined(__ALTIVEC__) && !defined(__APPLE_ALTIVEC__) && defined(SDL_ENABLE_ALTIVEC_H)
@ -79,6 +90,8 @@
# endif # endif
# endif # endif
#endif #endif
#endif /* compiler version */
#if defined(__3dNOW__) && !defined(SDL_DISABLE_MM3DNOW_H) #if defined(__3dNOW__) && !defined(SDL_DISABLE_MM3DNOW_H)
#include <mm3dnow.h> #include <mm3dnow.h>
#endif #endif
@ -98,7 +111,6 @@
#include <pmmintrin.h> #include <pmmintrin.h>
#endif #endif
#endif /* HAVE_IMMINTRIN_H */ #endif /* HAVE_IMMINTRIN_H */
#endif /* compiler version */
#include "begin_code.h" #include "begin_code.h"
/* Set up for C function definitions, even when using C++ */ /* Set up for C function definitions, even when using C++ */
@ -114,95 +126,296 @@ extern "C" {
#define SDL_CACHELINE_SIZE 128 #define SDL_CACHELINE_SIZE 128
/** /**
* This function returns the number of CPU cores available. * 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 2.0.0.
*/ */
extern DECLSPEC int SDLCALL SDL_GetCPUCount(void); extern DECLSPEC int SDLCALL SDL_GetCPUCount(void);
/** /**
* This function returns the L1 cache line size of the CPU * Determine the L1 cache line size of the CPU.
* *
* This is useful for determining multi-threaded structure padding * This is useful for determining multi-threaded structure padding or SIMD
* or SIMD prefetch sizes. * prefetch sizes.
*
* \returns the L1 cache line size of the CPU, in bytes.
*
* \since This function is available since SDL 2.0.0.
*/ */
extern DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void); extern DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void);
/** /**
* This function returns true if the CPU has the RDTSC instruction. * Determine whether the CPU has the RDTSC instruction.
*
* This always returns false on CPUs that aren't using Intel instruction sets.
*
* \returns SDL_TRUE if the CPU has the RDTSC instruction or SDL_FALSE if not.
*
* \sa SDL_Has3DNow
* \sa SDL_HasAltiVec
* \sa SDL_HasAVX
* \sa SDL_HasAVX2
* \sa SDL_HasMMX
* \sa SDL_HasSSE
* \sa SDL_HasSSE2
* \sa SDL_HasSSE3
* \sa SDL_HasSSE41
* \sa SDL_HasSSE42
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void);
/** /**
* This function returns true if the CPU has AltiVec features. * 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.
*
* \sa SDL_Has3DNow
* \sa SDL_HasAVX
* \sa SDL_HasAVX2
* \sa SDL_HasMMX
* \sa SDL_HasRDTSC
* \sa SDL_HasSSE
* \sa SDL_HasSSE2
* \sa SDL_HasSSE3
* \sa SDL_HasSSE41
* \sa SDL_HasSSE42
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void);
/** /**
* This function returns true if the CPU has MMX features. * 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.
*
* \sa SDL_Has3DNow
* \sa SDL_HasAltiVec
* \sa SDL_HasAVX
* \sa SDL_HasAVX2
* \sa SDL_HasRDTSC
* \sa SDL_HasSSE
* \sa SDL_HasSSE2
* \sa SDL_HasSSE3
* \sa SDL_HasSSE41
* \sa SDL_HasSSE42
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void);
/** /**
* This function returns true if the CPU has 3DNow! features. * Determine whether the CPU has 3DNow! features.
*
* This always returns false on CPUs that aren't using AMD instruction sets.
*
* \returns SDL_TRUE if the CPU has 3DNow! features or SDL_FALSE if not.
*
* \sa SDL_HasAltiVec
* \sa SDL_HasAVX
* \sa SDL_HasAVX2
* \sa SDL_HasMMX
* \sa SDL_HasRDTSC
* \sa SDL_HasSSE
* \sa SDL_HasSSE2
* \sa SDL_HasSSE3
* \sa SDL_HasSSE41
* \sa SDL_HasSSE42
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void); extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void);
/** /**
* This function returns true if the CPU has SSE features. * 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.
*
* \sa SDL_Has3DNow
* \sa SDL_HasAltiVec
* \sa SDL_HasAVX
* \sa SDL_HasAVX2
* \sa SDL_HasMMX
* \sa SDL_HasRDTSC
* \sa SDL_HasSSE2
* \sa SDL_HasSSE3
* \sa SDL_HasSSE41
* \sa SDL_HasSSE42
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void);
/** /**
* This function returns true if the CPU has SSE2 features. * 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.
*
* \sa SDL_Has3DNow
* \sa SDL_HasAltiVec
* \sa SDL_HasAVX
* \sa SDL_HasAVX2
* \sa SDL_HasMMX
* \sa SDL_HasRDTSC
* \sa SDL_HasSSE
* \sa SDL_HasSSE3
* \sa SDL_HasSSE41
* \sa SDL_HasSSE42
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void);
/** /**
* This function returns true if the CPU has SSE3 features. * 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.
*
* \sa SDL_Has3DNow
* \sa SDL_HasAltiVec
* \sa SDL_HasAVX
* \sa SDL_HasAVX2
* \sa SDL_HasMMX
* \sa SDL_HasRDTSC
* \sa SDL_HasSSE
* \sa SDL_HasSSE2
* \sa SDL_HasSSE41
* \sa SDL_HasSSE42
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE3(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE3(void);
/** /**
* This function returns true if the CPU has SSE4.1 features. * 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.
*
* \sa SDL_Has3DNow
* \sa SDL_HasAltiVec
* \sa SDL_HasAVX
* \sa SDL_HasAVX2
* \sa SDL_HasMMX
* \sa SDL_HasRDTSC
* \sa SDL_HasSSE
* \sa SDL_HasSSE2
* \sa SDL_HasSSE3
* \sa SDL_HasSSE42
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE41(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE41(void);
/** /**
* This function returns true if the CPU has SSE4.2 features. * 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.
*
* \sa SDL_Has3DNow
* \sa SDL_HasAltiVec
* \sa SDL_HasAVX
* \sa SDL_HasAVX2
* \sa SDL_HasMMX
* \sa SDL_HasRDTSC
* \sa SDL_HasSSE
* \sa SDL_HasSSE2
* \sa SDL_HasSSE3
* \sa SDL_HasSSE41
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void);
/** /**
* This function returns true if the CPU has AVX features. * 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 2.0.2.
*
* \sa SDL_Has3DNow
* \sa SDL_HasAltiVec
* \sa SDL_HasAVX2
* \sa SDL_HasMMX
* \sa SDL_HasRDTSC
* \sa SDL_HasSSE
* \sa SDL_HasSSE2
* \sa SDL_HasSSE3
* \sa SDL_HasSSE41
* \sa SDL_HasSSE42
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX(void);
/** /**
* This function returns true if the CPU has AVX2 features. * 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 2.0.4.
*
* \sa SDL_Has3DNow
* \sa SDL_HasAltiVec
* \sa SDL_HasAVX
* \sa SDL_HasMMX
* \sa SDL_HasRDTSC
* \sa SDL_HasSSE
* \sa SDL_HasSSE2
* \sa SDL_HasSSE3
* \sa SDL_HasSSE41
* \sa SDL_HasSSE42
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX2(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX2(void);
/** /**
* This function returns true if the CPU has AVX-512F (foundation) features. * 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.
*
* \sa SDL_HasAVX
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX512F(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX512F(void);
/** /**
* This function returns true if the CPU has ARM SIMD (ARMv6) features. * 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.
*
* \sa SDL_HasNEON
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasARMSIMD(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasARMSIMD(void);
/** /**
* This function returns true if the CPU has NEON (ARM SIMD) features. * 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.
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasNEON(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasNEON(void);
/** /**
* This function returns the amount of RAM configured in the system, in MB. * Get the amount of RAM configured in the system.
*
* \returns the amount of RAM configured in the system in MB.
*
* \since This function is available since SDL 2.0.1.
*/ */
extern DECLSPEC int SDLCALL SDL_GetSystemRAM(void); extern DECLSPEC int SDLCALL SDL_GetSystemRAM(void);
/** /**
* \brief Report the alignment this system needs for SIMD allocations. * Report the alignment this system needs for SIMD allocations.
* *
* This will return the minimum number of bytes to which a pointer must be * 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. * aligned to be compatible with SIMD instructions on the current machine.
@ -212,11 +425,13 @@ extern DECLSPEC int SDLCALL SDL_GetSystemRAM(void);
* SDL_HasAVX512F(), then it might return 16 for the SSE support it sees and * 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. * not 64 for the AVX-512 instructions that exist but SDL doesn't know about.
* Plan accordingly. * Plan accordingly.
*
* \returns Alignment in bytes needed for available, known SIMD instructions.
*/ */
extern DECLSPEC size_t SDLCALL SDL_SIMDGetAlignment(void); extern DECLSPEC size_t SDLCALL SDL_SIMDGetAlignment(void);
/** /**
* \brief Allocate memory in a SIMD-friendly way. * Allocate memory in a SIMD-friendly way.
* *
* This will allocate a block of memory that is suitable for use with SIMD * This will allocate a block of memory that is suitable for use with SIMD
* instructions. Specifically, it will be properly aligned and padded for * instructions. Specifically, it will be properly aligned and padded for
@ -239,11 +454,12 @@ extern DECLSPEC size_t SDLCALL SDL_SIMDGetAlignment(void);
* set with memory allocated through here. * set with memory allocated through here.
* *
* SDL_AllocSIMD(0) will return a non-NULL pointer, assuming the system isn't * SDL_AllocSIMD(0) will return a non-NULL pointer, assuming the system isn't
* out of memory. * out of memory, but you are not allowed to dereference it (because you only
* own zero bytes of that buffer).
* *
* \param len The length, in bytes, of the block to allocated. The actual * \param len The length, in bytes, of the block to allocate. The actual
* allocated block might be larger due to padding, etc. * allocated block might be larger due to padding, etc.
* \return Pointer to newly-allocated block, NULL if out of memory. * \returns Pointer to newly-allocated block, NULL if out of memory.
* *
* \sa SDL_SIMDAlignment * \sa SDL_SIMDAlignment
* \sa SDL_SIMDRealloc * \sa SDL_SIMDRealloc
@ -252,7 +468,7 @@ extern DECLSPEC size_t SDLCALL SDL_SIMDGetAlignment(void);
extern DECLSPEC void * SDLCALL SDL_SIMDAlloc(const size_t len); extern DECLSPEC void * SDLCALL SDL_SIMDAlloc(const size_t len);
/** /**
* \brief Reallocate memory obtained from SDL_SIMDAlloc * Reallocate memory obtained from SDL_SIMDAlloc
* *
* It is not valid to use this function on a pointer from anything but * It is not valid to use this function on a pointer from anything but
* SDL_SIMDAlloc(). It can't be used on pointers from malloc, realloc, * SDL_SIMDAlloc(). It can't be used on pointers from malloc, realloc,
@ -260,12 +476,12 @@ extern DECLSPEC void * SDLCALL SDL_SIMDAlloc(const size_t len);
* *
* \param mem The pointer obtained from SDL_SIMDAlloc. This function also * \param mem The pointer obtained from SDL_SIMDAlloc. This function also
* accepts NULL, at which point this function is the same as * accepts NULL, at which point this function is the same as
* calling SDL_realloc with a NULL pointer. * calling SDL_SIMDAlloc with a NULL pointer.
* \param len The length, in bytes, of the block to allocated. The actual * \param len The length, in bytes, of the block to allocated. The actual
* allocated block might be larger due to padding, etc. Passing 0 * allocated block might be larger due to padding, etc. Passing 0
* will return a non-NULL pointer, assuming the system isn't out of * will return a non-NULL pointer, assuming the system isn't out of
* memory. * memory.
* \return Pointer to newly-reallocated block, NULL if out of memory. * \returns Pointer to newly-reallocated block, NULL if out of memory.
* *
* \sa SDL_SIMDAlignment * \sa SDL_SIMDAlignment
* \sa SDL_SIMDAlloc * \sa SDL_SIMDAlloc
@ -274,20 +490,27 @@ extern DECLSPEC void * SDLCALL SDL_SIMDAlloc(const size_t len);
extern DECLSPEC void * SDLCALL SDL_SIMDRealloc(void *mem, const size_t len); extern DECLSPEC void * SDLCALL SDL_SIMDRealloc(void *mem, const size_t len);
/** /**
* \brief Deallocate memory obtained from SDL_SIMDAlloc * Deallocate memory obtained from SDL_SIMDAlloc
* *
* It is not valid to use this function on a pointer from anything but * It is not valid to use this function on a pointer from anything but
* SDL_SIMDAlloc(). It can't be used on pointers from malloc, realloc, * SDL_SIMDAlloc() or SDL_SIMDRealloc(). It can't be used on pointers from
* SDL_malloc, memalign, new[], etc. * malloc, realloc, SDL_malloc, memalign, new[], etc.
* *
* However, SDL_SIMDFree(NULL) is a legal no-op. * However, SDL_SIMDFree(NULL) is a legal no-op.
* *
* The memory pointed to by `ptr` is no longer valid for access upon return,
* and may be returned to the system or reused by a future allocation.
* The pointer passed to this function is no longer safe to dereference once
* this function returns, and should be discarded.
*
* \param ptr The pointer, returned from SDL_SIMDAlloc or SDL_SIMDRealloc,
* to deallocate. NULL is a legal no-op.
*
* \sa SDL_SIMDAlloc * \sa SDL_SIMDAlloc
* \sa SDL_SIMDRealloc * \sa SDL_SIMDRealloc
*/ */
extern DECLSPEC void SDLCALL SDL_SIMDFree(void *ptr); extern DECLSPEC void SDLCALL SDL_SIMDFree(void *ptr);
/* vi: set ts=4 sw=4 expandtab: */
/* Ends C function definitions when using C++ */ /* Ends C function definitions when using C++ */
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -30,6 +30,26 @@
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#ifdef _MSC_VER
/* 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 <intrin.h>
#endif
/** /**
* \name The two types of endianness * \name The two types of endianness
*/ */
@ -45,6 +65,9 @@
#elif defined(__OpenBSD__) #elif defined(__OpenBSD__)
#include <endian.h> #include <endian.h>
#define SDL_BYTEORDER BYTE_ORDER #define SDL_BYTEORDER BYTE_ORDER
#elif defined(__FreeBSD__)
#include <sys/endian.h>
#define SDL_BYTEORDER BYTE_ORDER
#else #else
#if defined(__hppa__) || \ #if defined(__hppa__) || \
defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
@ -68,8 +91,11 @@ extern "C" {
/** /**
* \file SDL_endian.h * \file SDL_endian.h
*/ */
#if defined(__GNUC__) && defined(__i386__) && \ #if (defined(__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 2))) || \
!(__GNUC__ == 2 && __GNUC_MINOR__ == 95 /* broken gcc version */) (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))
#define SDL_Swap16(x) __builtin_bswap16(x)
#elif defined(__GNUC__) && defined(__i386__) && \
!(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
SDL_FORCE_INLINE Uint16 SDL_FORCE_INLINE Uint16
SDL_Swap16(Uint16 x) SDL_Swap16(Uint16 x)
{ {
@ -92,13 +118,23 @@ SDL_Swap16(Uint16 x)
__asm__("rlwimi %0,%2,8,16,23": "=&r"(result):"0"(x >> 8), "r"(x)); __asm__("rlwimi %0,%2,8,16,23": "=&r"(result):"0"(x >> 8), "r"(x));
return (Uint16)result; return (Uint16)result;
} }
#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) && !defined(__mcoldfire__) #elif defined(__GNUC__) && defined(__aarch64__)
SDL_FORCE_INLINE Uint16
SDL_Swap16(Uint16 x)
{
__asm__("rev16 %w1, %w0" : "=r"(x) : "r"(x));
return x;
}
#elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__))
SDL_FORCE_INLINE Uint16 SDL_FORCE_INLINE Uint16
SDL_Swap16(Uint16 x) SDL_Swap16(Uint16 x)
{ {
__asm__("rorw #8,%0": "=d"(x): "0"(x):"cc"); __asm__("rorw #8,%0": "=d"(x): "0"(x):"cc");
return x; return x;
} }
#elif defined(_MSC_VER)
#pragma intrinsic(_byteswap_ushort)
#define SDL_Swap16(x) _byteswap_ushort(x)
#elif defined(__WATCOMC__) && defined(__386__) #elif defined(__WATCOMC__) && defined(__386__)
extern _inline Uint16 SDL_Swap16(Uint16); extern _inline Uint16 SDL_Swap16(Uint16);
#pragma aux SDL_Swap16 = \ #pragma aux SDL_Swap16 = \
@ -113,7 +149,11 @@ SDL_Swap16(Uint16 x)
} }
#endif #endif
#if defined(__GNUC__) && defined(__i386__) #if (defined(__clang__) && (__clang_major__ > 2 || (__clang_major__ == 2 && __clang_minor__ >= 6))) || \
(defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
#define SDL_Swap32(x) __builtin_bswap32(x)
#elif defined(__GNUC__) && defined(__i386__) && \
!(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
SDL_FORCE_INLINE Uint32 SDL_FORCE_INLINE Uint32
SDL_Swap32(Uint32 x) SDL_Swap32(Uint32 x)
{ {
@ -138,7 +178,14 @@ SDL_Swap32(Uint32 x)
__asm__("rlwimi %0,%2,24,0,7" : "=&r"(result): "0" (result), "r"(x)); __asm__("rlwimi %0,%2,24,0,7" : "=&r"(result): "0" (result), "r"(x));
return result; return result;
} }
#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) && !defined(__mcoldfire__) #elif defined(__GNUC__) && defined(__aarch64__)
SDL_FORCE_INLINE Uint32
SDL_Swap32(Uint32 x)
{
__asm__("rev %w1, %w0": "=r"(x):"r"(x));
return x;
}
#elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__))
SDL_FORCE_INLINE Uint32 SDL_FORCE_INLINE Uint32
SDL_Swap32(Uint32 x) SDL_Swap32(Uint32 x)
{ {
@ -147,19 +194,13 @@ SDL_Swap32(Uint32 x)
} }
#elif defined(__WATCOMC__) && defined(__386__) #elif defined(__WATCOMC__) && defined(__386__)
extern _inline Uint32 SDL_Swap32(Uint32); extern _inline Uint32 SDL_Swap32(Uint32);
#ifndef __SW_3 /* 486+ */
#pragma aux SDL_Swap32 = \ #pragma aux SDL_Swap32 = \
"bswap eax" \ "bswap eax" \
parm [eax] \ parm [eax] \
modify [eax]; modify [eax];
#else /* 386-only */ #elif defined(_MSC_VER)
#pragma aux SDL_Swap32 = \ #pragma intrinsic(_byteswap_ulong)
"xchg al, ah" \ #define SDL_Swap32(x) _byteswap_ulong(x)
"ror eax, 16" \
"xchg al, ah" \
parm [eax] \
modify [eax];
#endif
#else #else
SDL_FORCE_INLINE Uint32 SDL_FORCE_INLINE Uint32
SDL_Swap32(Uint32 x) SDL_Swap32(Uint32 x)
@ -169,22 +210,24 @@ SDL_Swap32(Uint32 x)
} }
#endif #endif
#if defined(__GNUC__) && defined(__i386__) #if (defined(__clang__) && (__clang_major__ > 2 || (__clang_major__ == 2 && __clang_minor__ >= 6))) || \
(defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
#define SDL_Swap64(x) __builtin_bswap64(x)
#elif defined(__GNUC__) && defined(__i386__) && \
!(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
SDL_FORCE_INLINE Uint64 SDL_FORCE_INLINE Uint64
SDL_Swap64(Uint64 x) SDL_Swap64(Uint64 x)
{ {
union union {
{ struct {
struct
{
Uint32 a, b; Uint32 a, b;
} s; } s;
Uint64 u; Uint64 u;
} v; } v;
v.u = x; v.u = x;
__asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1": "=r"(v.s.a), "=r"(v.s.b):"0"(v.s.a), __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1"
"1"(v.s. : "=r"(v.s.a), "=r"(v.s.b)
b)); : "0" (v.s.a), "1"(v.s.b));
return v.u; return v.u;
} }
#elif defined(__GNUC__) && defined(__x86_64__) #elif defined(__GNUC__) && defined(__x86_64__)
@ -194,6 +237,17 @@ SDL_Swap64(Uint64 x)
__asm__("bswapq %0": "=r"(x):"0"(x)); __asm__("bswapq %0": "=r"(x):"0"(x));
return 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];
#elif defined(_MSC_VER)
#pragma intrinsic(_byteswap_uint64)
#define SDL_Swap64(x) _byteswap_uint64(x)
#else #else
SDL_FORCE_INLINE Uint64 SDL_FORCE_INLINE Uint64
SDL_Swap64(Uint64 x) SDL_Swap64(Uint64 x)
@ -215,8 +269,7 @@ SDL_Swap64(Uint64 x)
SDL_FORCE_INLINE float SDL_FORCE_INLINE float
SDL_SwapFloat(float x) SDL_SwapFloat(float x)
{ {
union union {
{
float f; float f;
Uint32 ui32; Uint32 ui32;
} swapper; } swapper;

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -40,41 +40,83 @@ extern "C" {
/** /**
* \brief Set the error message for the current thread * Set the SDL error message for the current thread.
* *
* \return -1, there is no error handling for this function * 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 always -1.
*
* \sa SDL_ClearError
* \sa SDL_GetError
*/ */
extern DECLSPEC int SDLCALL SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); extern DECLSPEC int SDLCALL SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1);
/** /**
* \brief Get the last error message that was set * Retrieve a message about the last error that occurred on the current thread.
* *
* SDL API functions may set error messages and then succeed, so you should * It is possible for multiple errors to occur before calling SDL_GetError().
* only use the error value if a function fails. * Only the last error is returned.
* *
* This returns a pointer to a static buffer for convenience and should not * The message is only applicable when an SDL function has signaled an error.
* be called by multiple threads simultaneously. * 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.
* *
* \return a pointer to the last error message that was set * 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 string is internally allocated and must not be freed by the
* application.
*
* \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(). 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().
*
* \sa SDL_ClearError
* \sa SDL_SetError
*/ */
extern DECLSPEC const char *SDLCALL SDL_GetError(void); extern DECLSPEC const char *SDLCALL SDL_GetError(void);
/** /**
* \brief Get the last error message that was set for the current thread * Get the last error message that was set for the current thread.
* *
* SDL API functions may set error messages and then succeed, so you should * This allows the caller to copy the error string into a provided buffer,
* only use the error value if a function fails. * but otherwise operates exactly the same as SDL_GetError().
* *
* \param errstr A buffer to fill with the last error message that was set * \param errstr A buffer to fill with the last error message that was set
* for the current thread * for the current thread
* \param maxlen The size of the buffer pointed to by the errstr parameter * \param maxlen The size of the buffer pointed to by the errstr parameter
* \returns The pointer passed in as the `errstr` parameter.
* *
* \return errstr * \sa SDL_GetError
*/ */
extern DECLSPEC char * SDLCALL SDL_GetErrorMsg(char *errstr, int maxlen); extern DECLSPEC char * SDLCALL SDL_GetErrorMsg(char *errstr, int maxlen);
/** /**
* \brief Clear the error message for the current thread * Clear any previous error message for this thread.
*
* \sa SDL_GetError
* \sa SDL_SetError
*/ */
extern DECLSPEC void SDLCALL SDL_ClearError(void); extern DECLSPEC void SDLCALL SDL_ClearError(void);

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -50,7 +50,7 @@ extern "C" {
#define SDL_PRESSED 1 #define SDL_PRESSED 1
/** /**
* \brief The types of events that can be delivered. * The types of events that can be delivered.
*/ */
typedef enum typedef enum
{ {
@ -637,11 +637,24 @@ SDL_COMPILE_TIME_ASSERT(SDL_Event, sizeof(SDL_Event) == 56);
/* Function prototypes */ /* Function prototypes */
/** /**
* Pumps the event loop, gathering events from the input devices. * Pump the event loop, gathering events from the input devices.
* *
* This function updates the event queue and internal input device state. * This function updates the event queue and internal input device state.
* *
* This should only be run in the thread that sets the video mode. * **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.
*
* \sa SDL_PollEvent
* \sa SDL_WaitEvent
*/ */
extern DECLSPEC void SDLCALL SDL_PumpEvents(void); extern DECLSPEC void SDLCALL SDL_PumpEvents(void);
@ -654,22 +667,40 @@ typedef enum
} SDL_eventaction; } SDL_eventaction;
/** /**
* Checks the event queue for messages and optionally returns them. * Check the event queue for messages and optionally return them.
* *
* If \c action is ::SDL_ADDEVENT, up to \c numevents events will be added to * `action` may be any of the following:
* the back of the event queue.
* *
* If \c action is ::SDL_PEEKEVENT, up to \c numevents events at the front * - `SDL_ADDEVENT`: up to `numevents` events will be added to the back of
* of the event queue, within the specified minimum and maximum type, * the event queue.
* will be returned and will not be removed from the 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.
* *
* If \c action is ::SDL_GETEVENT, up to \c numevents events at the front * You may have to call SDL_PumpEvents() before calling this function.
* of the event queue, within the specified minimum and maximum type, * Otherwise, the events may not be ready to be filtered when you call
* will be returned and will be removed from the queue. * SDL_PeepEvents().
*
* \return The number of events actually stored, or -1 if there was an error.
* *
* This function is thread-safe. * This function is thread-safe.
*
* \param events destination buffer for the retrieved events
* \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_FIRSTEVENT is a safe choice
* \param maxType maximum value of the event type to be considered;
* SDL_LASTEVENT is a safe choice
* \returns the number of events actually stored or a negative error code on
* failure; call SDL_GetError() for more information.
*
* \sa SDL_PollEvent
* \sa SDL_PumpEvents
* \sa SDL_PushEvent
*/ */
extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event * events, int numevents, extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event * events, int numevents,
SDL_eventaction action, SDL_eventaction action,
@ -677,113 +708,330 @@ extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event * events, int numevents,
/* @} */ /* @} */
/** /**
* Checks to see if certain event types are in the event queue. * 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.
*
* \sa SDL_HasEvents
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 type); extern 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.
*
* \sa SDL_HasEvents
*/
extern DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType); extern DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType);
/** /**
* This function clears events from the event queue * 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 * 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() * sure that all pending OS events are flushed, you can call SDL_PumpEvents()
* on the main thread immediately before the flush call. * on the main thread immediately before the flush call.
*
* \param type the type of event to be cleared; see SDL_EventType for details
*
* \sa SDL_FlushEvents
*/ */
extern DECLSPEC void SDLCALL SDL_FlushEvent(Uint32 type); extern 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
*
* \sa SDL_FlushEvent
*/
extern DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType); extern DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType);
/** /**
* \brief Polls for currently pending events. * Poll for currently pending events.
* *
* \return 1 if there are any pending events, or 0 if there are none available. * 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.
* *
* \param event If not NULL, the next event is removed from the queue and * If `event` is NULL, it simply returns 1 if there is an event in the queue,
* stored in that area. * but will not remove it from the queue.
*
* As this function implicitly calls 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 1 if there is a pending event or 0 if there are none available.
*
* \sa SDL_GetEventFilter
* \sa SDL_PeepEvents
* \sa SDL_PushEvent
* \sa SDL_SetEventFilter
* \sa SDL_WaitEvent
* \sa SDL_WaitEventTimeout
*/ */
extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event * event); extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event * event);
/** /**
* \brief Waits indefinitely for the next available event. * Wait indefinitely for the next available event.
* *
* \return 1, or 0 if there was an error while waiting for 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`.
* *
* \param event If not NULL, the next event is removed from the queue and * As this function implicitly calls SDL_PumpEvents(), you can only call this
* stored in that area. * 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 1 on success or 0 if there was an error while waiting for events;
* call SDL_GetError() for more information.
*
* \sa SDL_PollEvent
* \sa SDL_PumpEvents
* \sa SDL_WaitEventTimeout
*/ */
extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event * event); extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event * event);
/** /**
* \brief Waits until the specified timeout (in milliseconds) for the next * Wait until the specified timeout (in milliseconds) for
* available event. * the next available event.
* *
* \return 1, or 0 if there was an error while waiting for 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`.
* *
* \param event If not NULL, the next event is removed from the queue and * As this function implicitly calls SDL_PumpEvents(), you can only call this
* stored in that area. * function in the thread that initialized the video subsystem.
* \param timeout The timeout (in milliseconds) to wait for next event. *
* \param event the SDL_Event structure to be filled in with the next event
* from the queue, or NULL
* \param timeout the maximum number of milliseconds to wait for the next
* available event
* \returns 1 on success or 0 if there was an error while waiting for events;
* call SDL_GetError() for more information. This also returns 0 if
* the timeout elapsed without an event arriving.
*
* \sa SDL_PollEvent
* \sa SDL_PumpEvents
* \sa SDL_WaitEvent
*/ */
extern DECLSPEC int SDLCALL SDL_WaitEventTimeout(SDL_Event * event, extern DECLSPEC int SDLCALL SDL_WaitEventTimeout(SDL_Event * event,
int timeout); int timeout);
/** /**
* \brief Add an event to the event queue. * Add an event to the event queue.
* *
* \return 1 on success, 0 if the event was filtered, or -1 if the event queue * The event queue can actually be used as a two way communication channel.
* was full or there was some other error. * 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.
*
* \sa SDL_PeepEvents
* \sa SDL_PollEvent
* \sa SDL_RegisterEvents
*/ */
extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event * event); extern 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 Filters return 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.
*
* \sa SDL_SetEventFilter
* \sa SDL_AddEventWatch
*/
typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event); typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event);
/** /**
* Sets up a filter to process all events before they change internal state and * Set up a filter to process all events before they change internal state and
* are posted to the internal event queue. * are posted to the internal event queue.
* *
* The filter is prototyped as: * If the filter function returns 1 when called, then the event will be added
* \code * to the internal queue. If it returns 0, then the event will be dropped from
* int SDL_EventFilter(void *userdata, SDL_Event * event); * the queue, but the internal state will still be updated. This allows
* \endcode * selective filtering of dynamically arriving events.
* *
* If the filter returns 1, then the event will be added to the internal queue. * **WARNING**: Be very careful of what you do in the event filter function,
* If it returns 0, then the event will be dropped from the queue, but the * as it may run in a different thread!
* 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 * On platforms that support it, if the quit event is generated by an
* it may run in a different thread! * 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 * 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 * 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 * application window. If the event filter returns 1, then the window will
* be closed, otherwise the window will remain open if possible. * be closed, otherwise the window will remain open if possible.
* *
* If the quit event is generated by an interrupt signal, it will bypass the * Note: Disabled events never make it to the event filter function; see
* internal queue and be delivered to the application at the next event poll. * SDL_EventState().
*
* 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`
*
* \sa SDL_AddEventWatch
* \sa SDL_EventState
* \sa SDL_GetEventFilter
* \sa SDL_PeepEvents
* \sa SDL_PushEvent
*/ */
extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter, extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter,
void *userdata); void *userdata);
/** /**
* Return the current event filter - can be used to "chain" filters. * Query the current event filter.
* If there is no event filter set, this function returns SDL_FALSE. *
* 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.
*
* \sa SDL_SetEventFilter
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter * filter, extern DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter * filter,
void **userdata); void **userdata);
/** /**
* Add a function which is called when an event is added to the queue. * 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`
*
* \sa SDL_DelEventWatch
* \sa SDL_SetEventFilter
*/ */
extern DECLSPEC void SDLCALL SDL_AddEventWatch(SDL_EventFilter filter, extern DECLSPEC void SDLCALL SDL_AddEventWatch(SDL_EventFilter filter,
void *userdata); void *userdata);
/** /**
* Remove an event watch function added with SDL_AddEventWatch() * 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()
*
* \sa SDL_AddEventWatch
*/ */
extern DECLSPEC void SDLCALL SDL_DelEventWatch(SDL_EventFilter filter, extern DECLSPEC void SDLCALL SDL_DelEventWatch(SDL_EventFilter filter,
void *userdata); void *userdata);
/** /**
* Run the filter function on the current event queue, removing any * Run a specific filter function on the current event
* events for which the filter returns 0. * 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`
*
* \sa SDL_GetEventFilter
* \sa SDL_SetEventFilter
*/ */
extern DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter, extern DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter,
void *userdata); void *userdata);
@ -795,24 +1043,43 @@ extern DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter,
#define SDL_ENABLE 1 #define SDL_ENABLE 1
/** /**
* This function allows you to set the state of processing certain events. * Set the state of processing events by type.
* - If \c state is set to ::SDL_IGNORE, that event will be automatically *
* dropped from the event queue and will not be filtered. * `state` may be any of the following:
* - If \c state is set to ::SDL_ENABLE, that event will be processed *
* normally. * - `SDL_QUERY`: returns the current processing state of the specified event
* - If \c state is set to ::SDL_QUERY, SDL_EventState() will return the * - `SDL_IGNORE` (aka `SDL_DISABLE`): the event will automatically be dropped
* current processing state of the specified event. * from the event queue and will not be filtered
* - `SDL_ENABLE`: the event will be processed normally
*
* \param type the type of event; see SDL_EventType for details
* \param state how to process the event
* \returns `SDL_DISABLE` or `SDL_ENABLE`, representing the processing state
* of the event before this function makes any changes to it.
*
* \sa SDL_GetEventState
*/ */
extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint32 type, int state); extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint32 type, int state);
/* @} */ /* @} */
#define SDL_GetEventState(type) SDL_EventState(type, SDL_QUERY) #define SDL_GetEventState(type) SDL_EventState(type, SDL_QUERY)
/** /**
* This function allocates a set of user-defined events, and returns * Allocate a set of user-defined events, and return the beginning event
* the beginning event number for that set of events. * number for that set of events.
* *
* If there aren't enough user-defined events left, this function * Calling this function with `numevents` <= 0 is an error and will return
* returns (Uint32)-1 * (Uint32)-1.
*
* Note, (Uint32)-1 means the maximum unsigned 32-bit integer value (or
* 0xFFFFFFFF), but is clearer to write.
*
* \param numevents the number of events to be allocated
* \returns The beginning event number, or (Uint32)-1 if there are not enough
* user-defined events left.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_PushEvent
*/ */
extern DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents); extern DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents);

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -38,32 +38,47 @@ extern "C" {
#endif #endif
/** /**
* \brief Get the path where the application resides. * Get the directory where the application was run from.
* *
* Get the "base path". This is the directory where the application was run * This is not necessarily a fast call, so you should call this once near
* from, which is probably the installation directory, and may or may not * startup and save the string if you need it.
* be the process's current working directory.
* *
* This returns an absolute path in UTF-8 encoding, and is guaranteed to * **Mac OS X and iOS Specific Functionality**: If the application is in a
* end with a path separator ('\\' on Windows, '/' most other places). * ".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.
* *
* The pointer returned by this function is owned by you. Please call * Supported values for the SDL_FILESYSTEM_BASE_DIR_TYPE property (Given an
* SDL_free() on the pointer when you are done with it, or it will be a * application in /Applications/SDLApp/MyApp.app):
* memory leak. This is not necessarily a fast call, though, so you should
* call this once near startup and save the string if you need it.
* *
* Some platforms can't determine the application's path, and on other * - `resource`: bundle resource directory (the default). For example:
* platforms, this might be meaningless. In such cases, this function will * `/Applications/SDLApp/MyApp.app/Contents/Resources`
* return NULL. * - `bundle`: the Bundle directory. Fpr example:
* `/Applications/SDLApp/MyApp.app/`
* - `parent`: the containing directory of the bundle. For example:
* `/Applications/SDLApp/`
* *
* \return String of base dir in UTF-8 encoding, or NULL on error. * The returned path is guaranteed to end with a path separator ('\' on
* Windows, '/' on most other platforms).
*
* The pointer returned is owned by the caller. Please call SDL_free() on
* the pointer when done with it.
*
* \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 2.0.1.
* *
* \sa SDL_GetPrefPath * \sa SDL_GetPrefPath
*/ */
extern DECLSPEC char *SDLCALL SDL_GetBasePath(void); extern DECLSPEC char *SDLCALL SDL_GetBasePath(void);
/** /**
* \brief Get the user-and-app-specific path where files can be written. * 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 * 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 * files (preferences and save games, etc) that are specific to your
@ -74,52 +89,46 @@ extern DECLSPEC char *SDLCALL SDL_GetBasePath(void);
* path to the directory in UTF-8 encoding. * path to the directory in UTF-8 encoding.
* *
* On Windows, the string might look like: * On Windows, the string might look like:
* "C:\\Users\\bob\\AppData\\Roaming\\My Company\\My Program Name\\"
* *
* On Linux, the string might look like: * `C:\\Users\\bob\\AppData\\Roaming\\My Company\\My Program Name\\`
* "/home/bob/.local/share/My Program Name/" *
* On Linux, the string might look like"
*
* `/home/bob/.local/share/My Program Name/`
* *
* On Mac OS X, the string might look like: * On Mac OS X, the string might look like:
* "/Users/bob/Library/Application Support/My Program Name/"
* *
* (etc.) * `/Users/bob/Library/Application Support/My Program Name/`
* *
* You specify the name of your organization (if it's not a real organization, * You should assume the path returned by this function is the only safe place
* your name or an Internet domain you own might do) and the name of your * to write files (and that SDL_GetBasePath(), while it might be writable, or
* application. These should be untranslated proper names. * 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 * Both the org and app strings may become part of a directory name, so please
* please follow these rules: * follow these rules:
* *
* - Try to use the same org string (including case-sensitivity) for * - Try to use the same org string (_including case-sensitivity_) for all
* all your applications that use this function. * your applications that use this function.
* - Always use a unique app string for each one, and make sure it never * - Always use a unique app string for each one, and make sure it never
* changes for an app once you've decided on it. * changes for an app once you've decided on it.
* - Unicode characters are legal, as long as it's UTF-8 encoded, but... * - Unicode characters are legal, as long as it's UTF-8 encoded, but...
* - ...only use letters, numbers, and spaces. Avoid punctuation like * - ...only use letters, numbers, and spaces. Avoid punctuation like "Game
* "Game Name 2: Bad Guy's Revenge!" ... "Game Name 2" is sufficient. * Name 2: Bad Guy's Revenge!" ... "Game Name 2" is sufficient.
* *
* This returns an absolute path in UTF-8 encoding, and is guaranteed to * The returned path is guaranteed to end with a path separator ('\' on
* end with a path separator ('\\' on Windows, '/' most other places). * Windows, '/' on most other platforms).
* *
* The pointer returned by this function is owned by you. Please call * The pointer returned is owned by the caller. Please call SDL_free() on
* SDL_free() on the pointer when you are done with it, or it will be a * the pointer when done with it.
* memory leak. This is not necessarily a fast call, though, so you should
* call this once near startup and save the string if you need it.
* *
* You should assume the path returned by this function is the only safe * \param org the name of your organization
* place to write files (and that SDL_GetBasePath(), while it might be * \param app the name of your application
* writable, or even the parent of the returned path, aren't where you * \returns a UTF-8 string of the user directory in platform-dependent
* should be writing things). * notation. NULL if there's a problem (creating directory failed,
* etc.).
* *
* Some platforms can't determine the pref path, and on other * \since This function is available since SDL 2.0.1.
* platforms, this might be meaningless. In such cases, this function will
* return NULL.
*
* \param org The name of your organization.
* \param app The name of your application.
* \return UTF-8 string of user dir in platform-dependent notation. NULL
* if there's a problem (creating directory failed, etc).
* *
* \sa SDL_GetBasePath * \sa SDL_GetBasePath
*/ */

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -124,12 +124,32 @@ typedef struct SDL_GameControllerButtonBind
*/ */
/** /**
* Load a set of mappings from a seekable SDL data stream (memory or file), filtered by the current SDL_GetPlatform() * Load a set of Game Controller mappings from a seekable SDL data stream.
* A community sourced database of controllers is available at https://raw.github.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt
* *
* If \c freerw is non-zero, the stream will be closed after being read. * You can call this function several times, if needed, to load different
* database files.
* *
* \return number of mappings added, -1 on error * If a new mapping is loaded for an already known controller 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 rw the data stream for the mappings to be added
* \param freerw non-zero to close the stream after being read
* \returns the number of mappings added or -1 on error; call SDL_GetError()
* for more information.
*
* \since This function is available since SDL 2.0.2.
*
* \sa SDL_GameControllerAddMapping
* \sa SDL_GameControllerAddMappingsFromFile
* \sa SDL_GameControllerMappingForGUID
*/ */
extern DECLSPEC int SDLCALL SDL_GameControllerAddMappingsFromRW(SDL_RWops * rw, int freerw); extern DECLSPEC int SDLCALL SDL_GameControllerAddMappingsFromRW(SDL_RWops * rw, int freerw);
@ -141,124 +161,267 @@ extern DECLSPEC int SDLCALL SDL_GameControllerAddMappingsFromRW(SDL_RWops * rw,
#define SDL_GameControllerAddMappingsFromFile(file) SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(file, "rb"), 1) #define SDL_GameControllerAddMappingsFromFile(file) SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(file, "rb"), 1)
/** /**
* Add or update an existing mapping configuration * Add support for controllers that SDL is unaware of or
* to cause an existing controller to have a different binding.
* *
* \return 1 if mapping is added, 0 if updated, -1 on error * The mapping string has the format "GUID,name,mapping", where GUID is the
* string value from SDL_JoystickGetGUIDString(), name is the human readable
* string for the device and mappings are controller 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 controller axes and vice versa.
*
* This string shows an example of a valid mapping for a controller:
*
* ```
* "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 mappingString the mapping string
* \returns 1 if a new mapping is added, 0 if an existing mapping is updated,
* -1 on error; call SDL_GetError() for more information.
*
* \sa SDL_GameControllerMapping
* \sa SDL_GameControllerMappingForGUID
*/ */
extern DECLSPEC int SDLCALL SDL_GameControllerAddMapping(const char* mappingString); extern DECLSPEC int SDLCALL SDL_GameControllerAddMapping(const char* mappingString);
/** /**
* Get the number of mappings installed * Get the number of mappings installed.
* *
* \return the number of mappings * \returns the number of mappings.
*/ */
extern DECLSPEC int SDLCALL SDL_GameControllerNumMappings(void); extern DECLSPEC int SDLCALL SDL_GameControllerNumMappings(void);
/** /**
* Get the mapping at a particular index. * Get the mapping at a particular index.
* *
* \return the mapping string. Must be freed with SDL_free(). Returns NULL if the index is out of range. * \returns the mapping string. Must be freed with SDL_free().
* Returns NULL if the index is out of range.
*/ */
extern DECLSPEC char * SDLCALL SDL_GameControllerMappingForIndex(int mapping_index); extern DECLSPEC char * SDLCALL SDL_GameControllerMappingForIndex(int mapping_index);
/** /**
* Get a mapping string for a GUID * Get the game controller mapping string for a given GUID.
* *
* \return the mapping string. Must be freed with SDL_free(). Returns NULL if no mapping is available * The returned string must be freed with SDL_free().
*
* \param guid a structure containing the GUID for which a mapping is desired
* \returns a mapping string or NULL on error; call SDL_GetError() for more
* information.
*
* \sa SDL_JoystickGetDeviceGUID
* \sa SDL_JoystickGetGUID
*/ */
extern DECLSPEC char * SDLCALL SDL_GameControllerMappingForGUID(SDL_JoystickGUID guid); extern DECLSPEC char * SDLCALL SDL_GameControllerMappingForGUID(SDL_JoystickGUID guid);
/** /**
* Get a mapping string for an open GameController * Get the current mapping of a Game Controller.
* *
* \return the mapping string. Must be freed with SDL_free(). Returns NULL if no mapping is available * The returned string must be freed with SDL_free().
*
* Details about mappings are discussed with SDL_GameControllerAddMapping().
*
* \param gamecontroller the game controller you want to get the current
* mapping for
* \returns a string that has the controller's mapping or NULL if no mapping
* is available; call SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_GameControllerAddMapping
* \sa SDL_GameControllerMappingForGUID
*/ */
extern DECLSPEC char * SDLCALL SDL_GameControllerMapping(SDL_GameController *gamecontroller); extern DECLSPEC char * SDLCALL SDL_GameControllerMapping(SDL_GameController *gamecontroller);
/** /**
* Is the joystick on this index supported by the game controller interface? * Check if the given joystick is supported by the game controller interface.
*
* `joystick_index` is the same as the `device_index` passed to
* SDL_JoystickOpen().
*
* \param joystick_index the device_index of a device, up to
* SDL_NumJoysticks()
* \returns SDL_TRUE if the given joystick is supported by the game controller
* interface, SDL_FALSE if it isn't or it's an invalid index.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_GameControllerNameForIndex
* \sa SDL_GameControllerOpen
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_IsGameController(int joystick_index); extern DECLSPEC SDL_bool SDLCALL SDL_IsGameController(int joystick_index);
/** /**
* Get the implementation dependent name of a game controller. * Get the implementation dependent name for the game
* This can be called before any controllers are opened. * controller.
* If no name can be found, this function returns NULL. *
* This function can be called before any controllers are opened.
*
* `joystick_index` is the same as the `device_index` passed to
* SDL_JoystickOpen().
*
* \param joystick_index the device_index of a device, from zero to
* SDL_NumJoysticks()-1
* \returns the implementation-dependent name for the game controller, or NULL
* if there is no name or the index is invalid.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_GameControllerName
* \sa SDL_GameControllerOpen
* \sa SDL_IsGameController
*/ */
extern DECLSPEC const char *SDLCALL SDL_GameControllerNameForIndex(int joystick_index); extern DECLSPEC const char *SDLCALL SDL_GameControllerNameForIndex(int joystick_index);
/** /**
* Get the type of a game controller. * Get the type of a game controller.
*
* This can be called before any controllers are opened. * This can be called before any controllers are opened.
*
* \param joystick_index the device_index of a device, from zero to
* SDL_NumJoysticks()-1
* \returns the controller type.
*/ */
extern DECLSPEC SDL_GameControllerType SDLCALL SDL_GameControllerTypeForIndex(int joystick_index); extern DECLSPEC SDL_GameControllerType SDLCALL SDL_GameControllerTypeForIndex(int joystick_index);
/** /**
* Get the mapping of a game controller. * Get the mapping of a game controller.
*
* This can be called before any controllers are opened. * This can be called before any controllers are opened.
* *
* \return the mapping string. Must be freed with SDL_free(). Returns NULL if no mapping is available * \param joystick_index the device_index of a device, from zero to
* SDL_NumJoysticks()-1
* \returns the mapping string. Must be freed with SDL_free(). Returns NULL
* if no mapping is available.
*/ */
extern DECLSPEC char *SDLCALL SDL_GameControllerMappingForDeviceIndex(int joystick_index); extern DECLSPEC char *SDLCALL SDL_GameControllerMappingForDeviceIndex(int joystick_index);
/** /**
* Open a game controller for use. * Open a game controller for use.
* The index passed as an argument refers to the N'th game controller on the system.
* This index is not the value which will identify this controller in future
* controller events. The joystick's instance id (::SDL_JoystickID) will be
* used there instead.
* *
* \return A controller identifier, or NULL if an error occurred. * `joystick_index` is the same as the `device_index` passed to
* SDL_JoystickOpen().
*
* The index passed as an argument refers to the N'th game controller on the
* system. This index is not the value which will identify this controller in
* future controller events. The joystick's instance id (SDL_JoystickID) will
* be used there instead.
*
* \param joystick_index the device_index of a device, up to
* SDL_NumJoysticks()
* \returns a gamecontroller identifier or NULL if an error occurred; call
* SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_GameControllerClose
* \sa SDL_GameControllerNameForIndex
* \sa SDL_IsGameController
*/ */
extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerOpen(int joystick_index); extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerOpen(int joystick_index);
/** /**
* Return the SDL_GameController associated with an instance id. * Get the SDL_GameController associated with an instance id.
*
* \param joyid the instance id to get the SDL_GameController for
* \returns an SDL_GameController on success or NULL on failure; call
* SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.4.
*/ */
extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerFromInstanceID(SDL_JoystickID joyid); extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerFromInstanceID(SDL_JoystickID joyid);
/** /**
* Return the SDL_GameController associated with a player index. * Get the SDL_GameController associated with a player index.
*
* Please note that the player index is _not_ the device index, nor is it
* the instance id!
*
* \param player_index the player index, which is not the device index or
* the instance id!
* \returns the SDL_GameController associated with a player index.
*
* \sa SDL_GameControllerGetPlayerIndex
* \sa SDL_GameControllerSetPlayerIndex
*/ */
extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerFromPlayerIndex(int player_index); extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerFromPlayerIndex(int player_index);
/** /**
* Return the name for this currently opened controller * Get the implementation-dependent name for an opened game controller.
*
* This is the same name as returned by SDL_GameControllerNameForIndex(), but
* it takes a controller identifier instead of the (unstable) device index.
*
* \param gamecontroller a game controller identifier previously returned by
* SDL_GameControllerOpen()
* \returns the implementation dependent name for the game controller, or NULL
* if there is no name or the identifier passed is invalid.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_GameControllerNameForIndex
* \sa SDL_GameControllerOpen
*/ */
extern DECLSPEC const char *SDLCALL SDL_GameControllerName(SDL_GameController *gamecontroller); extern DECLSPEC const char *SDLCALL SDL_GameControllerName(SDL_GameController *gamecontroller);
/** /**
* Return the type of this currently opened controller * Get the type of this currently opened controller
*
* This is the same name as returned by SDL_GameControllerTypeForIndex(), but
* it takes a controller identifier instead of the (unstable) device index.
*
* \param gamecontroller the game controller object to query.
* \returns the controller type.
*/ */
extern DECLSPEC SDL_GameControllerType SDLCALL SDL_GameControllerGetType(SDL_GameController *gamecontroller); extern DECLSPEC SDL_GameControllerType SDLCALL SDL_GameControllerGetType(SDL_GameController *gamecontroller);
/** /**
* Get the player index of an opened game controller, or -1 if it's not available * Get the player index of an opened game controller.
* *
* For XInput controllers this returns the XInput user index. * For XInput controllers this returns the XInput user index.
*
* \param gamecontroller the game controller object to query.
* \returns player index for controller, or -1 if it's not available.
*/ */
extern DECLSPEC int SDLCALL SDL_GameControllerGetPlayerIndex(SDL_GameController *gamecontroller); extern DECLSPEC int SDLCALL SDL_GameControllerGetPlayerIndex(SDL_GameController *gamecontroller);
/** /**
* Set the player index of an opened game controller * Set the player index of an opened game controller.
*
* \param gamecontroller the game controller object to adjust.
* \param player_index Player index to assign to this controller.
*/ */
extern DECLSPEC void SDLCALL SDL_GameControllerSetPlayerIndex(SDL_GameController *gamecontroller, int player_index); extern DECLSPEC void SDLCALL SDL_GameControllerSetPlayerIndex(SDL_GameController *gamecontroller, int player_index);
/** /**
* Get the USB vendor ID of an opened controller, if available. * Get the USB vendor ID of an opened controller, if available.
*
* If the vendor ID isn't available this function returns 0. * If the vendor ID isn't available this function returns 0.
*
* \param gamecontroller the game controller object to query.
* \return USB vendor ID, or zero if unavailable.
*/ */
extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetVendor(SDL_GameController *gamecontroller); extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetVendor(SDL_GameController *gamecontroller);
/** /**
* Get the USB product ID of an opened controller, if available. * Get the USB product ID of an opened controller, if available.
*
* If the product ID isn't available this function returns 0. * If the product ID isn't available this function returns 0.
*
* \param gamecontroller the game controller object to query.
* \return USB product ID, or zero if unavailable.
*/ */
extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetProduct(SDL_GameController *gamecontroller); extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetProduct(SDL_GameController *gamecontroller);
/** /**
* Get the product version of an opened controller, if available. * Get the product version of an opened controller, if available.
*
* If the product version isn't available this function returns 0. * If the product version isn't available this function returns 0.
*
* \param gamecontroller the game controller object to query.
* \return USB product version, or zero if unavailable.
*/ */
extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetProductVersion(SDL_GameController *gamecontroller); extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetProductVersion(SDL_GameController *gamecontroller);
@ -266,36 +429,70 @@ extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetProductVersion(SDL_GameContr
* Get the serial number of an opened controller, if available. * Get the serial number of an opened controller, if available.
* *
* Returns the serial number of the controller, or NULL if it is not available. * Returns the serial number of the controller, or NULL if it is not available.
*
* \param gamecontroller the game controller object to query.
* \return Serial number, or NULL if unavailable.
*/ */
extern DECLSPEC const char * SDLCALL SDL_GameControllerGetSerial(SDL_GameController *gamecontroller); extern DECLSPEC const char * SDLCALL SDL_GameControllerGetSerial(SDL_GameController *gamecontroller);
/** /**
* Returns SDL_TRUE if the controller has been opened and currently connected, * Check if a controller has been opened and is currently connected.
* or SDL_FALSE if it has not. *
* \param gamecontroller a game controller identifier previously returned by
* SDL_GameControllerOpen()
* \returns SDL_TRUE if the controller has been opened and is currently
* connected, or SDL_FALSE if not.
*
* \sa SDL_GameControllerClose
* \sa SDL_GameControllerOpen
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerGetAttached(SDL_GameController *gamecontroller); extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerGetAttached(SDL_GameController *gamecontroller);
/** /**
* Get the underlying joystick object used by a controller * Get the Joystick ID from a Game Controller.
*
* This function will give you a SDL_Joystick object, which allows you to use
* the SDL_Joystick functions with a SDL_GameController 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_GameController. You should not
* call SDL_JoystickClose() on it, for example, since doing so will likely
* cause SDL to crash.
*
* \param gamecontroller the game controller object that you want to get a
* joystick from
* \returns a SDL_Joystick object; call SDL_GetError() for more information.
*/ */
extern DECLSPEC SDL_Joystick *SDLCALL SDL_GameControllerGetJoystick(SDL_GameController *gamecontroller); extern DECLSPEC SDL_Joystick *SDLCALL SDL_GameControllerGetJoystick(SDL_GameController *gamecontroller);
/** /**
* Enable/disable controller event polling. * Query or change current state of Game Controller events.
* *
* If controller events are disabled, you must call SDL_GameControllerUpdate() * If controller events are disabled, you must call SDL_GameControllerUpdate()
* yourself and check the state of the controller when you want controller * yourself and check the state of the controller when you want controller
* information. * information.
* *
* The state can be one of ::SDL_QUERY, ::SDL_ENABLE or ::SDL_IGNORE. * Any number can be passed to SDL_GameControllerEventState(), but only -1, 0,
* and 1 will have any effect. Other numbers will just be returned.
*
* \param state can be one of `SDL_QUERY`, `SDL_IGNORE`, or `SDL_ENABLE`
* \returns the same value passed to the function, with exception to -1
* (SDL_QUERY), which will return the current state.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_JoystickEventState
*/ */
extern DECLSPEC int SDLCALL SDL_GameControllerEventState(int state); extern DECLSPEC int SDLCALL SDL_GameControllerEventState(int state);
/** /**
* Update the current state of the open game controllers. * Manually pump game controller updates if not using the loop.
* *
* This is called automatically by the event loop if any game controller * This function is called automatically by the event loop if events are
* events are enabled. * enabled. Under such circumstances, it will not be necessary to call this
* function.
*/ */
extern DECLSPEC void SDLCALL SDL_GameControllerUpdate(void); extern DECLSPEC void SDLCALL SDL_GameControllerUpdate(void);
@ -322,24 +519,61 @@ typedef enum
} SDL_GameControllerAxis; } SDL_GameControllerAxis;
/** /**
* turn this string into a axis mapping * Convert a string into SDL_GameControllerAxis enum.
*
* This function is called internally to translate SDL_GameController mapping
* strings for the underlying joystick device into the consistent
* SDL_GameController mapping. You do not normally need to call this function
* unless you are parsing SDL_GameController mappings in your own code.
*
* \param str string representing a SDL_GameController axis
* \returns the SDL_GameControllerAxis enum corresponding to the input string,
* or `SDL_CONTROLLER_AXIS_INVALID` if no match was found.
*
* \sa SDL_GameControllerGetStringForAxis
*/ */
extern DECLSPEC SDL_GameControllerAxis SDLCALL SDL_GameControllerGetAxisFromString(const char *pchString); extern DECLSPEC SDL_GameControllerAxis SDLCALL SDL_GameControllerGetAxisFromString(const char *str);
/** /**
* turn this axis enum into a string mapping * Convert from an SDL_GameControllerAxis enum to a string.
*
* The caller should not SDL_free() the returned string.
*
* \param axis an enum value for a given SDL_GameControllerAxis
* \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_GameController mapping strings.
*
* \sa SDL_GameControllerGetAxisFromString
*/ */
extern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForAxis(SDL_GameControllerAxis axis); extern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForAxis(SDL_GameControllerAxis axis);
/** /**
* Get the SDL joystick layer binding for this controller button mapping * Get the SDL joystick layer binding for a controller axis mapping.
*
* \param gamecontroller a game controller
* \param axis an axis enum value (one of the SDL_GameControllerAxis values)
* \returns a SDL_GameControllerButtonBind describing the bind. On
* failure (like the given Controller axis doesn't exist on the
* device), its `.bindType` will be `SDL_CONTROLLER_BINDTYPE_NONE`.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_GameControllerGetBindForButton
*/ */
extern DECLSPEC SDL_GameControllerButtonBind SDLCALL extern DECLSPEC SDL_GameControllerButtonBind SDLCALL
SDL_GameControllerGetBindForAxis(SDL_GameController *gamecontroller, SDL_GameControllerGetBindForAxis(SDL_GameController *gamecontroller,
SDL_GameControllerAxis axis); SDL_GameControllerAxis axis);
/** /**
* Return whether a game controller has a given axis * Query whether a game controller has a given axis.
*
* This merely reports whether the controller's mapping defined this axis, as
* that is all the information SDL has about the physical device.
*
* \param gamecontroller a game controller
* \param axis an axis enum value (an SDL_GameControllerAxis value)
* \returns SDL_TRUE if the controller has this axis, SDL_FALSE otherwise.
*/ */
extern DECLSPEC SDL_bool SDLCALL extern DECLSPEC SDL_bool SDLCALL
SDL_GameControllerHasAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis); SDL_GameControllerHasAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis);
@ -347,10 +581,19 @@ SDL_GameControllerHasAxis(SDL_GameController *gamecontroller, SDL_GameController
/** /**
* Get the current state of an axis control on a game controller. * Get the current state of an axis control on a game controller.
* *
* The state is a value ranging from -32768 to 32767 (except for the triggers,
* which range from 0 to 32767).
*
* The axis indices start at index 0. * The axis indices start at index 0.
*
* The state is a value ranging from -32768 to 32767. Triggers, however, range
* from 0 to 32767 (they never return a negative value).
*
* \param gamecontroller a game controller
* \param axis an axis index (one of the SDL_GameControllerAxis 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 2.0.0.
*
* \sa SDL_GameControllerGetButton
*/ */
extern DECLSPEC Sint16 SDLCALL extern DECLSPEC Sint16 SDLCALL
SDL_GameControllerGetAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis); SDL_GameControllerGetAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis);
@ -386,24 +629,62 @@ typedef enum
} SDL_GameControllerButton; } SDL_GameControllerButton;
/** /**
* turn this string into a button mapping * Convert a string into an SDL_GameControllerButton enum.
*
* This function is called internally to translate SDL_GameController mapping
* strings for the underlying joystick device into the consistent
* SDL_GameController mapping. You do not normally need to call this function
* unless you are parsing SDL_GameController mappings in your own code.
*
* \param str string representing a SDL_GameController axis
* \returns the SDL_GameControllerButton enum corresponding to the input
* string, or `SDL_CONTROLLER_AXIS_INVALID` if no match was found.
*
*/ */
extern DECLSPEC SDL_GameControllerButton SDLCALL SDL_GameControllerGetButtonFromString(const char *pchString); extern DECLSPEC SDL_GameControllerButton SDLCALL SDL_GameControllerGetButtonFromString(const char *str);
/** /**
* turn this button enum into a string mapping * Convert from an SDL_GameControllerButton enum to a string.
*
* The caller should not SDL_free() the returned string.
*
* \param button an enum value for a given SDL_GameControllerButton
* \returns a string for the given button, or NULL if an invalid axis is
* specified. The string returned is of the format used by
* SDL_GameController mapping strings.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_GameControllerGetButtonFromString
*/ */
extern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForButton(SDL_GameControllerButton button); extern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForButton(SDL_GameControllerButton button);
/** /**
* Get the SDL joystick layer binding for this controller button mapping * Get the SDL joystick layer binding for a controller button mapping.
*
* \param gamecontroller a game controller
* \param button an button enum value (an SDL_GameControllerButton value)
* \returns a SDL_GameControllerButtonBind describing the bind. On
* failure (like the given Controller button doesn't exist on the
* device), its `.bindType` will be `SDL_CONTROLLER_BINDTYPE_NONE`.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_GameControllerGetBindForAxis
*/ */
extern DECLSPEC SDL_GameControllerButtonBind SDLCALL extern DECLSPEC SDL_GameControllerButtonBind SDLCALL
SDL_GameControllerGetBindForButton(SDL_GameController *gamecontroller, SDL_GameControllerGetBindForButton(SDL_GameController *gamecontroller,
SDL_GameControllerButton button); SDL_GameControllerButton button);
/** /**
* Return whether a game controller has a given button * Query whether a game controller has a given button.
*
* This merely reports whether the controller's mapping defined this button,
* as that is all the information SDL has about the physical device.
*
* \param gamecontroller a game controller
* \param button a button enum value (an SDL_GameControllerButton value)
* \returns SDL_TRUE if the controller has this button, SDL_FALSE otherwise.
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasButton(SDL_GameController *gamecontroller, extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasButton(SDL_GameController *gamecontroller,
SDL_GameControllerButton button); SDL_GameControllerButton button);
@ -411,7 +692,14 @@ extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasButton(SDL_GameController
/** /**
* Get the current state of a button on a game controller. * Get the current state of a button on a game controller.
* *
* The button indices start at index 0. * \param gamecontroller a game controller
* \param button a button index (one of the SDL_GameControllerButton values)
* \returns 1 for pressed state or 0 for not pressed state or error; call
* SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_GameControllerGetAxis
*/ */
extern DECLSPEC Uint8 SDLCALL SDL_GameControllerGetButton(SDL_GameController *gamecontroller, extern DECLSPEC Uint8 SDLCALL SDL_GameControllerGetButton(SDL_GameController *gamecontroller,
SDL_GameControllerButton button); SDL_GameControllerButton button);
@ -437,28 +725,28 @@ extern DECLSPEC int SDLCALL SDL_GameControllerGetTouchpadFinger(SDL_GameControll
* \param gamecontroller The controller to query * \param gamecontroller The controller to query
* \param type The type of sensor to query * \param type The type of sensor to query
* *
* \return SDL_TRUE if the sensor exists, SDL_FALSE otherwise. * \returns SDL_TRUE if the sensor exists, SDL_FALSE otherwise.
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasSensor(SDL_GameController *gamecontroller, SDL_SensorType type); extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasSensor(SDL_GameController *gamecontroller, SDL_SensorType type);
/** /**
* Set whether data reporting for a game controller sensor is enabled * Set whether data reporting for a game controller sensor is enabled.
* *
* \param gamecontroller The controller to update * \param gamecontroller The controller to update
* \param type The type of sensor to enable/disable * \param type The type of sensor to enable/disable
* \param enabled Whether data reporting should be enabled * \param enabled Whether data reporting should be enabled
* *
* \return 0 or -1 if an error occurred. * \returns 0 or -1 if an error occurred.
*/ */
extern DECLSPEC int SDLCALL SDL_GameControllerSetSensorEnabled(SDL_GameController *gamecontroller, SDL_SensorType type, SDL_bool enabled); extern DECLSPEC int SDLCALL SDL_GameControllerSetSensorEnabled(SDL_GameController *gamecontroller, SDL_SensorType type, SDL_bool enabled);
/** /**
* Query whether sensor data reporting is enabled for a game controller * Query whether sensor data reporting is enabled for a game controller.
* *
* \param gamecontroller The controller to query * \param gamecontroller The controller to query
* \param type The type of sensor to query * \param type The type of sensor to query
* *
* \return SDL_TRUE if the sensor is enabled, SDL_FALSE otherwise. * \returns SDL_TRUE if the sensor is enabled, SDL_FALSE otherwise.
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerIsSensorEnabled(SDL_GameController *gamecontroller, SDL_SensorType type); extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerIsSensorEnabled(SDL_GameController *gamecontroller, SDL_SensorType type);
@ -472,64 +760,76 @@ extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerIsSensorEnabled(SDL_GameContr
* \param type The type of sensor to query * \param type The type of sensor to query
* \param data A pointer filled with the current sensor state * \param data A pointer filled with the current sensor state
* \param num_values The number of values to write to data * \param num_values The number of values to write to data
*
* \return 0 or -1 if an error occurred. * \return 0 or -1 if an error occurred.
*/ */
extern DECLSPEC int SDLCALL SDL_GameControllerGetSensorData(SDL_GameController *gamecontroller, SDL_SensorType type, float *data, int num_values); extern DECLSPEC int SDLCALL SDL_GameControllerGetSensorData(SDL_GameController *gamecontroller, SDL_SensorType type, float *data, int num_values);
/** /**
* Start a rumble effect * Start a rumble effect on a game controller.
* Each call to this function cancels any previous rumble effect, and calling it with 0 intensity stops any rumbling. *
* Each call to this function cancels any previous rumble effect, and calling
* it with 0 intensity stops any rumbling.
* *
* \param gamecontroller The controller to vibrate * \param gamecontroller The controller to vibrate
* \param low_frequency_rumble The intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF * \param low_frequency_rumble The intensity of the low frequency (left)
* \param high_frequency_rumble The intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF * 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 * \param duration_ms The duration of the rumble effect, in milliseconds
* * \returns 0, or -1 if rumble isn't supported on this controller
* \return 0, or -1 if rumble isn't supported on this controller
*/ */
extern DECLSPEC int SDLCALL SDL_GameControllerRumble(SDL_GameController *gamecontroller, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); extern DECLSPEC int SDLCALL SDL_GameControllerRumble(SDL_GameController *gamecontroller, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms);
/** /**
* Start a rumble effect in the game controller's triggers * Start a rumble effect in the game controller's triggers.
* Each call to this function cancels any previous trigger rumble effect, and calling it with 0 intensity stops any rumbling. *
* 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. The first controller to offer this feature was the PlayStation 5's
* DualShock 5.
* *
* \param gamecontroller The controller to vibrate * \param gamecontroller The controller to vibrate
* \param left_rumble The intensity of the left trigger rumble motor, from 0 to 0xFFFF * \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 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 * \param duration_ms The duration of the rumble effect, in milliseconds
* *
* \return 0, or -1 if rumble isn't supported on this controller * \returns 0, or -1 if trigger rumble isn't supported on this controller
*/ */
extern DECLSPEC int SDLCALL SDL_GameControllerRumbleTriggers(SDL_GameController *gamecontroller, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); extern DECLSPEC int SDLCALL SDL_GameControllerRumbleTriggers(SDL_GameController *gamecontroller, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms);
/** /**
* Return whether a controller has an LED * Query whether a game controller has an LED.
* *
* \param gamecontroller The controller to query * \param gamecontroller The controller to query
* * \returns SDL_TRUE, or SDL_FALSE if this controller does not have a
* \return SDL_TRUE, or SDL_FALSE if this controller does not have a modifiable LED * modifiable LED
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasLED(SDL_GameController *gamecontroller); extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasLED(SDL_GameController *gamecontroller);
/** /**
* Update a controller's LED color. * Update a game controller's LED color.
* *
* \param gamecontroller The controller to update * \param gamecontroller The controller to update
* \param red The intensity of the red LED * \param red The intensity of the red LED
* \param green The intensity of the green LED * \param green The intensity of the green LED
* \param blue The intensity of the blue LED * \param blue The intensity of the blue LED
* * \returns 0, or -1 if this controller does not have a modifiable LED
* \return 0, or -1 if this controller does not have a modifiable LED
*/ */
extern DECLSPEC int SDLCALL SDL_GameControllerSetLED(SDL_GameController *gamecontroller, Uint8 red, Uint8 green, Uint8 blue); extern DECLSPEC int SDLCALL SDL_GameControllerSetLED(SDL_GameController *gamecontroller, Uint8 red, Uint8 green, Uint8 blue);
/** /**
* Close a controller previously opened with SDL_GameControllerOpen(). * Close a game controller previously opened with SDL_GameControllerOpen().
*
* \param gamecontroller a game controller identifier previously returned by
* SDL_GameControllerOpen()
*
* \sa SDL_GameControllerOpen
*/ */
extern DECLSPEC void SDLCALL SDL_GameControllerClose(SDL_GameController *gamecontroller); extern DECLSPEC void SDLCALL SDL_GameControllerClose(SDL_GameController *gamecontroller);
/* Ends C function definitions when using C++ */ /* Ends C function definitions when using C++ */
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -46,36 +46,66 @@ typedef Sint64 SDL_GestureID;
/* Function prototypes */ /* Function prototypes */
/** /**
* \brief Begin Recording a gesture on the specified touch, or all touches (-1) * Begin recording a gesture on a specified touch device or all touch devices.
* *
* If the parameter `touchId` is -1 (i.e., all devices), this function will
* always return 1, regardless of whether there actually are any devices.
* *
* \param touchId the touch device id, or -1 for all touch devices
* \returns 1 on success or 0 if the specified device could not be found.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_GetTouchDevice
*/ */
extern DECLSPEC int SDLCALL SDL_RecordGesture(SDL_TouchID touchId); extern DECLSPEC int SDLCALL SDL_RecordGesture(SDL_TouchID touchId);
/** /**
* \brief Save all currently loaded Dollar Gesture templates * Save all currently loaded Dollar Gesture templates.
* *
* \param dst a SDL_RWops to save to
* \returns the number of saved templates on success or 0 on failure; call
* SDL_GetError() for more information.
* *
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_LoadDollarTemplates
* \sa SDL_SaveDollarTemplate
*/ */
extern DECLSPEC int SDLCALL SDL_SaveAllDollarTemplates(SDL_RWops *dst); extern DECLSPEC int SDLCALL SDL_SaveAllDollarTemplates(SDL_RWops *dst);
/** /**
* \brief Save a currently loaded Dollar Gesture template * Save a currently loaded Dollar Gesture template.
* *
* \param gestureId a gesture id
* \param dst a SDL_RWops to save to
* \returns 1 on success or 0 on failure; call SDL_GetError() for more
* information.
* *
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_LoadDollarTemplates
* \sa SDL_SaveAllDollarTemplates
*/ */
extern DECLSPEC int SDLCALL SDL_SaveDollarTemplate(SDL_GestureID gestureId,SDL_RWops *dst); extern DECLSPEC int SDLCALL SDL_SaveDollarTemplate(SDL_GestureID gestureId,SDL_RWops *dst);
/** /**
* \brief Load Dollar Gesture templates from a file * Load Dollar Gesture templates from a file.
* *
* \param touchId a touch id
* \param src a SDL_RWops to load from
* \returns the number of loaded templates on success or a negative error code
* (or 0) on failure; call SDL_GetError() for more information.
* *
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_SaveAllDollarTemplates
* \sa SDL_SaveDollarTemplate
*/ */
extern DECLSPEC int SDLCALL SDL_LoadDollarTemplates(SDL_TouchID touchId, SDL_RWops *src); extern DECLSPEC int SDLCALL SDL_LoadDollarTemplates(SDL_TouchID touchId, SDL_RWops *src);
/* Ends C function definitions when using C++ */ /* Ends C function definitions when using C++ */
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -821,65 +821,82 @@ typedef union SDL_HapticEffect
/* Function prototypes */ /* Function prototypes */
/** /**
* \brief Count the number of haptic devices attached to the system. * Count the number of haptic devices attached to the system.
* *
* \return Number of haptic devices detected on the system. * \returns the number of haptic devices detected on the system or a negative
* error code on failure; call SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_HapticName
*/ */
extern DECLSPEC int SDLCALL SDL_NumHaptics(void); extern DECLSPEC int SDLCALL SDL_NumHaptics(void);
/** /**
* \brief Get the implementation dependent name of a haptic device. * Get the implementation dependent name of a haptic device.
* *
* This can be called before any joysticks are opened. * This can be called before any joysticks are opened. If no name can be
* If no name can be found, this function returns NULL. * found, this function returns NULL.
* *
* \param device_index Index of the device to get its name. * \param device_index index of the device to query.
* \return Name of the device or NULL on error. * \returns the name of the device or NULL on failure; call SDL_GetError() for
* more information.
*
* \since This function is available since SDL 2.0.0.
* *
* \sa SDL_NumHaptics * \sa SDL_NumHaptics
*/ */
extern DECLSPEC const char *SDLCALL SDL_HapticName(int device_index); extern DECLSPEC const char *SDLCALL SDL_HapticName(int device_index);
/** /**
* \brief Opens a haptic device for use. * Open a haptic device for use.
* *
* The index passed as an argument refers to the N'th haptic device on this * The index passed as an argument refers to the N'th haptic device on this
* system. * system.
* *
* When opening a haptic device, its gain will be set to maximum and * When opening a haptic device, its gain will be set to maximum and
* autocenter will be disabled. To modify these values use * autocenter will be disabled. To modify these values use SDL_HapticSetGain()
* SDL_HapticSetGain() and SDL_HapticSetAutocenter(). * and SDL_HapticSetAutocenter().
* *
* \param device_index Index of the device to open. * \param device_index index of the device to open
* \return Device identifier or NULL on error. * \returns the device identifier or NULL on failure; call SDL_GetError() for
* more information.
*
* \since This function is available since SDL 2.0.0.
* *
* \sa SDL_HapticIndex
* \sa SDL_HapticOpenFromMouse
* \sa SDL_HapticOpenFromJoystick
* \sa SDL_HapticClose * \sa SDL_HapticClose
* \sa SDL_HapticSetGain * \sa SDL_HapticIndex
* \sa SDL_HapticSetAutocenter * \sa SDL_HapticOpenFromJoystick
* \sa SDL_HapticOpenFromMouse
* \sa SDL_HapticPause * \sa SDL_HapticPause
* \sa SDL_HapticSetAutocenter
* \sa SDL_HapticSetGain
* \sa SDL_HapticStopAll * \sa SDL_HapticStopAll
*/ */
extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpen(int device_index); extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpen(int device_index);
/** /**
* \brief Checks if the haptic device at index has been opened. * Check if the haptic device at the designated index has been opened.
* *
* \param device_index Index to check to see if it has been opened. * \param device_index the index of the device to query
* \return 1 if it has been opened or 0 if it hasn't. * \returns 1 if it has been opened, 0 if it hasn't or on failure; call
* SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.0.
* *
* \sa SDL_HapticOpen
* \sa SDL_HapticIndex * \sa SDL_HapticIndex
* \sa SDL_HapticOpen
*/ */
extern DECLSPEC int SDLCALL SDL_HapticOpened(int device_index); extern DECLSPEC int SDLCALL SDL_HapticOpened(int device_index);
/** /**
* \brief Gets the index of a haptic device. * Get the index of a haptic device.
* *
* \param haptic Haptic device to get the index of. * \param haptic the SDL_Haptic device to query
* \return The index of the haptic device or -1 on error. * \returns the index of the specified haptic device or a negative error code
* on failure; call SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.0.
* *
* \sa SDL_HapticOpen * \sa SDL_HapticOpen
* \sa SDL_HapticOpened * \sa SDL_HapticOpened
@ -887,72 +904,88 @@ extern DECLSPEC int SDLCALL SDL_HapticOpened(int device_index);
extern DECLSPEC int SDLCALL SDL_HapticIndex(SDL_Haptic * haptic); extern DECLSPEC int SDLCALL SDL_HapticIndex(SDL_Haptic * haptic);
/** /**
* \brief Gets whether or not the current mouse has haptic capabilities. * Query whether or not the current mouse has haptic capabilities.
* *
* \return SDL_TRUE if the mouse is haptic, SDL_FALSE if it isn't. * \returns SDL_TRUE if the mouse is haptic or SDL_FALSE if it isn't.
*
* \since This function is available since SDL 2.0.0.
* *
* \sa SDL_HapticOpenFromMouse * \sa SDL_HapticOpenFromMouse
*/ */
extern DECLSPEC int SDLCALL SDL_MouseIsHaptic(void); extern DECLSPEC int SDLCALL SDL_MouseIsHaptic(void);
/** /**
* \brief Tries to open a haptic device from the current mouse. * Try to open a haptic device from the current mouse.
* *
* \return The haptic device identifier or NULL on error. * \returns the haptic device identifier or NULL on failure; call
* SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.0.
* *
* \sa SDL_MouseIsHaptic
* \sa SDL_HapticOpen * \sa SDL_HapticOpen
* \sa SDL_MouseIsHaptic
*/ */
extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromMouse(void); extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromMouse(void);
/** /**
* \brief Checks to see if a joystick has haptic features. * Query if a joystick has haptic features.
* *
* \param joystick Joystick to test for haptic capabilities. * \param joystick the SDL_Joystick to test for haptic capabilities
* \return SDL_TRUE if the joystick is haptic, SDL_FALSE if it isn't * \returns SDL_TRUE if the joystick is haptic, SDL_FALSE if it isn't, or a
* or -1 if an error occurred. * negative error code on failure; call SDL_GetError() for more
* information.
*
* \since This function is available since SDL 2.0.0.
* *
* \sa SDL_HapticOpenFromJoystick * \sa SDL_HapticOpenFromJoystick
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickIsHaptic(SDL_Joystick * joystick); extern DECLSPEC int SDLCALL SDL_JoystickIsHaptic(SDL_Joystick * joystick);
/** /**
* \brief Opens a haptic device for use from a joystick device. * Open a haptic device for use from a joystick device.
* *
* You must still close the haptic device separately. It will not be closed * You must still close the haptic device separately. It will not be closed
* with the joystick. * with the joystick.
* *
* When opening from a joystick you should first close the haptic device before * When opened from a joystick you should first close the haptic device before
* closing the joystick device. If not, on some implementations the haptic * 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 * device will also get unallocated and you'll be unable to use force feedback
* on that device. * on that device.
* *
* \param joystick Joystick to create a haptic device from. * \param joystick the SDL_Joystick to create a haptic device from
* \return A valid haptic device identifier on success or NULL on error. * \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 2.0.0.
* *
* \sa SDL_HapticOpen
* \sa SDL_HapticClose * \sa SDL_HapticClose
* \sa SDL_HapticOpen
* \sa SDL_JoystickIsHaptic
*/ */
extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromJoystick(SDL_Joystick * extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromJoystick(SDL_Joystick *
joystick); joystick);
/** /**
* \brief Closes a haptic device previously opened with SDL_HapticOpen(). * Close a haptic device previously opened with SDL_HapticOpen().
* *
* \param haptic Haptic device to close. * \param haptic the SDL_Haptic device to close
*
* \sa SDL_HapticOpen
*/ */
extern DECLSPEC void SDLCALL SDL_HapticClose(SDL_Haptic * haptic); extern DECLSPEC void SDLCALL SDL_HapticClose(SDL_Haptic * haptic);
/** /**
* \brief Returns the number of effects a haptic device can store. * Get the number of effects a haptic device can store.
* *
* On some platforms this isn't fully supported, and therefore is an * On some platforms this isn't fully supported, and therefore is an
* approximation. Always check to see if your created effect was actually * approximation. Always check to see if your created effect was actually
* created and do not rely solely on SDL_HapticNumEffects(). * created and do not rely solely on SDL_HapticNumEffects().
* *
* \param haptic The haptic device to query effect max. * \param haptic the SDL_Haptic device to query
* \return The number of effects the haptic device can store or * \returns the number of effects the haptic device can store or a negative
* -1 on error. * error code on failure; call SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.0.
* *
* \sa SDL_HapticNumEffectsPlaying * \sa SDL_HapticNumEffectsPlaying
* \sa SDL_HapticQuery * \sa SDL_HapticQuery
@ -960,15 +993,17 @@ extern DECLSPEC void SDLCALL SDL_HapticClose(SDL_Haptic * haptic);
extern DECLSPEC int SDLCALL SDL_HapticNumEffects(SDL_Haptic * haptic); extern DECLSPEC int SDLCALL SDL_HapticNumEffects(SDL_Haptic * haptic);
/** /**
* \brief Returns the number of effects a haptic device can play at the same * Get the number of effects a haptic device can play at
* time. * the same time.
* *
* This is not supported on all platforms, but will always return a value. * This is not supported on all platforms, but will always return a value.
* Added here for the sake of completeness.
* *
* \param haptic The haptic device to query maximum playing effects. * \param haptic the SDL_Haptic device to query maximum playing effects
* \return The number of effects the haptic device can play at the same time * \returns the number of effects the haptic device can play at the same time
* or -1 on error. * or a negative error code on failure; call SDL_GetError() for more
* information.
*
* \since This function is available since SDL 2.0.0.
* *
* \sa SDL_HapticNumEffects * \sa SDL_HapticNumEffects
* \sa SDL_HapticQuery * \sa SDL_HapticQuery
@ -976,123 +1011,144 @@ extern DECLSPEC int SDLCALL SDL_HapticNumEffects(SDL_Haptic * haptic);
extern DECLSPEC int SDLCALL SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic); extern DECLSPEC int SDLCALL SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic);
/** /**
* \brief Gets the haptic device's supported features in bitwise manner. * Get the haptic device's supported features in bitwise manner.
* *
* Example: * \param haptic the SDL_Haptic device to query
* \code * \returns a list of supported haptic features in bitwise manner (OR'd), or 0
* if (SDL_HapticQuery(haptic) & SDL_HAPTIC_CONSTANT) { * on failure; call SDL_GetError() for more information.
* printf("We have constant haptic effect!\n");
* }
* \endcode
* *
* \param haptic The haptic device to query. * \since This function is available since SDL 2.0.0.
* \return Haptic features in bitwise manner (OR'd).
* *
* \sa SDL_HapticNumEffects
* \sa SDL_HapticEffectSupported * \sa SDL_HapticEffectSupported
* \sa SDL_HapticNumEffects
*/ */
extern DECLSPEC unsigned int SDLCALL SDL_HapticQuery(SDL_Haptic * haptic); extern DECLSPEC unsigned int SDLCALL SDL_HapticQuery(SDL_Haptic * haptic);
/** /**
* \brief Gets the number of haptic axes the device has. * Get the number of haptic axes the device has.
* *
* \sa SDL_HapticDirection * 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.
*/ */
extern DECLSPEC int SDLCALL SDL_HapticNumAxes(SDL_Haptic * haptic); extern DECLSPEC int SDLCALL SDL_HapticNumAxes(SDL_Haptic * haptic);
/** /**
* \brief Checks to see if effect is supported by haptic. * Check to see if an effect is supported by a haptic
* device.
* *
* \param haptic Haptic device to check on. * \param haptic the SDL_Haptic device to query
* \param effect Effect to check to see if it is supported. * \param effect the desired effect to query
* \return SDL_TRUE if effect is supported, SDL_FALSE if it isn't or -1 on error. * \returns SDL_TRUE if effect is supported, SDL_FALSE if it isn't, or a
* negative error code on failure; call SDL_GetError() for more
* information.
*
* \since This function is available since SDL 2.0.0.
* *
* \sa SDL_HapticQuery
* \sa SDL_HapticNewEffect * \sa SDL_HapticNewEffect
* \sa SDL_HapticQuery
*/ */
extern DECLSPEC int SDLCALL SDL_HapticEffectSupported(SDL_Haptic * haptic, extern DECLSPEC int SDLCALL SDL_HapticEffectSupported(SDL_Haptic * haptic,
SDL_HapticEffect * SDL_HapticEffect *
effect); effect);
/** /**
* \brief Creates a new haptic effect on the device. * Create a new haptic effect on a specified device.
* *
* \param haptic Haptic device to create the effect on. * \param haptic an SDL_Haptic device to create the effect on
* \param effect Properties of the effect to create. * \param effect an SDL_HapticEffect structure containing the properties of
* \return The identifier of the effect on success or -1 on error. * 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.
* *
* \sa SDL_HapticUpdateEffect
* \sa SDL_HapticRunEffect
* \sa SDL_HapticDestroyEffect * \sa SDL_HapticDestroyEffect
* \sa SDL_HapticRunEffect
* \sa SDL_HapticUpdateEffect
*/ */
extern DECLSPEC int SDLCALL SDL_HapticNewEffect(SDL_Haptic * haptic, extern DECLSPEC int SDLCALL SDL_HapticNewEffect(SDL_Haptic * haptic,
SDL_HapticEffect * effect); SDL_HapticEffect * effect);
/** /**
* \brief Updates the properties of an effect. * Update the properties of an effect.
* *
* Can be used dynamically, although behavior when dynamically changing * Can be used dynamically, although behavior when dynamically changing
* direction may be strange. Specifically the effect may reupload itself * direction may be strange. Specifically the effect may re-upload itself and
* and start playing from the start. You cannot change the type either when * start playing from the start. You also cannot change the type either when
* running SDL_HapticUpdateEffect(). * running SDL_HapticUpdateEffect().
* *
* \param haptic Haptic device that has the effect. * \param haptic the SDL_Haptic device that has the effect
* \param effect Identifier of the effect to update. * \param effect the identifier of the effect to update
* \param data New effect properties to use. * \param data an SDL_HapticEffect structure containing the new effect
* \return 0 on success or -1 on error. * 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 2.0.0.
*
* \sa SDL_HapticDestroyEffect
* \sa SDL_HapticNewEffect * \sa SDL_HapticNewEffect
* \sa SDL_HapticRunEffect * \sa SDL_HapticRunEffect
* \sa SDL_HapticDestroyEffect
*/ */
extern DECLSPEC int SDLCALL SDL_HapticUpdateEffect(SDL_Haptic * haptic, extern DECLSPEC int SDLCALL SDL_HapticUpdateEffect(SDL_Haptic * haptic,
int effect, int effect,
SDL_HapticEffect * data); SDL_HapticEffect * data);
/** /**
* \brief Runs the haptic effect on its associated haptic device. * Run the haptic effect on its associated haptic device.
* *
* If iterations are ::SDL_HAPTIC_INFINITY, it'll run the effect over and over * To repeat the effect over and over indefinitely, set `iterations` to
* repeating the envelope (attack and fade) every time. If you only want the * `SDL_HAPTIC_INFINITY`. (Repeats the envelope - attack and fade.) To make
* effect to last forever, set ::SDL_HAPTIC_INFINITY in the effect's length * one instance of the effect last indefinitely (so the effect does not fade),
* parameter. * set the effect's `length` in its structure/union to `SDL_HAPTIC_INFINITY`
* instead.
* *
* \param haptic Haptic device to run the effect on. * \param haptic the SDL_Haptic device to run the effect on
* \param effect Identifier of the haptic effect to run. * \param effect the ID of the haptic effect to run
* \param iterations Number of iterations to run the effect. Use * \param iterations the number of iterations to run the effect; use
* ::SDL_HAPTIC_INFINITY for infinity. * `SDL_HAPTIC_INFINITY` to repeat forever
* \return 0 on success or -1 on error. * \returns 0 on success or a negative error code on failure; call
* SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.0.
* *
* \sa SDL_HapticStopEffect
* \sa SDL_HapticDestroyEffect * \sa SDL_HapticDestroyEffect
* \sa SDL_HapticGetEffectStatus * \sa SDL_HapticGetEffectStatus
* \sa SDL_HapticStopEffect
*/ */
extern DECLSPEC int SDLCALL SDL_HapticRunEffect(SDL_Haptic * haptic, extern DECLSPEC int SDLCALL SDL_HapticRunEffect(SDL_Haptic * haptic,
int effect, int effect,
Uint32 iterations); Uint32 iterations);
/** /**
* \brief Stops the haptic effect on its associated haptic device. * 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.
* *
* \param haptic Haptic device to stop the effect on. * \since This function is available since SDL 2.0.0.
* \param effect Identifier of the effect to stop.
* \return 0 on success or -1 on error.
* *
* \sa SDL_HapticRunEffect
* \sa SDL_HapticDestroyEffect * \sa SDL_HapticDestroyEffect
* \sa SDL_HapticRunEffect
*/ */
extern DECLSPEC int SDLCALL SDL_HapticStopEffect(SDL_Haptic * haptic, extern DECLSPEC int SDLCALL SDL_HapticStopEffect(SDL_Haptic * haptic,
int effect); int effect);
/** /**
* \brief Destroys a haptic effect on the device. * Destroy a haptic effect on the device.
* *
* This will stop the effect if it's running. Effects are automatically * This will stop the effect if it's running. Effects are automatically
* destroyed when the device is closed. * destroyed when the device is closed.
* *
* \param haptic Device to destroy the effect on. * \param haptic the SDL_Haptic device to destroy the effect on
* \param effect Identifier of the effect to destroy. * \param effect the ID of the haptic effect to destroy
*
* \since This function is available since SDL 2.0.0.
* *
* \sa SDL_HapticNewEffect * \sa SDL_HapticNewEffect
*/ */
@ -1100,13 +1156,17 @@ extern DECLSPEC void SDLCALL SDL_HapticDestroyEffect(SDL_Haptic * haptic,
int effect); int effect);
/** /**
* \brief Gets the status of the current effect on the haptic device. * Get the status of the current effect on the specified
* haptic device.
* *
* Device must support the ::SDL_HAPTIC_STATUS feature. * Device must support the SDL_HAPTIC_STATUS feature.
* *
* \param haptic Haptic device to query the effect status on. * \param haptic the SDL_Haptic device to query for the effect status on
* \param effect Identifier of the effect to query its status. * \param effect the ID of the haptic effect to query its status
* \return 0 if it isn't playing, 1 if it is playing or -1 on error. * \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 2.0.0.
* *
* \sa SDL_HapticRunEffect * \sa SDL_HapticRunEffect
* \sa SDL_HapticStopEffect * \sa SDL_HapticStopEffect
@ -1115,34 +1175,38 @@ extern DECLSPEC int SDLCALL SDL_HapticGetEffectStatus(SDL_Haptic * haptic,
int effect); int effect);
/** /**
* \brief Sets the global gain of the device. * Set the global gain of the specified haptic device.
* *
* Device must support the ::SDL_HAPTIC_GAIN feature. * Device must support the SDL_HAPTIC_GAIN feature.
* *
* The user may specify the maximum gain by setting the environment variable * 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_HAPTIC_GAIN_MAX` which should be between 0 and 100. All calls to
* SDL_HapticSetGain() will scale linearly using SDL_HAPTIC_GAIN_MAX as the * SDL_HapticSetGain() will scale linearly using `SDL_HAPTIC_GAIN_MAX` as the
* maximum. * maximum.
* *
* \param haptic Haptic device to set the gain on. * \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. * \param gain value to set the gain to, should be between 0 and 100 (0 - 100)
* \return 0 on success or -1 on error. * \returns 0 on success or a negative error code on failure; call
* SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.0.
* *
* \sa SDL_HapticQuery * \sa SDL_HapticQuery
*/ */
extern DECLSPEC int SDLCALL SDL_HapticSetGain(SDL_Haptic * haptic, int gain); extern DECLSPEC int SDLCALL SDL_HapticSetGain(SDL_Haptic * haptic, int gain);
/** /**
* \brief Sets the global autocenter of the device. * Set the global autocenter of the device.
* *
* Autocenter should be between 0 and 100. Setting it to 0 will disable * Autocenter should be between 0 and 100. Setting it to 0 will disable
* autocentering. * autocentering.
* *
* Device must support the ::SDL_HAPTIC_AUTOCENTER feature. * Device must support the SDL_HAPTIC_AUTOCENTER feature.
* *
* \param haptic Haptic device to set autocentering on. * \param haptic the SDL_Haptic device to set autocentering on
* \param autocenter Value to set autocenter to, 0 disables autocentering. * \param autocenter value to set autocenter to (0-100)
* \return 0 on success or -1 on error. * \returns 0 on success or a negative error code on failure; call
* SDL_GetError() for more information.
* *
* \sa SDL_HapticQuery * \sa SDL_HapticQuery
*/ */
@ -1150,46 +1214,51 @@ extern DECLSPEC int SDLCALL SDL_HapticSetAutocenter(SDL_Haptic * haptic,
int autocenter); int autocenter);
/** /**
* \brief Pauses a haptic device. * Pause a haptic device.
* *
* Device must support the ::SDL_HAPTIC_PAUSE feature. Call * Device must support the `SDL_HAPTIC_PAUSE` feature. Call
* SDL_HapticUnpause() to resume playback. * SDL_HapticUnpause() to resume playback.
* *
* Do not modify the effects nor add new ones while the device is paused. * Do not modify the effects nor add new ones while the device is paused. That
* That can cause all sorts of weird errors. * can cause all sorts of weird errors.
* *
* \param haptic Haptic device to pause. * \param haptic the SDL_Haptic device to pause
* \return 0 on success or -1 on error. * \returns 0 on success or a negative error code on failure; call
* SDL_GetError() for more information.
* *
* \sa SDL_HapticUnpause * \sa SDL_HapticUnpause
*/ */
extern DECLSPEC int SDLCALL SDL_HapticPause(SDL_Haptic * haptic); extern DECLSPEC int SDLCALL SDL_HapticPause(SDL_Haptic * haptic);
/** /**
* \brief Unpauses a haptic device. * Unpause a haptic device.
* *
* Call to unpause after SDL_HapticPause(). * Call to unpause after SDL_HapticPause().
* *
* \param haptic Haptic device to unpause. * \param haptic the SDL_Haptic device to unpause
* \return 0 on success or -1 on error. * \returns 0 on success or a negative error code on failure; call
* SDL_GetError() for more information.
* *
* \sa SDL_HapticPause * \sa SDL_HapticPause
*/ */
extern DECLSPEC int SDLCALL SDL_HapticUnpause(SDL_Haptic * haptic); extern DECLSPEC int SDLCALL SDL_HapticUnpause(SDL_Haptic * haptic);
/** /**
* \brief Stops all the currently playing effects on a haptic device. * Stop all the currently playing effects on a haptic device.
* *
* \param haptic Haptic device to stop. * \param haptic the SDL_Haptic device to stop
* \return 0 on success or -1 on error. * \returns 0 on success or a negative error code on failure; call
* SDL_GetError() for more information.
*/ */
extern DECLSPEC int SDLCALL SDL_HapticStopAll(SDL_Haptic * haptic); extern DECLSPEC int SDLCALL SDL_HapticStopAll(SDL_Haptic * haptic);
/** /**
* \brief Checks to see if rumble is supported on a haptic device. * Check whether rumble is supported on a haptic device.
* *
* \param haptic Haptic device to check to see if it supports rumble. * \param haptic haptic device to check for rumble support
* \return SDL_TRUE if effect is supported, SDL_FALSE if it isn't or -1 on error. * \returns SDL_TRUE if effect is supported, SDL_FALSE if it isn't, or a
* negative error code on failure; call SDL_GetError() for more
* information.
* *
* \sa SDL_HapticRumbleInit * \sa SDL_HapticRumbleInit
* \sa SDL_HapticRumblePlay * \sa SDL_HapticRumblePlay
@ -1198,41 +1267,46 @@ extern DECLSPEC int SDLCALL SDL_HapticStopAll(SDL_Haptic * haptic);
extern DECLSPEC int SDLCALL SDL_HapticRumbleSupported(SDL_Haptic * haptic); extern DECLSPEC int SDLCALL SDL_HapticRumbleSupported(SDL_Haptic * haptic);
/** /**
* \brief Initializes the haptic device for simple rumble playback. * Initialize a haptic device for simple rumble playback.
* *
* \param haptic Haptic device to initialize for simple rumble playback. * \param haptic the haptic device to initialize for simple rumble playback
* \return 0 on success or -1 on error. * \returns 0 on success or a negative error code on failure; call
* SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.0.
* *
* \sa SDL_HapticOpen * \sa SDL_HapticOpen
* \sa SDL_HapticRumbleSupported
* \sa SDL_HapticRumblePlay * \sa SDL_HapticRumblePlay
* \sa SDL_HapticRumbleStop * \sa SDL_HapticRumbleStop
* \sa SDL_HapticRumbleSupported
*/ */
extern DECLSPEC int SDLCALL SDL_HapticRumbleInit(SDL_Haptic * haptic); extern DECLSPEC int SDLCALL SDL_HapticRumbleInit(SDL_Haptic * haptic);
/** /**
* \brief Runs simple rumble on a haptic device * Run a simple rumble effect on a haptic device.
* *
* \param haptic Haptic device to play rumble effect on. * \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 strength strength of the rumble to play as a 0-1 float value
* \param length Length of the rumble to play in milliseconds. * \param length length of the rumble to play in milliseconds
* \return 0 on success or -1 on error. * \returns 0 on success or a negative error code on failure; call
* SDL_GetError() for more information.
* *
* \sa SDL_HapticRumbleSupported
* \sa SDL_HapticRumbleInit * \sa SDL_HapticRumbleInit
* \sa SDL_HapticRumbleStop * \sa SDL_HapticRumbleStop
* \sa SDL_HapticRumbleSupported
*/ */
extern DECLSPEC int SDLCALL SDL_HapticRumblePlay(SDL_Haptic * haptic, float strength, Uint32 length ); extern DECLSPEC int SDLCALL SDL_HapticRumblePlay(SDL_Haptic * haptic, float strength, Uint32 length );
/** /**
* \brief Stops the simple rumble on a haptic device. * Stop the simple rumble on a haptic device.
* *
* \param haptic Haptic to stop the rumble on. * \param haptic the haptic device to stop the rumble effect on
* \return 0 on success or -1 on error. * \returns 0 on success or a negative error code on failure; call
* SDL_GetError() for more information.
* *
* \sa SDL_HapticRumbleSupported
* \sa SDL_HapticRumbleInit * \sa SDL_HapticRumbleInit
* \sa SDL_HapticRumblePlay * \sa SDL_HapticRumblePlay
* \sa SDL_HapticRumbleSupported
*/ */
extern DECLSPEC int SDLCALL SDL_HapticRumbleStop(SDL_Haptic * haptic); extern DECLSPEC int SDLCALL SDL_HapticRumbleStop(SDL_Haptic * haptic);

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -604,17 +604,6 @@ extern "C" {
*/ */
#define SDL_HINT_JOYSTICK_HIDAPI_PS4 "SDL_JOYSTICK_HIDAPI_PS4" #define SDL_HINT_JOYSTICK_HIDAPI_PS4 "SDL_JOYSTICK_HIDAPI_PS4"
/**
* \brief A variable controlling whether the HIDAPI driver for PS5 controllers should be used.
*
* This 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
*/
#define SDL_HINT_JOYSTICK_HIDAPI_PS5 "SDL_JOYSTICK_HIDAPI_PS5"
/** /**
* \brief A variable controlling whether extended input reports should be used for PS4 controllers when using the HIDAPI driver. * \brief A variable controlling whether extended input reports should be used for PS4 controllers when using the HIDAPI driver.
* *
@ -627,9 +616,64 @@ extern "C" {
* *
* Once extended reports are enabled, they can not be disabled without * Once extended reports are enabled, they can not be disabled without
* power cycling the controller. * 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.
*/ */
#define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE "SDL_JOYSTICK_HIDAPI_PS4_RUMBLE" #define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE "SDL_JOYSTICK_HIDAPI_PS4_RUMBLE"
/**
* \brief A variable controlling whether the HIDAPI driver for PS5 controllers should be used.
*
* This 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
*/
#define SDL_HINT_JOYSTICK_HIDAPI_PS5 "SDL_JOYSTICK_HIDAPI_PS5"
/**
* \brief A variable controlling whether extended input reports should be used for PS5 controllers when using the HIDAPI driver.
*
* This variable can be set to the following values:
* "0" - extended reports are not enabled (the 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.
*/
#define SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE "SDL_JOYSTICK_HIDAPI_PS5_RUMBLE"
/**
* \brief A variable controlling whether the player LEDs should be lit to indicate which player is associated with a PS5 controller.
*
* This variable can be set to the following values:
* "0" - player LEDs are not enabled
* "1" - player LEDs are enabled (the default)
*/
#define SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED "SDL_JOYSTICK_HIDAPI_PS5_PLAYER_LED"
/**
* \brief A variable controlling whether the HIDAPI driver for Google Stadia controllers should be used.
*
* This 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
*/
#define SDL_HINT_JOYSTICK_HIDAPI_STADIA "SDL_JOYSTICK_HIDAPI_STADIA"
/** /**
* \brief A variable controlling whether the HIDAPI driver for Steam Controllers should be used. * \brief A variable controlling whether the HIDAPI driver for Steam Controllers should be used.
* *
@ -652,6 +696,26 @@ extern "C" {
*/ */
#define SDL_HINT_JOYSTICK_HIDAPI_SWITCH "SDL_JOYSTICK_HIDAPI_SWITCH" #define SDL_HINT_JOYSTICK_HIDAPI_SWITCH "SDL_JOYSTICK_HIDAPI_SWITCH"
/**
* \brief A variable controlling whether the Home button LED should be turned on when a Nintendo Switch controller is opened
*
* This variable can be set to the following values:
* "0" - home button LED is left off
* "1" - home button LED is turned on (the default)
*/
#define SDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED "SDL_JOYSTICK_HIDAPI_SWITCH_HOME_LED"
/**
* \brief A variable controlling whether Switch Joy-Cons should be treated the same as Switch Pro Controllers when using the HIDAPI driver.
*
* This variable can be set to the following values:
* "0" - basic Joy-Con support with no analog input (the default)
* "1" - Joy-Cons treated as half full Pro Controllers with analog inputs and sensors
*
* This does not combine Joy-Cons into a single controller. That's up to the user.
*/
#define SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS "SDL_JOYSTICK_HIDAPI_JOY_CONS"
/** /**
* \brief A variable controlling whether the HIDAPI driver for XBox controllers should be used. * \brief A variable controlling whether the HIDAPI driver for XBox controllers should be used.
* *
@ -743,7 +807,7 @@ extern "C" {
* *
* The higher resolution the timer, the more frequently the CPU services * The higher resolution the timer, the more frequently the CPU services
* timer interrupts, and the more precise delays are, but this takes up * timer interrupts, and the more precise delays are, but this takes up
* power and CPU time. This hint is only used on Windows 7 and earlier. * power and CPU time. This hint is only used on Windows.
* *
* See this blog post for more information: * See this blog post for more information:
* http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/ * http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/
@ -1181,6 +1245,59 @@ extern "C" {
*/ */
#define SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING "SDL_WINDOWS_DISABLE_THREAD_NAMING" #define SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING "SDL_WINDOWS_DISABLE_THREAD_NAMING"
/**
* \brief Force SDL to use Critical Sections for mutexes on Windows.
* On Windows 7 and newer, Slim Reader/Writer Locks are available.
* They offer better performance, allocate no kernel ressources and
* use less memory. SDL will fall back to Critical Sections on older
* OS versions or if forced to by this hint.
* This also affects Condition Variables. When SRW mutexes are used,
* SDL will use Windows Condition Variables as well. Else, a generic
* SDL_cond implementation will be used that works with all mutexes.
*
* This variable can be set to the following values:
* "0" - Use SRW Locks when available. If not, fall back to Critical Sections. (default)
* "1" - Force the use of Critical Sections in all cases.
*
*/
#define SDL_HINT_WINDOWS_FORCE_MUTEX_CRITICAL_SECTIONS "SDL_WINDOWS_FORCE_MUTEX_CRITICAL_SECTIONS"
/**
* \brief Force SDL to use 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.
*
* This variable can be set to the following values:
* "0" - Use Atomics and WaitOnAddress API when available. If not, fall back to Kernel Objects. (default)
* "1" - Force the use of Kernel Objects in all cases.
*
*/
#define SDL_HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL "SDL_WINDOWS_FORCE_SEMAPHORE_KERNEL"
/**
* \brief Use 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.
*
* This hint must be set before initializing the video subsystem.
*
* 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
*
* This 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)
*
*/
#define SDL_HINT_WINDOWS_USE_D3D9EX "SDL_WINDOWS_USE_D3D9EX"
/** /**
* \brief Tell SDL which Dispmanx layer to use on a Raspberry PI * \brief Tell SDL which Dispmanx layer to use on a Raspberry PI
* *
@ -1202,11 +1319,35 @@ extern "C" {
* *
* Since it's driver-specific, it's only supported where possible and * Since it's driver-specific, it's only supported where possible and
* implemented. Currently supported the following drivers: * implemented. Currently supported the following drivers:
*
* - KMSDRM (kmsdrm) * - KMSDRM (kmsdrm)
* - Raspberry Pi (raspberrypi) * - Raspberry Pi (raspberrypi)
*/ */
#define SDL_HINT_VIDEO_DOUBLE_BUFFER "SDL_VIDEO_DOUBLE_BUFFER" #define SDL_HINT_VIDEO_DOUBLE_BUFFER "SDL_VIDEO_DOUBLE_BUFFER"
/**
* \brief Determines whether SDL enforces that DRM master is required 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.
*
* This hint must be set before initializing the video subsystem.
*
* This 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)
*/
#define SDL_HINT_KMSDRM_REQUIRE_DRM_MASTER "SDL_KMSDRM_REQUIRE_DRM_MASTER"
/** /**
* \brief A variable controlling what driver to use for OpenGL ES contexts. * \brief A variable controlling what driver to use for OpenGL ES contexts.
* *
@ -1470,6 +1611,39 @@ extern "C" {
*/ */
#define SDL_HINT_AUDIO_DEVICE_STREAM_NAME "SDL_AUDIO_DEVICE_STREAM_NAME" #define SDL_HINT_AUDIO_DEVICE_STREAM_NAME "SDL_AUDIO_DEVICE_STREAM_NAME"
/**
* \brief 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/capture 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.
*
* On targets where this is not supported, this hint does nothing.
*/
#define SDL_HINT_AUDIO_DEVICE_STREAM_ROLE "SDL_AUDIO_DEVICE_STREAM_ROLE"
/**
* \brief 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)
*/
#define SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED "SDL_ALLOW_ALT_TAB_WHILE_GRABBED"
/** /**
* \brief Override for SDL_GetPreferredLocales() * \brief Override for SDL_GetPreferredLocales()
@ -1498,71 +1672,113 @@ typedef enum
/** /**
* \brief Set a hint with a specific priority * Set a hint with a specific priority.
* *
* The priority controls the behavior when setting a hint that already * The priority controls the behavior when setting a hint that already has a
* has a value. Hints will replace existing hints of their priority and * value. Hints will replace existing hints of their priority and lower.
* lower. Environment variables are considered to have override priority. * Environment variables are considered to have override priority.
* *
* \return SDL_TRUE if the hint was set, SDL_FALSE otherwise * \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.
*
* \sa SDL_GetHint
* \sa SDL_SetHint
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_SetHintWithPriority(const char *name, extern DECLSPEC SDL_bool SDLCALL SDL_SetHintWithPriority(const char *name,
const char *value, const char *value,
SDL_HintPriority priority); SDL_HintPriority priority);
/** /**
* \brief Set a hint with normal priority * Set a hint with normal priority.
* *
* \return SDL_TRUE if the hint was set, SDL_FALSE otherwise * 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.
*
* \sa SDL_GetHint
* \sa SDL_SetHintWithPriority
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_SetHint(const char *name, extern DECLSPEC SDL_bool SDLCALL SDL_SetHint(const char *name,
const char *value); const char *value);
/** /**
* \brief Get a hint * Get the value of a hint.
* *
* \return The string value of a hint variable. * \param name the hint to query
* \returns the string value of a hint or NULL if the hint isn't set.
*
* \sa SDL_SetHint
* \sa SDL_SetHintWithPriority
*/ */
extern DECLSPEC const char * SDLCALL SDL_GetHint(const char *name); extern DECLSPEC const char * SDLCALL SDL_GetHint(const char *name);
/** /**
* \brief Get a hint * Get the boolean value of a hint variable.
* *
* \return 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 2.0.5.
*
* \sa SDL_GetHint
* \sa SDL_SetHint
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_GetHintBoolean(const char *name, SDL_bool default_value); extern DECLSPEC SDL_bool SDLCALL SDL_GetHintBoolean(const char *name, SDL_bool default_value);
/** /**
* \brief type definition of the hint callback function. * 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
*/ */
typedef void (SDLCALL *SDL_HintCallback)(void *userdata, const char *name, const char *oldValue, const char *newValue); typedef void (SDLCALL *SDL_HintCallback)(void *userdata, const char *name, const char *oldValue, const char *newValue);
/** /**
* \brief Add a function to watch a particular hint * Add a function to watch a particular hint.
* *
* \param name The hint to watch * \param name the hint to watch
* \param callback The function to call when the hint value changes * \param callback An SDL_HintCallback function that will be called when the
* \param userdata A pointer to pass to the callback function * hint value changes
* \param userdata a pointer to pass to the callback function
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_DelHintCallback
*/ */
extern DECLSPEC void SDLCALL SDL_AddHintCallback(const char *name, extern DECLSPEC void SDLCALL SDL_AddHintCallback(const char *name,
SDL_HintCallback callback, SDL_HintCallback callback,
void *userdata); void *userdata);
/** /**
* \brief Remove a function watching a particular hint * Remove a function watching a particular hint.
* *
* \param name The hint being watched * \param name the hint being watched
* \param callback The function being called when the hint value changes * \param callback An SDL_HintCallback function that will be called when the
* \param userdata A pointer being passed to the callback function * hint value changes
* \param userdata a pointer being passed to the callback function
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_AddHintCallback
*/ */
extern DECLSPEC void SDLCALL SDL_DelHintCallback(const char *name, extern DECLSPEC void SDLCALL SDL_DelHintCallback(const char *name,
SDL_HintCallback callback, SDL_HintCallback callback,
void *userdata); void *userdata);
/** /**
* \brief Clear all hints * Clear all hints.
* *
* This function is called during SDL_Quit() to free stored hints. * This function is automatically called during SDL_Quit().
*/ */
extern DECLSPEC void SDLCALL SDL_ClearHints(void); extern DECLSPEC void SDLCALL SDL_ClearHints(void);

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -30,10 +30,12 @@
* The term "instance_id" is the current instantiation of a joystick device in the system, if the joystick is removed and then re-inserted * 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. * 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.
*
* The term JoystickGUID is a stable 128-bit identifier for a joystick device that does not change over time, it identifies class of * The term JoystickGUID is 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. * the device (a X360 wired controller for example). This identifier is platform dependent.
*
*
*/ */
#ifndef SDL_joystick_h_ #ifndef SDL_joystick_h_
@ -124,17 +126,43 @@ typedef enum
* and game controller events will not be delivered. * and game controller events will not be delivered.
*/ */
extern DECLSPEC void SDLCALL SDL_LockJoysticks(void); extern DECLSPEC void SDLCALL SDL_LockJoysticks(void);
/**
* Unlocking for multi-threaded access to the joystick API
*
* If you are using the joystick API or handling events from multiple threads
* you should use these locking functions to protect access to the joysticks.
*
* In particular, you are guaranteed that the joystick list won't change, so
* the API functions that take a joystick index will be valid, and joystick
* and game controller events will not be delivered.
*/
extern DECLSPEC void SDLCALL SDL_UnlockJoysticks(void); extern DECLSPEC void SDLCALL SDL_UnlockJoysticks(void);
/** /**
* Count the number of joysticks attached to the system right now * Count the number of joysticks attached to the system.
*
* \returns the number of attached joysticks on success or a negative error
* code on failure; call SDL_GetError() for more information.
*
* \sa SDL_JoystickName
* \sa SDL_JoystickOpen
*/ */
extern DECLSPEC int SDLCALL SDL_NumJoysticks(void); extern DECLSPEC int SDLCALL SDL_NumJoysticks(void);
/** /**
* Get the implementation dependent name of a joystick. * Get the implementation dependent name of a joystick.
*
* This can be called before any joysticks are opened. * This can be called before any joysticks are opened.
* If no name can be found, this function returns NULL. *
* \param device_index the index of the joystick to query (the N'th joystick
* on the system)
* \returns the name of the selected joystick. If no name can be found, this
* function returns NULL; call SDL_GetError() for more information.
*
* \sa SDL_JoystickName
* \sa SDL_JoystickOpen
*/ */
extern DECLSPEC const char *SDLCALL SDL_JoystickNameForIndex(int device_index); extern DECLSPEC const char *SDLCALL SDL_JoystickNameForIndex(int device_index);
@ -145,69 +173,129 @@ extern DECLSPEC const char *SDLCALL SDL_JoystickNameForIndex(int device_index);
extern DECLSPEC int SDLCALL SDL_JoystickGetDevicePlayerIndex(int device_index); extern DECLSPEC int SDLCALL SDL_JoystickGetDevicePlayerIndex(int device_index);
/** /**
* Return the GUID for the joystick at this index * Get the implementation-dependent GUID for the joystick
* This can be called before any joysticks are opened. * at a given device index.
*
* This function can be called before any joysticks are opened.
*
* \param device_index the index of the joystick to query (the N'th joystick
* on the system
* \returns the GUID of the selected joystick. If called on an invalid index,
* this function returns a zero GUID
*
* \sa SDL_JoystickGetGUID
* \sa SDL_JoystickGetGUIDString
*/ */
extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetDeviceGUID(int device_index); extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetDeviceGUID(int device_index);
/** /**
* Get the USB vendor ID of a joystick, if available. * Get the USB vendor ID of a joystick, if available.
*
* This can be called before any joysticks are opened. * This can be called before any joysticks are opened.
* If the vendor ID isn't available this function returns 0. * If the vendor ID isn't available this function returns 0.
*
* \param device_index the index of the joystick to query (the N'th joystick
* on the system
* \returns the USB vendor ID of the selected joystick. If called on an
* invalid index, this function returns zero
*/ */
extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceVendor(int device_index); extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceVendor(int device_index);
/** /**
* Get the USB product ID of a joystick, if available. * Get the USB product ID of a joystick, if available.
*
* This can be called before any joysticks are opened. * This can be called before any joysticks are opened.
* If the product ID isn't available this function returns 0. * If the product ID isn't available this function returns 0.
*
* \param device_index the index of the joystick to query (the N'th joystick
* on the system
* \returns the USB product ID of the selected joystick. If called on an
* invalid index, this function returns zero
*/ */
extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceProduct(int device_index); extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceProduct(int device_index);
/** /**
* Get the product version of a joystick, if available. * Get the product version of a joystick, if available.
*
* This can be called before any joysticks are opened. * This can be called before any joysticks are opened.
* If the product version isn't available this function returns 0. * If the product version isn't available this function returns 0.
*
* \param device_index the index of the joystick to query (the N'th joystick
* on the system
* \returns the product version of the selected joystick. If called on an
* invalid index, this function returns zero
*/ */
extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceProductVersion(int device_index); extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceProductVersion(int device_index);
/** /**
* Get the type of a joystick, if available. * Get the type of a joystick, if available.
*
* This can be called before any joysticks are opened. * This can be called before any joysticks are opened.
*
* \param device_index the index of the joystick to query (the N'th joystick
* on the system
* \returns the SDL_JoystickType of the selected joystick. If called on an
* invalid index, this function returns `SDL_JOYSTICK_TYPE_UNKNOWN`
*/ */
extern DECLSPEC SDL_JoystickType SDLCALL SDL_JoystickGetDeviceType(int device_index); extern DECLSPEC SDL_JoystickType SDLCALL SDL_JoystickGetDeviceType(int device_index);
/** /**
* Get the instance ID of a joystick. * Get the instance ID of a joystick.
*
* This can be called before any joysticks are opened. * This can be called before any joysticks are opened.
* If the index is out of range, this function will return -1. * If the index is out of range, this function will return -1.
*
* \param device_index the index of the joystick to query (the N'th joystick
* on the system
* \returns the instance id of the selected joystick. If called on an invalid
* index, this function returns zero
*/ */
extern DECLSPEC SDL_JoystickID SDLCALL SDL_JoystickGetDeviceInstanceID(int device_index); extern DECLSPEC SDL_JoystickID SDLCALL SDL_JoystickGetDeviceInstanceID(int device_index);
/** /**
* Open a joystick for use. * Open a joystick for use.
* The index passed as an argument refers to the N'th joystick on the system.
* This index is not the value which will identify this joystick in future
* joystick events. The joystick's instance id (::SDL_JoystickID) will be used
* there instead.
* *
* \return A joystick identifier, or NULL if an error occurred. * The `device_index` argument refers to the N'th joystick presently
* recognized by SDL on the system. It is **NOT** the same as the instance ID
* used to identify the joystick in future events. See
* SDL_JoystickInstanceID() for more details about instance IDs.
*
* The joystick subsystem must be initialized before a joystick can be opened
* for use.
*
* \param device_index the index of the joystick to query
* \returns a joystick identifier or NULL if an error occurred; call
* SDL_GetError() for more information.
*
* \sa SDL_JoystickClose
* \sa SDL_JoystickInstanceID
*/ */
extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickOpen(int device_index); extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickOpen(int device_index);
/** /**
* Return the SDL_Joystick associated with an instance id. * Get the SDL_Joystick associated with an instance id.
*
* \param instance_id the instance id 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 2.0.4.
*/ */
extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickFromInstanceID(SDL_JoystickID instance_id); extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickFromInstanceID(SDL_JoystickID instance_id);
/** /**
* Return the SDL_Joystick associated with a player index. * 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.
*/ */
extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickFromPlayerIndex(int player_index); extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickFromPlayerIndex(int player_index);
/** /**
* Attaches a new virtual joystick. * Attach a new virtual joystick.
* Returns the joystick's device index, or -1 if an error occurred. *
* \returns the joystick's device index, or -1 if an error occurred.
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickAttachVirtual(SDL_JoystickType type, extern DECLSPEC int SDLCALL SDL_JoystickAttachVirtual(SDL_JoystickType type,
int naxes, int naxes,
@ -215,68 +303,144 @@ extern DECLSPEC int SDLCALL SDL_JoystickAttachVirtual(SDL_JoystickType type,
int nhats); int nhats);
/** /**
* Detaches a virtual joystick * Detach a virtual joystick.
* Returns 0 on success, or -1 if an error occurred. *
* \param device_index a value previously returned from
* SDL_JoystickAttachVirtual()
* \returns 0 on success, or -1 if an error occurred.
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickDetachVirtual(int device_index); extern DECLSPEC int SDLCALL SDL_JoystickDetachVirtual(int device_index);
/** /**
* Indicates whether or not a virtual-joystick is at a given device index. * Query whether or not the joystick at a given device index is virtual.
*
* \param device_index a joystick device index.
* \returns SDL_TRUE if the joystick is virtual, SDL_FALSE otherwise.
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_JoystickIsVirtual(int device_index); extern DECLSPEC SDL_bool SDLCALL SDL_JoystickIsVirtual(int device_index);
/** /**
* Set values on an opened, virtual-joystick's controls. * Set values on an opened, virtual-joystick's axis.
*
* Please note that values set here will not be applied until the next * Please note that values set here will not be applied until the next
* call to SDL_JoystickUpdate, which can either be called directly, * call to SDL_JoystickUpdate, which can either be called directly,
* or can be called indirectly through various other SDL APIS, * or can be called indirectly through various other SDL APIs,
* including, but not limited to the following: SDL_PollEvent, * including, but not limited to the following: SDL_PollEvent,
* SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent. * SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
* *
* Returns 0 on success, -1 on error. * \param joystick the virtual joystick on which to set state.
* \param axis the specific axis on the virtual joystick to set.
* \param value the new value for the specified axis.
* \returns 0 on success, -1 on error.
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualAxis(SDL_Joystick *joystick, int axis, Sint16 value); extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualAxis(SDL_Joystick *joystick, int axis, Sint16 value);
/**
* Set values on an opened, virtual-joystick's button.
*
* Please note that values set here will not be applied until the next
* call to SDL_JoystickUpdate, 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 specific button on the virtual joystick to set.
* \param value the new value for the specified button.
* \returns 0 on success, -1 on error.
*/
extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualButton(SDL_Joystick *joystick, int button, Uint8 value); extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualButton(SDL_Joystick *joystick, int button, Uint8 value);
/**
* Set values on an opened, virtual-joystick's hat.
*
* Please note that values set here will not be applied until the next
* call to SDL_JoystickUpdate, 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 specific hat on the virtual joystick to set.
* \param value the new value for the specified hat.
* \returns 0 on success, -1 on error.
*/
extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualHat(SDL_Joystick *joystick, int hat, Uint8 value); extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualHat(SDL_Joystick *joystick, int hat, Uint8 value);
/** /**
* Return the name for this currently opened joystick. * Get the implementation dependent name of a joystick.
* If no name can be found, this function returns NULL. *
* \param joystick the SDL_Joystick obtained from SDL_JoystickOpen()
* \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 2.0.0.
*
* \sa SDL_JoystickNameForIndex
* \sa SDL_JoystickOpen
*/ */
extern DECLSPEC const char *SDLCALL SDL_JoystickName(SDL_Joystick *joystick); extern DECLSPEC const char *SDLCALL SDL_JoystickName(SDL_Joystick *joystick);
/** /**
* Get the player index of an opened joystick, or -1 if it's not available * Get the player index of an opened joystick.
* *
* For XInput controllers this returns the XInput user index. * 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_JoystickOpen()
* \returns the player index, or -1 if it's not available.
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickGetPlayerIndex(SDL_Joystick *joystick); extern DECLSPEC int SDLCALL SDL_JoystickGetPlayerIndex(SDL_Joystick *joystick);
/** /**
* Set the player index of an opened joystick * Set the player index of an opened joystick.
*
* \param joystick the SDL_Joystick obtained from SDL_JoystickOpen()
* \param player_index the player index to set.
*/ */
extern DECLSPEC void SDLCALL SDL_JoystickSetPlayerIndex(SDL_Joystick *joystick, int player_index); extern DECLSPEC void SDLCALL SDL_JoystickSetPlayerIndex(SDL_Joystick *joystick, int player_index);
/** /**
* Return the GUID for this opened joystick * Get the implementation-dependent GUID for the joystick.
*
* This function requires an open joystick.
*
* \param joystick the SDL_Joystick obtained from SDL_JoystickOpen()
* \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.
*
* \sa SDL_JoystickGetDeviceGUID
* \sa SDL_JoystickGetGUIDString
*/ */
extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUID(SDL_Joystick *joystick); extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUID(SDL_Joystick *joystick);
/** /**
* Get the USB vendor ID of an opened joystick, if available. * Get the USB vendor ID of an opened joystick, if available.
*
* If the vendor ID isn't available this function returns 0. * If the vendor ID isn't available this function returns 0.
*
* \param joystick the SDL_Joystick obtained from SDL_JoystickOpen()
* \returns the USB vendor ID of the selected joystick, or 0 if unavailable.
*/ */
extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetVendor(SDL_Joystick *joystick); extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetVendor(SDL_Joystick *joystick);
/** /**
* Get the USB product ID of an opened joystick, if available. * Get the USB product ID of an opened joystick, if available.
*
* If the product ID isn't available this function returns 0. * If the product ID isn't available this function returns 0.
*
* \param joystick the SDL_Joystick obtained from SDL_JoystickOpen()
* \returns the USB product ID of the selected joystick, or 0 if unavailable.
*/ */
extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetProduct(SDL_Joystick *joystick); extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetProduct(SDL_Joystick *joystick);
/** /**
* Get the product version of an opened joystick, if available. * Get the product version of an opened joystick, if available.
* If the product version isn't available this function returns 0. * If the product version isn't available this function returns 0.
*
* \param joystick the SDL_Joystick obtained from SDL_JoystickOpen()
* \returns the product version of the selected joystick, or 0 if unavailable.
*/ */
extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetProductVersion(SDL_Joystick *joystick); extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetProductVersion(SDL_Joystick *joystick);
@ -284,63 +448,136 @@ extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetProductVersion(SDL_Joystick *joyst
* Get the serial number of an opened joystick, if available. * Get the serial number of an opened joystick, if available.
* *
* Returns the serial number of the joystick, or NULL if it is not available. * Returns the serial number of the joystick, or NULL if it is not available.
*
* \param joystick the SDL_Joystick obtained from SDL_JoystickOpen()
* \returns the serial number of the selected joystick, or NULL if unavailable.
*/ */
extern DECLSPEC const char * SDLCALL SDL_JoystickGetSerial(SDL_Joystick *joystick); extern DECLSPEC const char * SDLCALL SDL_JoystickGetSerial(SDL_Joystick *joystick);
/** /**
* Get the type of an opened joystick. * Get the type of an opened joystick.
*
* \param joystick the SDL_Joystick obtained from SDL_JoystickOpen()
* \returns the SDL_JoystickType of the selected joystick.
*/ */
extern DECLSPEC SDL_JoystickType SDLCALL SDL_JoystickGetType(SDL_Joystick *joystick); extern DECLSPEC SDL_JoystickType SDLCALL SDL_JoystickGetType(SDL_Joystick *joystick);
/** /**
* Return a string representation for this guid. pszGUID must point to at least 33 bytes * Get an ASCII string representation for a given SDL_JoystickGUID.
* (32 for the string plus a NULL terminator). *
* You should supply at least 33 bytes for pszGUID.
*
* \param guid the SDL_JoystickGUID you wish to convert to string
* \param pszGUID buffer in which to write the ASCII string
* \param cbGUID the size of pszGUID
*
* \sa SDL_JoystickGetDeviceGUID
* \sa SDL_JoystickGetGUID
* \sa SDL_JoystickGetGUIDFromString
*/ */
extern DECLSPEC void SDLCALL SDL_JoystickGetGUIDString(SDL_JoystickGUID guid, char *pszGUID, int cbGUID); extern DECLSPEC void SDLCALL SDL_JoystickGetGUIDString(SDL_JoystickGUID guid, char *pszGUID, int cbGUID);
/** /**
* Convert a string into a joystick guid * Convert a GUID string into a SDL_JoystickGUID 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_JoystickGUID structure.
*
* \sa SDL_JoystickGetGUIDString
*/ */
extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUIDFromString(const char *pchGUID); extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUIDFromString(const char *pchGUID);
/** /**
* Returns SDL_TRUE if the joystick has been opened and currently connected, or SDL_FALSE if it has not. * 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.
*
* \sa SDL_JoystickClose
* \sa SDL_JoystickOpen
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_JoystickGetAttached(SDL_Joystick *joystick); extern DECLSPEC SDL_bool SDLCALL SDL_JoystickGetAttached(SDL_Joystick *joystick);
/** /**
* Get the instance ID of an opened joystick or -1 if the joystick is invalid. * 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 a negative
* error code on failure; call SDL_GetError() for more information.
*
* \sa SDL_JoystickOpen
*/ */
extern DECLSPEC SDL_JoystickID SDLCALL SDL_JoystickInstanceID(SDL_Joystick *joystick); extern DECLSPEC SDL_JoystickID SDLCALL SDL_JoystickInstanceID(SDL_Joystick *joystick);
/** /**
* Get the number of general axis controls on a 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.
*
* \sa SDL_JoystickGetAxis
* \sa SDL_JoystickOpen
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick *joystick); extern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick *joystick);
/** /**
* Get the number of trackballs on a joystick. * Get the number of trackballs on a joystick.
* *
* Joystick trackballs have only relative motion events associated * Joystick trackballs have only relative motion events associated with them
* with them and their state cannot be polled. * 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.
*
* \sa SDL_JoystickGetBall
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick *joystick); extern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick *joystick);
/** /**
* Get the number of POV hats on a 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.
*
* \sa SDL_JoystickGetHat
* \sa SDL_JoystickOpen
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick *joystick); extern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick *joystick);
/** /**
* Get the number of buttons on a 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.
*
* \sa SDL_JoystickGetButton
* \sa SDL_JoystickOpen
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick *joystick); extern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick *joystick);
/** /**
* Update the current state of the open joysticks. * Update the current state of the open joysticks.
* *
* This is called automatically by the event loop if any joystick * This is called automatically by the event loop if any joystick events are
* events are enabled. * enabled.
*
* \sa SDL_JoystickEventState
*/ */
extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void); extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void);
@ -348,10 +585,22 @@ extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void);
* Enable/disable joystick event polling. * Enable/disable joystick event polling.
* *
* If joystick events are disabled, you must call SDL_JoystickUpdate() * If joystick events are disabled, you must call SDL_JoystickUpdate()
* yourself and check the state of the joystick when you want joystick * yourself and manually check the state of the joystick when you want
* information. * joystick information.
* *
* The state can be one of ::SDL_QUERY, ::SDL_ENABLE or ::SDL_IGNORE. * It is recommended that you leave joystick event handling enabled.
*
* **WARNING**: Calling this function may delete all events currently in SDL's
* event queue.
*
* \param state can be one of `SDL_QUERY`, `SDL_IGNORE`, or `SDL_ENABLE`
* \returns 1 if enabled, 0 if disabled, or a negative error code on failure;
* call SDL_GetError() for more information.
*
* If `state` is `SDL_QUERY` then the current state is returned,
* otherwise the new processing state is returned.
*
* \sa SDL_GameControllerEventState
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state); extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state);
@ -360,9 +609,23 @@ extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state);
/** /**
* Get the current state of an axis control on a joystick. * Get the current state of an axis control on a joystick.
* *
* The state is a value ranging from -32768 to 32767. * 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 axis indices start at index 0. * The value returned by SDL_JoystickGetAxis() 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.
*
* \sa SDL_JoystickNumAxes
*/ */
extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick *joystick, extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick *joystick,
int axis); int axis);
@ -374,6 +637,9 @@ extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick *joystick,
* *
* The axis indices start at index 0. * 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.
* \return SDL_TRUE if this axis has any initial value, or SDL_FALSE if not. * \return SDL_TRUE if this axis has any initial value, or SDL_FALSE if not.
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_JoystickGetAxisInitialState(SDL_Joystick *joystick, extern DECLSPEC SDL_bool SDLCALL SDL_JoystickGetAxisInitialState(SDL_Joystick *joystick,
@ -397,18 +663,23 @@ extern DECLSPEC SDL_bool SDLCALL SDL_JoystickGetAxisInitialState(SDL_Joystick *j
/** /**
* Get the current state of a POV hat on a joystick. * Get the current state of a POV hat on a joystick.
* *
* The hat indices start at index 0. * The returned value will be one of the following positions:
* *
* \return The return value is one of the following positions: * - `SDL_HAT_CENTERED`
* - ::SDL_HAT_CENTERED * - `SDL_HAT_UP`
* - ::SDL_HAT_UP * - `SDL_HAT_RIGHT`
* - ::SDL_HAT_RIGHT * - `SDL_HAT_DOWN`
* - ::SDL_HAT_DOWN * - `SDL_HAT_LEFT`
* - ::SDL_HAT_LEFT * - `SDL_HAT_RIGHTUP`
* - ::SDL_HAT_RIGHTUP * - `SDL_HAT_RIGHTDOWN`
* - ::SDL_HAT_RIGHTDOWN * - `SDL_HAT_LEFTUP`
* - ::SDL_HAT_LEFTUP * - `SDL_HAT_LEFTDOWN`
* - ::SDL_HAT_LEFTDOWN *
* \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.
*
* \sa SDL_JoystickNumHats
*/ */
extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick *joystick, extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick *joystick,
int hat); int hat);
@ -416,9 +687,20 @@ extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick *joystick,
/** /**
* Get the ball axis change since the last poll. * Get the ball axis change since the last poll.
* *
* \return 0, or -1 if you passed it invalid parameters. * Trackballs can only return relative motion since the last call to
* SDL_JoystickGetBall(), these motion deltas are placed into `dx` and
* `dy`.
* *
* The ball indices start at index 0. * 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.
*
* \sa SDL_JoystickNumBalls
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick *joystick, extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick *joystick,
int ball, int *dx, int *dy); int ball, int *dx, int *dy);
@ -426,65 +708,97 @@ extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick *joystick,
/** /**
* Get the current state of a button on a joystick. * Get the current state of a button on a joystick.
* *
* The button indices start at index 0. * \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.
*
* \sa SDL_JoystickNumButtons
*/ */
extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick *joystick, extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick *joystick,
int button); int button);
/** /**
* Start a rumble effect * Start a rumble effect.
* Each call to this function cancels any previous rumble effect, and calling it with 0 intensity stops any rumbling. *
* Each call to this function cancels any previous rumble effect, and calling
* it with 0 intensity stops any rumbling.
* *
* \param joystick The joystick to vibrate * \param joystick The joystick to vibrate
* \param low_frequency_rumble The intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF * \param low_frequency_rumble The intensity of the low frequency (left)
* \param high_frequency_rumble The intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF * 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 * \param duration_ms The duration of the rumble effect, in milliseconds
* *
* \return 0, or -1 if rumble isn't supported on this joystick * \returns 0, or -1 if rumble isn't supported on this joystick
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); extern DECLSPEC int SDLCALL SDL_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms);
/** /**
* Start a rumble effect in the joystick's triggers * 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. *
* Each call to this function cancels any previous trigger rumble effect,
* and calling it with 0 intensity stops any rumbling.
*
* Note that this function is for _trigger_ rumble; the first joystick to
* support this was the PlayStation 5's DualShock 5 controller. If you want
* the (more common) whole-controller rumble, use SDL_JoystickRumble() instead.
* *
* \param joystick The joystick to vibrate * \param joystick The joystick to vibrate
* \param left_rumble The intensity of the left trigger rumble motor, from 0 to 0xFFFF * \param left_rumble The intensity of the left trigger rumble motor, from 0
* \param right_rumble The intensity of the right trigger rumble motor, from 0 to 0xFFFF * 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 * \param duration_ms The duration of the rumble effect, in milliseconds
* *
* \return 0, or -1 if trigger rumble isn't supported on this joystick * \returns 0, or -1 if trigger rumble isn't supported on this joystick
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); extern DECLSPEC int SDLCALL SDL_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms);
/** /**
* Return whether a joystick has an LED * Query whether a joystick has an LED.
*
* An example of a joystick LED is the light on the back of a PlayStation 4's
* DualShock 4 controller.
* *
* \param joystick The joystick to query * \param joystick The joystick to query
* * \return SDL_TRUE if the joystick has a modifiable LED, SDL_FALSE otherwise.
* \return SDL_TRUE, or SDL_FALSE if this joystick does not have a modifiable LED
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_JoystickHasLED(SDL_Joystick *joystick); extern DECLSPEC SDL_bool SDLCALL SDL_JoystickHasLED(SDL_Joystick *joystick);
/** /**
* Update a joystick's LED color. * 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.
*
* \param joystick The joystick to update * \param joystick The joystick to update
* \param red The intensity of the red LED * \param red The intensity of the red LED
* \param green The intensity of the green LED * \param green The intensity of the green LED
* \param blue The intensity of the blue LED * \param blue The intensity of the blue LED
* *
* \return 0, or -1 if this joystick does not have a modifiable LED * \returns 0 on success, -1 if this joystick does not have a modifiable LED
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickSetLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue); extern DECLSPEC int SDLCALL SDL_JoystickSetLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue);
/** /**
* Close a joystick previously opened with SDL_JoystickOpen(). * Close a joystick previously opened with SDL_JoystickOpen().
*
* \param joystick The joystick device to close
*
* \sa SDL_JoystickOpen
*/ */
extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick *joystick); extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick *joystick);
/** /**
* Return the battery level of this joystick * Get the battery level of a joystick as SDL_JoystickPowerLevel.
*
* \param joystick the SDL_Joystick to query
* \returns the current battery level as SDL_JoystickPowerLevel on success or
* `SDL_JOYSTICK_POWER_UNKNOWN` if it is unknown
*
* \since This function is available since SDL 2.0.4.
*/ */
extern DECLSPEC SDL_JoystickPowerLevel SDLCALL SDL_JoystickCurrentPowerLevel(SDL_Joystick *joystick); extern DECLSPEC SDL_JoystickPowerLevel SDLCALL SDL_JoystickCurrentPowerLevel(SDL_Joystick *joystick);

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -55,154 +55,231 @@ typedef struct SDL_Keysym
/* Function prototypes */ /* Function prototypes */
/** /**
* \brief Get the window which currently has keyboard focus. * Query the window which currently has keyboard focus.
*
* \returns the window with keyboard focus.
*/ */
extern DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void); extern DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void);
/** /**
* \brief Get a snapshot of the current state of the keyboard. * Get a snapshot of the current state of the keyboard.
* *
* \param numkeys if non-NULL, receives the length of the returned array. * 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.
* *
* \return An array of key states. Indexes into this array are obtained by using ::SDL_Scancode values. * 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.
* *
* \b Example: * Use SDL_PumpEvents() to update the state array.
* \code *
* const Uint8 *state = SDL_GetKeyboardState(NULL); * This function gives you the current state after all events have been
* if ( state[SDL_SCANCODE_RETURN] ) { * processed, so if a key or button has been pressed and released before you
* printf("<RETURN> is pressed.\n"); * process events, then the pressed state will never show up in the
* } * SDL_GetKeyboardState() calls.
* \endcode *
* 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.
*
* \sa SDL_PumpEvents
*/ */
extern DECLSPEC const Uint8 *SDLCALL SDL_GetKeyboardState(int *numkeys); extern DECLSPEC const Uint8 *SDLCALL SDL_GetKeyboardState(int *numkeys);
/** /**
* \brief Get the current key modifier state for the keyboard. * 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.
*
* \sa SDL_GetKeyboardState
* \sa SDL_SetModState
*/ */
extern DECLSPEC SDL_Keymod SDLCALL SDL_GetModState(void); extern DECLSPEC SDL_Keymod SDLCALL SDL_GetModState(void);
/** /**
* \brief Set the current key modifier state for the keyboard. * Set the current key modifier state for the keyboard.
* *
* \note This does not change the keyboard state, only the key modifier flags. * 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
*
* \sa SDL_GetModState
*/ */
extern DECLSPEC void SDLCALL SDL_SetModState(SDL_Keymod modstate); extern DECLSPEC void SDLCALL SDL_SetModState(SDL_Keymod modstate);
/** /**
* \brief Get the key code corresponding to the given scancode according * Get the key code corresponding to the given scancode
* to the current keyboard layout. * according to the current keyboard layout.
* *
* See ::SDL_Keycode for details. * See SDL_Keycode for details.
* *
* \sa SDL_GetKeyName() * \param scancode the desired SDL_Scancode to query
* \returns the SDL_Keycode that corresponds to the given SDL_Scancode.
*
* \sa SDL_GetKeyName
* \sa SDL_GetScancodeFromKey
*/ */
extern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scancode); extern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scancode);
/** /**
* \brief Get the scancode corresponding to the given key code according to the * Get the scancode corresponding to the given key code
* current keyboard layout. * according to the current keyboard layout.
* *
* See ::SDL_Scancode for details. * See SDL_Scancode for details.
* *
* \sa SDL_GetScancodeName() * \param key the desired SDL_Keycode to query
* \returns the SDL_Scancode that corresponds to the given SDL_Keycode.
*
* \sa SDL_GetKeyFromScancode
* \sa SDL_GetScancodeName
*/ */
extern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromKey(SDL_Keycode key); extern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromKey(SDL_Keycode key);
/** /**
* \brief Get a human-readable name for a scancode. * Get a human-readable name for a scancode.
* *
* \return A pointer to the name for the scancode. * See SDL_Scancode for details.
* If the scancode doesn't have a name, this function returns
* an empty string ("").
* *
* \sa SDL_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 2.0.0.
*
* \sa SDL_GetScancodeFromKey
* \sa SDL_GetScancodeFromName
*/ */
extern DECLSPEC const char *SDLCALL SDL_GetScancodeName(SDL_Scancode scancode); extern DECLSPEC const char *SDLCALL SDL_GetScancodeName(SDL_Scancode scancode);
/** /**
* \brief Get a scancode from a human-readable name * Get a scancode from a human-readable name.
* *
* \return scancode, or SDL_SCANCODE_UNKNOWN if the name wasn't recognized * \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.
* *
* \sa SDL_Scancode * \since This function is available since SDL 2.0.0.
*
* \sa SDL_GetKeyFromName
* \sa SDL_GetScancodeFromKey
* \sa SDL_GetScancodeName
*/ */
extern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromName(const char *name); extern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromName(const char *name);
/** /**
* \brief Get a human-readable name for a key. * Get a human-readable name for a key.
* *
* \return A pointer to a UTF-8 string that stays valid at least until the next * See SDL_Scancode and SDL_Keycode for details.
* call to this function. If you need it around any longer, you must
* copy it. If the key doesn't have a name, this function returns an
* empty string ("").
* *
* \sa SDL_Keycode * \param key the desired SDL_Keycode to query
* \returns a pointer to a UTF-8 string that stays valid at least until the
* next call to this function. If you need it around any longer, you
* must copy it. If the key doesn't have a name, this function
* returns an empty string ("").
*
* \sa SDL_GetKeyFromName
* \sa SDL_GetKeyFromScancode
* \sa SDL_GetScancodeFromKey
*/ */
extern DECLSPEC const char *SDLCALL SDL_GetKeyName(SDL_Keycode key); extern DECLSPEC const char *SDLCALL SDL_GetKeyName(SDL_Keycode key);
/** /**
* \brief Get a key code from a human-readable name * Get a key code from a human-readable name.
* *
* \return key code, or SDLK_UNKNOWN if the name wasn't recognized * \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.
* *
* \sa SDL_Keycode * \sa SDL_GetKeyFromScancode
* \sa SDL_GetKeyName
* \sa SDL_GetScancodeFromName
*/ */
extern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromName(const char *name); extern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromName(const char *name);
/** /**
* \brief Start accepting Unicode text input events. * Start accepting Unicode text input events.
* This function will show the on-screen keyboard if supported.
* *
* \sa SDL_StopTextInput() * This function will start accepting Unicode text input events in the focused
* \sa SDL_SetTextInputRect() * SDL window, and start emitting SDL_TextInputEvent (SDL_TEXTINPUT) and
* \sa SDL_HasScreenKeyboardSupport() * SDL_TextEditingEvent (SDL_TEXTEDITING) events. Please use this function
* in pair with SDL_StopTextInput().
*
* On some platforms using this function activates the screen keyboard.
*
* \sa SDL_SetTextInputRect
* \sa SDL_StopTextInput
*/ */
extern DECLSPEC void SDLCALL SDL_StartTextInput(void); extern DECLSPEC void SDLCALL SDL_StartTextInput(void);
/** /**
* \brief Return whether or not Unicode text input events are enabled. * Check whether or not Unicode text input events are enabled.
* *
* \sa SDL_StartTextInput() * \returns SDL_TRUE if text input events are enabled else SDL_FALSE.
* \sa SDL_StopTextInput() *
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_StartTextInput
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_IsTextInputActive(void); extern DECLSPEC SDL_bool SDLCALL SDL_IsTextInputActive(void);
/** /**
* \brief Stop receiving any text input events. * Stop receiving any text input events.
* This function will hide the on-screen keyboard if supported.
* *
* \sa SDL_StartTextInput() * \sa SDL_StartTextInput
* \sa SDL_HasScreenKeyboardSupport()
*/ */
extern DECLSPEC void SDLCALL SDL_StopTextInput(void); extern DECLSPEC void SDLCALL SDL_StopTextInput(void);
/** /**
* \brief Set the rectangle used to type Unicode text inputs. * Set the rectangle used to type Unicode text inputs.
* This is used as a hint for IME and on-screen keyboard placement.
* *
* \sa SDL_StartTextInput() * \param rect the SDL_Rect structure representing the rectangle to receive
* text (ignored if NULL)
*
* \sa SDL_StartTextInput
*/ */
extern DECLSPEC void SDLCALL SDL_SetTextInputRect(SDL_Rect *rect); extern DECLSPEC void SDLCALL SDL_SetTextInputRect(SDL_Rect *rect);
/** /**
* \brief Returns whether the platform has some screen keyboard support. * Check whether the platform has screen keyboard support.
* *
* \return SDL_TRUE if some keyboard support is available else SDL_FALSE. * \returns SDL_TRUE if the platform has some screen keyboard support or
* SDL_FALSE if not.
* *
* \note Not all screen keyboard functions are supported on all platforms. * \since This function is available since SDL 2.0.0.
* *
* \sa SDL_IsScreenKeyboardShown() * \sa SDL_StartTextInput
* \sa SDL_IsScreenKeyboardShown
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasScreenKeyboardSupport(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasScreenKeyboardSupport(void);
/** /**
* \brief Returns whether the screen keyboard is shown for given window. * Check whether the screen keyboard is shown for given window.
* *
* \param window The window for which screen keyboard should be queried. * \param window the window for which screen keyboard should be queried
* \returns SDL_TRUE if screen keyboard is shown or SDL_FALSE if not.
* *
* \return SDL_TRUE if screen keyboard is shown else SDL_FALSE. * \since This function is available since SDL 2.0.0.
* *
* \sa SDL_HasScreenKeyboardSupport() * \sa SDL_HasScreenKeyboardSupport
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_IsScreenKeyboardShown(SDL_Window *window); extern DECLSPEC SDL_bool SDLCALL SDL_IsScreenKeyboardShown(SDL_Window *window);

View file

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -52,7 +52,7 @@ typedef enum
SDLK_UNKNOWN = 0, SDLK_UNKNOWN = 0,
SDLK_RETURN = '\r', SDLK_RETURN = '\r',
SDLK_ESCAPE = '\033', SDLK_ESCAPE = '\x1B',
SDLK_BACKSPACE = '\b', SDLK_BACKSPACE = '\b',
SDLK_TAB = '\t', SDLK_TAB = '\t',
SDLK_SPACE = ' ', SDLK_SPACE = ' ',
@ -147,7 +147,7 @@ typedef enum
SDLK_INSERT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT), SDLK_INSERT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT),
SDLK_HOME = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME), SDLK_HOME = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME),
SDLK_PAGEUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP), SDLK_PAGEUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP),
SDLK_DELETE = '\177', SDLK_DELETE = '\x7F',
SDLK_END = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END), SDLK_END = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END),
SDLK_PAGEDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN), SDLK_PAGEDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN),
SDLK_RIGHT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT), SDLK_RIGHT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT),

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