Merge branch 'master' of git@git.magicalgirl.moe:STJr/SRB2.git into openglquickfixes

This commit is contained in:
Sryder 2018-03-06 16:11:05 +00:00
commit 538d0de949
539 changed files with 38453 additions and 22629 deletions

View File

@ -58,6 +58,3 @@ jobs:
key: v1-SRB2-{{ .Branch }}-{{ checksum "objs/Linux/SDL/Release/depend.dep" }} key: v1-SRB2-{{ .Branch }}-{{ checksum "objs/Linux/SDL/Release/depend.dep" }}
paths: paths:
- /root/.ccache - /root/.ccache

1
.gitignore vendored
View File

@ -18,3 +18,4 @@ Win32_LIB_ASM_Release
*.user *.user
*.db *.db
*.opendb *.opendb
/.vs

View File

@ -100,6 +100,21 @@ matrix:
compiler: gcc-6 compiler: gcc-6
env: WFLAGS="-Wno-tautological-compare" env: WFLAGS="-Wno-tautological-compare"
#gcc-6 (Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511 #gcc-6 (Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511
- os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- libsdl2-mixer-dev
- libpng-dev
- libgl1-mesa-dev
- libgme-dev
- p7zip-full
- gcc-7
compiler: gcc-7
env: WFLAGS="-Wno-tautological-compare -Wno-error=implicit-fallthrough -Wimplicit-fallthrough=3"
#gcc-7 (Ubuntu 7.2.0-1ubuntu1~14.04) 7.2.0 20170802
- os: linux - os: linux
compiler: clang compiler: clang
#clang version 3.5.0 (tags/RELEASE_350/final) #clang version 3.5.0 (tags/RELEASE_350/final)
@ -162,6 +177,51 @@ matrix:
- clang-3.8 - clang-3.8
compiler: clang-3.8 compiler: clang-3.8
#clang version 3.8.1-svn271127-1~exp1 (branches/release_38) #clang version 3.8.1-svn271127-1~exp1 (branches/release_38)
- os: linux
addons:
apt:
sources:
- llvm-toolchain-precise-3.9
- ubuntu-toolchain-r-test
packages:
- libsdl2-mixer-dev
- libpng-dev
- libgl1-mesa-dev
- libgme-dev
- p7zip-full
- clang-3.9
compiler: clang-3.9
#clang version 3.9.X
# - os: linux
# addons:
# apt:
# sources:
# - llvm-toolchain-precise-4.0
# - ubuntu-toolchain-r-test
# packages:
# - libsdl2-mixer-dev
# - libpng-dev
# - libgl1-mesa-dev
# - libgme-dev
# - p7zip-full
# - clang-4.0
# compiler: clang-4.0
# #clang version 4.0.X
# - os: linux
# addons:
# apt:
# sources:
# - llvm-toolchain-precise-5.0
# - ubuntu-toolchain-r-test
# packages:
# - libsdl2-mixer-dev
# - libpng-dev
# - libgl1-mesa-dev
# - libgme-dev
# - p7zip-full
# - clang-5.0
# compiler: clang-5.0
# #clang version 5.0.X
# - os: osx # - os: osx
# osx_image: beta-xcode6.1 # osx_image: beta-xcode6.1
# #Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) # #Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn)
@ -192,6 +252,9 @@ matrix:
- compiler: clang-3.6 - compiler: clang-3.6
- compiler: clang-3.7 - compiler: clang-3.7
- compiler: clang-3.8 - compiler: clang-3.8
- compiler: clang-3.9
- compiler: clang-4.0
- compiler: clang-5.0
cache: cache:
apt: true apt: true
@ -219,9 +282,9 @@ before_script:
before_install: before_install:
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install sdl2_mixer game-music-emu p7zip; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install sdl2 sdl2_mixer game-music-emu p7zip; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install cmake||true; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install cmake||true; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then curl -O -L https://www.libsdl.org/release/SDL2-2.0.4.dmg; hdiutil attach SDL2-2.0.4.dmg; sudo cp -a /Volumes/SDL2/SDL2.framework /Library/Frameworks/; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then curl -O -L https://www.libsdl.org/release/SDL2-2.0.6.dmg; hdiutil attach SDL2-2.0.6.dmg; sudo cp -a /Volumes/SDL2/SDL2.framework /Library/Frameworks/; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then curl -O -L https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-2.0.1.dmg; hdiutil attach SDL2_mixer-2.0.1.dmg; sudo cp -a /Volumes/SDL2_mixer/SDL2_mixer.framework /Library/Frameworks/; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then curl -O -L https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-2.0.1.dmg; hdiutil attach SDL2_mixer-2.0.1.dmg; sudo cp -a /Volumes/SDL2_mixer/SDL2_mixer.framework /Library/Frameworks/; fi
- mkdir -p $HOME/srb2_cache - mkdir -p $HOME/srb2_cache

View File

@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.0)
project(SRB2 project(SRB2
VERSION 2.1.19 VERSION 2.1.20
LANGUAGES C) LANGUAGES C)
if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR}) if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR})

View File

@ -17,7 +17,7 @@
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<AssemblerOutput>All</AssemblerOutput> <AssemblerOutput>All</AssemblerOutput>
<SmallerTypeCheck>true</SmallerTypeCheck> <SmallerTypeCheck>false</SmallerTypeCheck>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
</ClCompile> </ClCompile>
<Link> <Link>

View File

@ -1,4 +1,4 @@
version: 2.1.19.{branch}-{build} version: 2.1.20.{branch}-{build}
os: MinGW os: MinGW
environment: environment:
@ -6,7 +6,7 @@ environment:
CCACHE_CC: i686-w64-mingw32-gcc CCACHE_CC: i686-w64-mingw32-gcc
WINDRES: windres WINDRES: windres
MINGW_SDK: c:\msys64\mingw32 MINGW_SDK: c:\msys64\mingw32
CFLAGS: -Wall -W -Werror CFLAGS: -Wall -W -Werror -Wno-error=implicit-fallthrough -Wimplicit-fallthrough=3 -Wno-tautological-compare -Wno-error=suggest-attribute=noreturn
NASM_ZIP: nasm-2.12.01 NASM_ZIP: nasm-2.12.01
NASM_URL: http://www.nasm.us/pub/nasm/releasebuilds/2.12.01/win64/nasm-2.12.01-win64.zip NASM_URL: http://www.nasm.us/pub/nasm/releasebuilds/2.12.01/win64/nasm-2.12.01-win64.zip
UPX_ZIP: upx391w UPX_ZIP: upx391w
@ -39,6 +39,10 @@ configuration:
- SDL - SDL
- DD - DD
matrix:
allow_failures:
- configuration: DD
before_build: before_build:
- set Path=%MINGW_SDK%\bin;%Path% - set Path=%MINGW_SDK%\bin;%Path%
- i686-w64-mingw32-gcc --version - i686-w64-mingw32-gcc --version
@ -47,7 +51,7 @@ before_build:
- upx -V - upx -V
- ccache -V - ccache -V
- ccache -s - ccache -s
- set SRB2_MFLAGS=-C src MINGW=1 WARNINGMODE=1 GCC63=1 CCACHE=1 NOOBJDUMP=1 - set SRB2_MFLAGS=-C src MINGW=1 WARNINGMODE=1 GCC72=1 CCACHE=1 NOOBJDUMP=1
build_script: build_script:
- cmd: mingw32-make.exe %SRB2_MFLAGS% %CONFIGURATION%=1 clean - cmd: mingw32-make.exe %SRB2_MFLAGS% %CONFIGURATION%=1 clean

2
bin/DC/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/Dos/Debug/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/Dos/Release/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/FreeBSD/Debug/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/FreeBSD/Release/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/SDL/Debug/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/SDL/Release/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/ARMV4Dbg/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/ARMV4IDbg/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/ARMV4IRel/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/ARMV4Rel/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/ARMV4TDbg/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/ARMV4TRel/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/MIPS16Dbg/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/MIPS16Rel/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/MIPSIIDbg/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/MIPSIIRel/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/MIPSII_FPDbg/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/MIPSII_FPRel/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/MIPSIVDbg/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/MIPSIVRel/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/MIPSIV_FPDbg/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/MIPSIV_FPRel/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/Release/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/SH3Dbg/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/SH3Rel/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/SH4Dbg/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/SH4Rel/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/X86Dbg/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/X86Rel/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/emulatorDbg/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/WinCE/emulatorRel/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

2
bin/dummy/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# DON'T REMOVE
# This keeps the folder from disappearing

View File

@ -1,16 +1,16 @@
Bugs are now managed in the SDL bug tracker, here: Bugs are now managed in the SDL bug tracker, here:
http://bugzilla.libsdl.org/ https://bugzilla.libsdl.org/
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.
You may also find help on the SDL mailing list. Subscription information: You may also find help at the SDL forums/mailing list:
http://lists.libsdl.org/listinfo.cgi/sdl-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 Bugzilla, as
bugs discussed on the mailing list may be forgotten or missed. bugs discussed on the mailing list may be forgotten or missed.

View File

@ -1,20 +1,20 @@
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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
arising from the use of this software. arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions: freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not 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 claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be in a product, an acknowledgment in the product documentation would be
appreciated but is not required. appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be 2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software. misrepresented as being the original software.
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.

View File

@ -1,53 +1,53 @@
Simple DirectMedia Layer CREDITS Simple DirectMedia Layer CREDITS
Thanks to everyone who made this possible, including: Thanks to everyone who made this possible, including:
* Cliff Matthews, for giving me a reason to start this project. :) * Cliff Matthews, for giving me a reason to start this project. :)
-- Executor rocks! *grin* -- Executor rocks! *grin*
* Ryan Gordon for helping everybody out and keeping the dream alive. :) * Ryan Gordon for helping everybody out and keeping the dream alive. :)
* Gabriel Jacobo for his work on the Android port and generally helping out all around. * Gabriel Jacobo for his work on the Android port and generally helping out all around.
* Philipp Wiesemann for his attention to detail reviewing the entire SDL code base and proposes patches. * Philipp Wiesemann for his attention to detail reviewing the entire SDL code base and proposes patches.
* Andreas Schiffler for his dedication to unit tests, Visual Studio projects, and managing the Google Summer of Code. * Andreas Schiffler for his dedication to unit tests, Visual Studio projects, and managing the Google Summer of Code.
* Mike Sartain for incorporating SDL into Team Fortress 2 and cheering me on at Valve. * Mike Sartain for incorporating SDL into Team Fortress 2 and cheering me on at Valve.
* Alfred Reynolds for the game controller API and general (in)sanity * Alfred Reynolds for the game controller API and general (in)sanity
* Jørgen Tjernø for numerous magical Mac OS X fixes. * Jørgen Tjernø for numerous magical Mac OS X fixes.
* Pierre-Loup Griffais for his deep knowledge of OpenGL drivers. * Pierre-Loup Griffais for his deep knowledge of OpenGL drivers.
* Julian Winter for the SDL 2.0 website. * Julian Winter for the SDL 2.0 website.
* Sheena Smith for many months of great work on the SDL wiki creating the API documentation and style guides. * Sheena Smith for many months of great work on the SDL wiki creating the API documentation and style guides.
* Paul Hunkin for his port of SDL to Android during the Google Summer of Code 2010. * Paul Hunkin for his port of SDL to Android during the Google Summer of Code 2010.
* Eli Gottlieb for his work on shaped windows during the Google Summer of Code 2010. * Eli Gottlieb for his work on shaped windows during the Google Summer of Code 2010.
* Jim Grandpre for his work on multi-touch and gesture recognition during * Jim Grandpre for his work on multi-touch and gesture recognition during
the Google Summer of Code 2010. the Google Summer of Code 2010.
* Edgar "bobbens" Simo for his force feedback API development during the * Edgar "bobbens" Simo for his force feedback API development during the
Google Summer of Code 2008. Google Summer of Code 2008.
* Aaron Wishnick for his work on audio resampling and pitch shifting during * Aaron Wishnick for his work on audio resampling and pitch shifting during
the Google Summer of Code 2008. the Google Summer of Code 2008.
* Holmes Futrell for his port of SDL to the iPhone and iPod Touch during the * Holmes Futrell for his port of SDL to the iPhone and iPod Touch during the
Google Summer of Code 2008. Google Summer of Code 2008.
* Jon Atkins for SDL_image, SDL_mixer and SDL_net documentation. * Jon Atkins for SDL_image, SDL_mixer and SDL_net documentation.
* Everybody at Loki Software, Inc. for their great contributions! * Everybody at Loki Software, Inc. for their great contributions!
And a big hand to everyone else who has contributed over the years. And a big hand to everyone else who has contributed over the years.
THANKS! :) THANKS! :)
-- Sam Lantinga <slouken@libsdl.org> -- Sam Lantinga <slouken@libsdl.org>

View File

@ -1,15 +1,18 @@
To install SDL for native development: The 32-bit files are in i686-w64-mingw32
make native The 64-bit files are in x86_64-w64-mingw32
To install SDL for cross-compiling development: To install SDL for native development:
make cross make native
Look at the example programs in ./test, and check out online documentation: To install SDL for cross-compiling development:
http://wiki.libsdl.org/ make cross
Join the SDL developer mailing list if you want to join the community: Look at the example programs in ./test, and check out online documentation:
http://www.libsdl.org/mailing-list.php http://wiki.libsdl.org/
That's it! Join the SDL developer mailing list if you want to join the community:
Sam Lantinga <slouken@libsdl.org> http://www.libsdl.org/mailing-list.php
That's it!
Sam Lantinga <slouken@libsdl.org>

View File

@ -6,7 +6,7 @@ ARCHITECTURES := i686-w64-mingw32 x86_64-w64-mingw32
all install: all install:
@echo "Type \"make native\" to install 32-bit to /usr" @echo "Type \"make native\" to install 32-bit to /usr"
@echo "Type \"make cross\" to install 32-bit and 64-bit to $(CROSS_PATH)" @echo "Type \"make cross\" to install 32-bit and 64-bit to CROSS_PATH ($(CROSS_PATH))"
native: native:
make install-package arch=i686-w64-mingw32 prefix=/usr make install-package arch=i686-w64-mingw32 prefix=/usr

View File

@ -1,13 +1,13 @@
Please distribute this file with the SDL runtime environment: Please distribute this file with the SDL runtime environment:
The Simple DirectMedia Layer (SDL for short) is a cross-platform library The Simple DirectMedia Layer (SDL for short) is a cross-platform library
designed to make it easy to write multi-media software, such as games and designed to make it easy to write multi-media software, such as games
emulators. and emulators.
The Simple DirectMedia Layer library source code is available from: The Simple DirectMedia Layer library source code is available from:
http://www.libsdl.org/ https://www.libsdl.org/
This library is distributed under the terms of the zlib license: This library is distributed under the terms of the zlib license:
http://www.zlib.net/zlib_license.html http://www.zlib.net/zlib_license.html

View File

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

View File

@ -1,199 +1,349 @@
This is a list of major changes in SDL's version history. This is a list of major changes in SDL's version history.
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
2.0.4: 2.0.7:
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
General: General:
* Added support for web applications using Emscripten, see docs/README-emscripten.md for more information * Added audio stream conversion functions:
* Added support for web applications using Native Client (NaCl), see docs/README-nacl.md for more information SDL_NewAudioStream
* Added an API to queue audio instead of using the audio callback: SDL_AudioStreamPut
SDL_QueueAudio(), SDL_GetQueuedAudioSize(), SDL_ClearQueuedAudio() SDL_AudioStreamGet
* Added events for audio device hot plug support: SDL_AudioStreamAvailable
SDL_AUDIODEVICEADDED, SDL_AUDIODEVICEREMOVED SDL_AudioStreamFlush
* Added SDL_PointInRect() SDL_AudioStreamClear
* Added SDL_HasAVX2() to detect CPUs with AVX2 support SDL_FreeAudioStream
* Added SDL_SetWindowHitTest() to let apps treat parts of their SDL window like traditional window decorations (drag areas, resize areas) * Added functions to query and set the SDL memory allocation functions:
* Added SDL_GetGrabbedWindow() to get the window that currently has input grab, if any SDL_GetMemoryFunctions()
* Added SDL_RenderIsClipEnabled() to tell whether clipping is currently enabled in a renderer SDL_SetMemoryFunctions()
* Added SDL_CaptureMouse() to capture the mouse to get events while the mouse is not in your window SDL_GetNumAllocations()
* Added SDL_WarpMouseGlobal() to warp the mouse cursor in global screen space * Added locking functions for multi-threaded access to the joystick and game controller APIs:
* Added SDL_GetGlobalMouseState() to get the current mouse state outside of an SDL window SDL_LockJoysticks()
* Added a direction field to mouse wheel events to tell whether they are flipped (natural) or not SDL_UnlockJoysticks()
* Added GL_CONTEXT_RELEASE_BEHAVIOR GL attribute (maps to [WGL|GLX]_ARB_context_flush_control extension) * The following functions are now thread-safe:
* Added EGL_KHR_create_context support to allow OpenGL ES version selection on some platforms SDL_SetEventFilter()
* Added NV12 and NV21 YUV texture support for OpenGL and OpenGL ES 2.0 renderers SDL_GetEventFilter()
* Added a Vivante video driver that is used on various SoC platforms SDL_AddEventWatch()
* Added an event SDL_RENDER_DEVICE_RESET that is sent from the D3D renderers when the D3D device is lost, and from Android's event loop when the GLES context had to be recreated SDL_DelEventWatch()
* Added a hint SDL_HINT_NO_SIGNAL_HANDLERS to disable SDL's built in signal handling
* Added a hint SDL_HINT_THREAD_STACK_SIZE to set the stack size of SDL's threads
* Added SDL_sqrtf(), SDL_tan(), and SDL_tanf() to the stdlib routines General:
* Improved support for WAV and BMP files with unusual chunks in them ---------------------------------------------------------------------------
* Renamed SDL_assert_data to SDL_AssertData and SDL_assert_state to SDL_AssertState 2.0.6:
* Added a hint SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN to prevent window interaction while cursor is hidden ---------------------------------------------------------------------------
* Added SDL_GetDisplayDPI() to get the DPI information for a display
* Added SDL_JoystickCurrentPowerLevel() to get the battery level of a joystick General:
* Added SDL_JoystickFromInstanceID(), as a helper function, to get the SDL_Joystick* that an event is referring to. * Added cross-platform Vulkan graphics support in SDL_vulkan.h
* Added SDL_GameControllerFromInstanceID(), as a helper function, to get the SDL_GameController* that an event is referring to. SDL_Vulkan_LoadLibrary()
SDL_Vulkan_GetVkGetInstanceProcAddr()
Windows: SDL_Vulkan_GetInstanceExtensions()
* Added support for Windows Phone 8.1 and Windows 10/UWP (Universal Windows Platform) SDL_Vulkan_CreateSurface()
* Timer resolution is now 1 ms by default, adjustable with the SDL_HINT_TIMER_RESOLUTION hint SDL_Vulkan_GetDrawableSize()
* SDLmain no longer depends on the C runtime, so you can use the same .lib in both Debug and Release builds SDL_Vulkan_UnloadLibrary()
* Added SDL_SetWindowsMessageHook() to set a function to be called for every windows message before TranslateMessage() This is all the platform-specific code you need to bring up Vulkan on all SDL platforms. You can look at an example in test/testvulkan.c
* Added a hint SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP to control whether SDL_PumpEvents() processes the Windows message loop * Added SDL_ComposeCustomBlendMode() to create custom blend modes for 2D rendering
* You can distinguish between real mouse and touch events by looking for SDL_TOUCH_MOUSEID in the mouse event "which" field * Added SDL_HasNEON() which returns whether the CPU has NEON instruction support
* SDL_SysWMinfo now contains the window HDC * Added support for many game controllers, including the Nintendo Switch Pro Controller
* Added support for Unicode command line options * Added support for inverted axes and separate axis directions in game controller mappings
* Prevent beeping when Alt-key combos are pressed * Added functions to return information about a joystick before it's opened:
* SDL_SetTextInputRect() re-positions the OS-rendered IME SDL_JoystickGetDeviceVendor()
* Added a hint SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4 to prevent generating SDL_WINDOWEVENT_CLOSE events when Alt-F4 is pressed SDL_JoystickGetDeviceProduct()
* Added a hint SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING to use the old axis and button mapping for XInput devices (deprecated) SDL_JoystickGetDeviceProductVersion()
SDL_JoystickGetDeviceType()
Mac OS X: SDL_JoystickGetDeviceInstanceID()
* Implemented drag-and-drop support * Added functions to return information about an open joystick:
* Improved joystick hot-plug detection SDL_JoystickGetVendor()
* The SDL_WINDOWEVENT_EXPOSED window event is triggered in the appropriate situations SDL_JoystickGetProduct()
* Fixed relative mouse mode when the application loses/regains focus SDL_JoystickGetProductVersion()
* Fixed bugs related to transitioning to and from Spaces-aware fullscreen-desktop mode SDL_JoystickGetType()
* Fixed the refresh rate of display modes SDL_JoystickGetAxisInitialState()
* SDL_SysWMInfo is now ARC-compatible * Added functions to return information about an open game controller:
* Added a hint SDL_HINT_MAC_BACKGROUND_APP to prevent forcing the application to become a foreground process SDL_GameControllerGetVendor()
SDL_GameControllerGetProduct()
Linux: SDL_GameControllerGetProductVersion()
* Enabled building with Mir and Wayland support by default. * Added SDL_GameControllerNumMappings() and SDL_GameControllerMappingForIndex() to be able to enumerate the built-in game controller mappings
* Added IBus IME support * Added SDL_LoadFile() and SDL_LoadFile_RW() to load a file into memory
* Added a hint SDL_HINT_IME_INTERNAL_EDITING to control whether IBus should handle text editing internally instead of sending SDL_TEXTEDITING events * Added SDL_DuplicateSurface() to make a copy of a surface
* Added a hint SDL_HINT_VIDEO_X11_NET_WM_PING to allow disabling _NET_WM_PING protocol handling in SDL_CreateWindow() * Added an experimental JACK audio driver
* Added support for multiple audio devices when using Pulseaudio * Implemented non-power-of-two audio resampling, optionally using libsamplerate to perform the resampling
* Fixed duplicate mouse events when using relative mouse motion * Added the hint SDL_HINT_AUDIO_RESAMPLING_MODE to control the quality of resampling
* Added the hint SDL_HINT_RENDER_LOGICAL_SIZE_MODE to control the scaling policy for SDL_RenderSetLogicalSize():
iOS: "0" or "letterbox" - Uses letterbox/sidebars to fit the entire rendering on screen (the default)
* Added support for iOS 8 "1" or "overscan" - Will zoom the rendering so it fills the entire screen, allowing edges to be drawn offscreen
* The SDL_WINDOW_ALLOW_HIGHDPI window flag now enables high-dpi support, and SDL_GL_GetDrawableSize() or SDL_GetRendererOutputSize() gets the window resolution in pixels * Added the hints SDL_HINT_MOUSE_NORMAL_SPEED_SCALE and SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE to scale the mouse speed when being read from raw mouse input
* SDL_GetWindowSize() and display mode sizes are in the "DPI-independent points" / "screen coordinates" coordinate space rather than pixels (matches OS X behavior) * Added the hint SDL_HINT_TOUCH_MOUSE_EVENTS to control whether SDL will synthesize mouse events from touch events
* Added native resolution support for the iPhone 6 Plus
* Added support for MFi game controllers Windows:
* Added support for the hint SDL_HINT_ACCELEROMETER_AS_JOYSTICK * The new default audio driver on Windows is WASAPI and supports hot-plugging devices and changing the default audio device
* Added sRGB OpenGL ES context support on iOS 7+ * The old XAudio2 audio driver is deprecated and will be removed in the next release
* Added support for SDL_DisableScreenSaver(), SDL_EnableScreenSaver() and the hint SDL_HINT_VIDEO_ALLOW_SCREENSAVER * Added hints SDL_HINT_WINDOWS_INTRESOURCE_ICON and SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL to specify a custom icon resource ID for SDL windows
* SDL_SysWMinfo now contains the OpenGL ES framebuffer and color renderbuffer objects used by the window's active GLES view * The hint SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING is now on by default for compatibility with .NET languages and various Windows debuggers
* Fixed various rotation and orientation issues * Updated the GUID format for game controller mappings, older mappings will be automatically converted on load
* Fixed memory leaks * Implemented the SDL_WINDOW_ALWAYS_ON_TOP flag on Windows
Android: Linux:
* Added a hint SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH to prevent mouse events from being registered as touch events * Added an experimental KMS/DRM video driver for embedded development
* Added hints SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION and SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION
* Added support for SDL_DisableScreenSaver(), SDL_EnableScreenSaver() and the hint SDL_HINT_VIDEO_ALLOW_SCREENSAVER iOS:
* Added support for SDL_ShowMessageBox() and SDL_ShowSimpleMessageBox() * Added a hint SDL_HINT_AUDIO_CATEGORY to control the audio category, determining whether the phone mute switch affects the audio
Raspberry Pi: ---------------------------------------------------------------------------
* Added support for the Raspberry Pi 2 2.0.5:
---------------------------------------------------------------------------
--------------------------------------------------------------------------- General:
2.0.3: * Implemented audio capture support for some platforms
--------------------------------------------------------------------------- * Added SDL_DequeueAudio() to retrieve audio when buffer queuing is turned on for audio capture
* Added events for dragging and dropping text
Mac OS X: * Added events for dragging and dropping multiple items
* Fixed creating an OpenGL context by default on Mac OS X 10.6 * By default the click raising a window will not be delivered to the SDL application. You can set the hint SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH to "1" to allow that click through to the window.
* Saving a surface with an alpha channel as a BMP will use a newer BMP format that supports alpha information. You can set the hint SDL_HINT_BMP_SAVE_LEGACY_FORMAT to "1" to use the old format.
* Added SDL_GetHintBoolean() to get the boolean value of a hint
--------------------------------------------------------------------------- * Added SDL_RenderSetIntegerScale() to set whether to smoothly scale or use integral multiples of the viewport size when scaling the rendering output
2.0.2: * Added SDL_CreateRGBSurfaceWithFormat() and SDL_CreateRGBSurfaceWithFormatFrom() to create an SDL surface with a specific pixel format
--------------------------------------------------------------------------- * Added SDL_GetDisplayUsableBounds() which returns the area usable for windows. For example, on Mac OS X, this subtracts the area occupied by the menu bar and dock.
General: * Added SDL_GetWindowBordersSize() which returns the size of the window's borders around the client area
* Added SDL_GL_ResetAttributes() to reset OpenGL attributes to default values * Added a window event SDL_WINDOWEVENT_HIT_TEST when a window had a hit test that wasn't SDL_HITTEST_NORMAL (e.g. in the title bar or window frame)
* Added an API to load a database of game controller mappings from a file: * Added SDL_SetWindowResizable() to change whether a window is resizable
SDL_GameControllerAddMappingsFromFile(), SDL_GameControllerAddMappingsFromRW() * Added SDL_SetWindowOpacity() and SDL_GetWindowOpacity() to affect the window transparency
* Added game controller mappings for the PS4 and OUYA controllers * Added SDL_SetWindowModalFor() to set a window as modal for another window
* Added SDL_GetDefaultAssertionHandler() and SDL_GetAssertionHandler() * Added support for AUDIO_U16LSB and AUDIO_U16MSB to SDL_MixAudioFormat()
* Added SDL_DetachThread() * Fixed flipped images when reading back from target textures when using the OpenGL renderer
* Added SDL_HasAVX() to determine if the CPU has AVX features * Fixed texture color modulation with SDL_BLENDMODE_NONE when using the OpenGL renderer
* Added SDL_vsscanf(), SDL_acos(), and SDL_asin() to the stdlib routines * Fixed bug where the alpha value of colorkeys was ignored when blitting in some cases
* EGL can now create/manage OpenGL and OpenGL ES 1.x/2.x contexts, and share
them using SDL_GL_SHARE_WITH_CURRENT_CONTEXT Windows:
* Added a field "clicks" to the mouse button event which records whether the event is a single click, double click, etc. * Added a hint SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING to prevent SDL from raising a debugger exception to name threads. This exception can cause problems with .NET applications when running under a debugger.
* The screensaver is now disabled by default, and there is a hint SDL_HINT_VIDEO_ALLOW_SCREENSAVER that can change that behavior. * The hint SDL_HINT_THREAD_STACK_SIZE is now supported on Windows
* Added a hint SDL_HINT_MOUSE_RELATIVE_MODE_WARP to specify whether mouse relative mode should be emulated using mouse warping. * Fixed XBox controller triggers automatically being pulled at startup
* testgl2 does not need to link with libGL anymore * The first icon from the executable is used as the default window icon at runtime
* Added testgles2 test program to demonstrate working with OpenGL ES 2.0 * Fixed SDL log messages being printed twice if SDL was built with C library support
* Added controllermap test program to visually map a game controller * Reset dead keys when the SDL window loses focus, so dead keys pressed in SDL applications don't affect text input into other applications.
Windows: Mac OS X:
* Support for OpenGL ES 2.x contexts using either WGL or EGL (natively via * Fixed selecting the dummy video driver
the driver or emulated through ANGLE) * The caps lock key now generates a pressed event when pressed and a released event when released, instead of a press/release event pair when pressed.
* Added a hint SDL_HINT_VIDEO_WIN_D3DCOMPILER to specify which D3D shader compiler to use for OpenGL ES 2 support through ANGLE * Fixed mouse wheel events on Mac OS X 10.12
* Added a hint SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT that is useful when creating multiple windows that should share the same OpenGL context. * The audio driver has been updated to use AVFoundation for better compatibility with newer versions of Mac OS X
* Added an event SDL_RENDER_TARGETS_RESET that is sent when D3D9 render targets are reset after the device has been restored.
Linux:
Mac OS X: * Added support for the Fcitx IME
* Added a hint SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK to control whether Ctrl+click should be treated as a right click on Mac OS X. This is off by default. * Added a window event SDL_WINDOWEVENT_TAKE_FOCUS when a window manager asks the SDL window whether it wants to take focus.
* Refresh rates are now rounded instead of truncated, e.g. 59.94 Hz is rounded up to 60 Hz instead of 59.
Linux: * Added initial support for touchscreens on Raspberry Pi
* Fixed fullscreen and focused behavior when receiving NotifyGrab events
* Added experimental Wayland and Mir support, disabled by default OpenBSD:
* SDL_GetBasePath() is now implemented on OpenBSD
Android:
* Joystick support (minimum SDK version required to build SDL is now 12, iOS:
the required runtime version remains at 10, but on such devices joystick * Added support for dynamically loaded objects on iOS 8 and newer
support won't be available).
* Hotplugging support for joysticks tvOS:
* Added a hint SDL_HINT_ACCELEROMETER_AS_JOYSTICK to control whether the accelerometer should be listed as a 3 axis joystick, which it will by default. * Added support for Apple TV
* Added a hint SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION to control whether he Apple TV remote's joystick axes will automatically match the rotation of the remote.
--------------------------------------------------------------------------- Android:
2.0.1: * Fixed SDL not resizing window when Android screen resolution changes
--------------------------------------------------------------------------- * Corrected the joystick Z axis reporting for the accelerometer
General: Emscripten (running in a web browser):
* Added an API to get common filesystem paths in SDL_filesystem.h: * Many bug fixes and improvements
SDL_GetBasePath(), SDL_GetPrefPath()
* Added an API to do optimized YV12 and IYUV texture updates:
SDL_UpdateYUVTexture() ---------------------------------------------------------------------------
* Added an API to get the amount of RAM on the system: 2.0.4:
SDL_GetSystemRAM() ---------------------------------------------------------------------------
* Added a macro to perform timestamp comparisons with SDL_GetTicks():
SDL_TICKS_PASSED() General:
* Dramatically improved OpenGL ES 2.0 rendering performance * Added support for web applications using Emscripten, see docs/README-emscripten.md for more information
* Added OpenGL attribute SDL_GL_FRAMEBUFFER_SRGB_CAPABLE * Added support for web applications using Native Client (NaCl), see docs/README-nacl.md for more information
* Added an API to queue audio instead of using the audio callback:
Windows: SDL_QueueAudio(), SDL_GetQueuedAudioSize(), SDL_ClearQueuedAudio()
* Created a static library configuration for the Visual Studio 2010 project * Added events for audio device hot plug support:
* Added a hint to create the Direct3D device with support for multi-threading: SDL_AUDIODEVICEADDED, SDL_AUDIODEVICEREMOVED
SDL_HINT_RENDER_DIRECT3D_THREADSAFE * Added SDL_PointInRect()
* Added a function to get the D3D9 adapter index for a display: * Added SDL_HasAVX2() to detect CPUs with AVX2 support
SDL_Direct3D9GetAdapterIndex() * Added SDL_SetWindowHitTest() to let apps treat parts of their SDL window like traditional window decorations (drag areas, resize areas)
* Added a function to get the D3D9 device for a D3D9 renderer: * Added SDL_GetGrabbedWindow() to get the window that currently has input grab, if any
SDL_RenderGetD3D9Device() * Added SDL_RenderIsClipEnabled() to tell whether clipping is currently enabled in a renderer
* Fixed building SDL with the mingw32 toolchain (mingw-w64 is preferred) * Added SDL_CaptureMouse() to capture the mouse to get events while the mouse is not in your window
* Fixed crash when using two XInput controllers at the same time * Added SDL_WarpMouseGlobal() to warp the mouse cursor in global screen space
* Fixed detecting a mixture of XInput and DirectInput controllers * Added SDL_GetGlobalMouseState() to get the current mouse state outside of an SDL window
* Fixed clearing a D3D render target larger than the window * Added a direction field to mouse wheel events to tell whether they are flipped (natural) or not
* Improved support for format specifiers in SDL_snprintf() * Added GL_CONTEXT_RELEASE_BEHAVIOR GL attribute (maps to [WGL|GLX]_ARB_context_flush_control extension)
* Added EGL_KHR_create_context support to allow OpenGL ES version selection on some platforms
Mac OS X: * Added NV12 and NV21 YUV texture support for OpenGL and OpenGL ES 2.0 renderers
* Added support for retina displays: * Added a Vivante video driver that is used on various SoC platforms
Create your window with the SDL_WINDOW_ALLOW_HIGHDPI flag, and then use SDL_GL_GetDrawableSize() to find the actual drawable size. You are responsible for scaling mouse and drawing coordinates appropriately. * Added an event SDL_RENDER_DEVICE_RESET that is sent from the D3D renderers when the D3D device is lost, and from Android's event loop when the GLES context had to be recreated
* Fixed mouse warping in fullscreen mode * Added a hint SDL_HINT_NO_SIGNAL_HANDLERS to disable SDL's built in signal handling
* Right mouse click is emulated by holding the Ctrl key while left clicking * Added a hint SDL_HINT_THREAD_STACK_SIZE to set the stack size of SDL's threads
* Added SDL_sqrtf(), SDL_tan(), and SDL_tanf() to the stdlib routines
Linux: * Improved support for WAV and BMP files with unusual chunks in them
* Fixed float audio support with the PulseAudio driver * Renamed SDL_assert_data to SDL_AssertData and SDL_assert_state to SDL_AssertState
* Fixed missing line endpoints in the OpenGL renderer on some drivers * Added a hint SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN to prevent window interaction while cursor is hidden
* X11 symbols are no longer defined to avoid collisions when linking statically * Added SDL_GetDisplayDPI() to get the DPI information for a display
* Added SDL_JoystickCurrentPowerLevel() to get the battery level of a joystick
iOS: * Added SDL_JoystickFromInstanceID(), as a helper function, to get the SDL_Joystick* that an event is referring to.
* Fixed status bar visibility on iOS 7 * Added SDL_GameControllerFromInstanceID(), as a helper function, to get the SDL_GameController* that an event is referring to.
* Flipped the accelerometer Y axis to match expected values
Windows:
Android: * Added support for Windows Phone 8.1 and Windows 10/UWP (Universal Windows Platform)
IMPORTANT: You MUST get the updated SDLActivity.java to match C code * Timer resolution is now 1 ms by default, adjustable with the SDL_HINT_TIMER_RESOLUTION hint
* Moved EGL initialization to native code * SDLmain no longer depends on the C runtime, so you can use the same .lib in both Debug and Release builds
* Fixed the accelerometer axis rotation relative to the device rotation * Added SDL_SetWindowsMessageHook() to set a function to be called for every windows message before TranslateMessage()
* Fixed race conditions when handling the EGL context on pause/resume * Added a hint SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP to control whether SDL_PumpEvents() processes the Windows message loop
* Touch devices are available for enumeration immediately after init * You can distinguish between real mouse and touch events by looking for SDL_TOUCH_MOUSEID in the mouse event "which" field
* SDL_SysWMinfo now contains the window HDC
Raspberry Pi: * Added support for Unicode command line options
* Added support for the Raspberry Pi, see README-raspberrypi.txt for details * Prevent beeping when Alt-key combos are pressed
* SDL_SetTextInputRect() re-positions the OS-rendered IME
* Added a hint SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4 to prevent generating SDL_WINDOWEVENT_CLOSE events when Alt-F4 is pressed
* Added a hint SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING to use the old axis and button mapping for XInput devices (deprecated)
Mac OS X:
* Implemented drag-and-drop support
* Improved joystick hot-plug detection
* The SDL_WINDOWEVENT_EXPOSED window event is triggered in the appropriate situations
* Fixed relative mouse mode when the application loses/regains focus
* Fixed bugs related to transitioning to and from Spaces-aware fullscreen-desktop mode
* Fixed the refresh rate of display modes
* SDL_SysWMInfo is now ARC-compatible
* Added a hint SDL_HINT_MAC_BACKGROUND_APP to prevent forcing the application to become a foreground process
Linux:
* Enabled building with Mir and Wayland support by default.
* Added IBus IME support
* Added a hint SDL_HINT_IME_INTERNAL_EDITING to control whether IBus should handle text editing internally instead of sending SDL_TEXTEDITING events
* Added a hint SDL_HINT_VIDEO_X11_NET_WM_PING to allow disabling _NET_WM_PING protocol handling in SDL_CreateWindow()
* Added support for multiple audio devices when using Pulseaudio
* Fixed duplicate mouse events when using relative mouse motion
iOS:
* Added support for iOS 8
* The SDL_WINDOW_ALLOW_HIGHDPI window flag now enables high-dpi support, and SDL_GL_GetDrawableSize() or SDL_GetRendererOutputSize() gets the window resolution in pixels
* SDL_GetWindowSize() and display mode sizes are in the "DPI-independent points" / "screen coordinates" coordinate space rather than pixels (matches OS X behavior)
* Added native resolution support for the iPhone 6 Plus
* Added support for MFi game controllers
* Added support for the hint SDL_HINT_ACCELEROMETER_AS_JOYSTICK
* Added sRGB OpenGL ES context support on iOS 7+
* Added support for SDL_DisableScreenSaver(), SDL_EnableScreenSaver() and the hint SDL_HINT_VIDEO_ALLOW_SCREENSAVER
* SDL_SysWMinfo now contains the OpenGL ES framebuffer and color renderbuffer objects used by the window's active GLES view
* Fixed various rotation and orientation issues
* Fixed memory leaks
Android:
* Added a hint SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH to prevent mouse events from being registered as touch events
* Added hints SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION and SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION
* Added support for SDL_DisableScreenSaver(), SDL_EnableScreenSaver() and the hint SDL_HINT_VIDEO_ALLOW_SCREENSAVER
* Added support for SDL_ShowMessageBox() and SDL_ShowSimpleMessageBox()
Raspberry Pi:
* Added support for the Raspberry Pi 2
---------------------------------------------------------------------------
2.0.3:
---------------------------------------------------------------------------
Mac OS X:
* Fixed creating an OpenGL context by default on Mac OS X 10.6
---------------------------------------------------------------------------
2.0.2:
---------------------------------------------------------------------------
General:
* Added SDL_GL_ResetAttributes() to reset OpenGL attributes to default values
* Added an API to load a database of game controller mappings from a file:
SDL_GameControllerAddMappingsFromFile(), SDL_GameControllerAddMappingsFromRW()
* Added game controller mappings for the PS4 and OUYA controllers
* Added SDL_GetDefaultAssertionHandler() and SDL_GetAssertionHandler()
* Added SDL_DetachThread()
* Added SDL_HasAVX() to determine if the CPU has AVX features
* Added SDL_vsscanf(), SDL_acos(), and SDL_asin() to the stdlib routines
* EGL can now create/manage OpenGL and OpenGL ES 1.x/2.x contexts, and share
them using SDL_GL_SHARE_WITH_CURRENT_CONTEXT
* Added a field "clicks" to the mouse button event which records whether the event is a single click, double click, etc.
* The screensaver is now disabled by default, and there is a hint SDL_HINT_VIDEO_ALLOW_SCREENSAVER that can change that behavior.
* Added a hint SDL_HINT_MOUSE_RELATIVE_MODE_WARP to specify whether mouse relative mode should be emulated using mouse warping.
* testgl2 does not need to link with libGL anymore
* Added testgles2 test program to demonstrate working with OpenGL ES 2.0
* Added controllermap test program to visually map a game controller
Windows:
* Support for OpenGL ES 2.x contexts using either WGL or EGL (natively via
the driver or emulated through ANGLE)
* Added a hint SDL_HINT_VIDEO_WIN_D3DCOMPILER to specify which D3D shader compiler to use for OpenGL ES 2 support through ANGLE
* Added a hint SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT that is useful when creating multiple windows that should share the same OpenGL context.
* Added an event SDL_RENDER_TARGETS_RESET that is sent when D3D9 render targets are reset after the device has been restored.
Mac OS X:
* Added a hint SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK to control whether Ctrl+click should be treated as a right click on Mac OS X. This is off by default.
Linux:
* Fixed fullscreen and focused behavior when receiving NotifyGrab events
* Added experimental Wayland and Mir support, disabled by default
Android:
* Joystick support (minimum SDK version required to build SDL is now 12,
the required runtime version remains at 10, but on such devices joystick
support won't be available).
* Hotplugging support for joysticks
* Added a hint SDL_HINT_ACCELEROMETER_AS_JOYSTICK to control whether the accelerometer should be listed as a 3 axis joystick, which it will by default.
---------------------------------------------------------------------------
2.0.1:
---------------------------------------------------------------------------
General:
* Added an API to get common filesystem paths in SDL_filesystem.h:
SDL_GetBasePath(), SDL_GetPrefPath()
* Added an API to do optimized YV12 and IYUV texture updates:
SDL_UpdateYUVTexture()
* Added an API to get the amount of RAM on the system:
SDL_GetSystemRAM()
* Added a macro to perform timestamp comparisons with SDL_GetTicks():
SDL_TICKS_PASSED()
* Dramatically improved OpenGL ES 2.0 rendering performance
* Added OpenGL attribute SDL_GL_FRAMEBUFFER_SRGB_CAPABLE
Windows:
* Created a static library configuration for the Visual Studio 2010 project
* Added a hint to create the Direct3D device with support for multi-threading:
SDL_HINT_RENDER_DIRECT3D_THREADSAFE
* Added a function to get the D3D9 adapter index for a display:
SDL_Direct3D9GetAdapterIndex()
* Added a function to get the D3D9 device for a D3D9 renderer:
SDL_RenderGetD3D9Device()
* Fixed building SDL with the mingw32 toolchain (mingw-w64 is preferred)
* Fixed crash when using two XInput controllers at the same time
* Fixed detecting a mixture of XInput and DirectInput controllers
* Fixed clearing a D3D render target larger than the window
* Improved support for format specifiers in SDL_snprintf()
Mac OS X:
* Added support for retina displays:
Create your window with the SDL_WINDOW_ALLOW_HIGHDPI flag, and then use SDL_GL_GetDrawableSize() to find the actual drawable size. You are responsible for scaling mouse and drawing coordinates appropriately.
* Fixed mouse warping in fullscreen mode
* Right mouse click is emulated by holding the Ctrl key while left clicking
Linux:
* Fixed float audio support with the PulseAudio driver
* Fixed missing line endpoints in the OpenGL renderer on some drivers
* X11 symbols are no longer defined to avoid collisions when linking statically
iOS:
* Fixed status bar visibility on iOS 7
* Flipped the accelerometer Y axis to match expected values
Android:
IMPORTANT: You MUST get the updated SDLActivity.java to match C code
* Moved EGL initialization to native code
* Fixed the accelerometer axis rotation relative to the device rotation
* Fixed race conditions when handling the EGL context on pause/resume
* Touch devices are available for enumeration immediately after init
Raspberry Pi:
* Added support for the Raspberry Pi, see README-raspberrypi.txt for details

View File

@ -1,464 +1,484 @@
Android Android
================================================================================ ================================================================================
Requirements: Matt Styles wrote a tutorial on building SDL for Android with Visual Studio:
http://trederia.blogspot.de/2017/03/building-sdl2-for-android-with-visual.html
Android SDK (version 12 or later)
http://developer.android.com/sdk/index.html The rest of this README covers the old style build process.
Android NDK r7 or later ================================================================================
http://developer.android.com/tools/sdk/ndk/index.html Requirements
================================================================================
Minimum API level supported by SDL: 10 (Android 2.3.3)
Joystick support is available for API level >=12 devices. Android SDK (version 16 or later)
https://developer.android.com/sdk/index.html
================================================================================
How the port works Android NDK r7 or later
================================================================================ https://developer.android.com/tools/sdk/ndk/index.html
- Android applications are Java-based, optionally with parts written in C Minimum API level supported by SDL: 10 (Android 2.3.3)
- As SDL apps are C-based, we use a small Java shim that uses JNI to talk to Joystick support is available for API level >= 12 devices.
the SDL library
- This means that your application C code must be placed inside an Android ================================================================================
Java project, along with some C support code that communicates with Java How the port works
- This eventually produces a standard Android .apk package ================================================================================
The Android Java code implements an "Activity" and can be found in: - Android applications are Java-based, optionally with parts written in C
android-project/src/org/libsdl/app/SDLActivity.java - As SDL apps are C-based, we use a small Java shim that uses JNI to talk to
the SDL library
The Java code loads your game code, the SDL shared library, and - This means that your application C code must be placed inside an Android
dispatches to native functions implemented in the SDL library: Java project, along with some C support code that communicates with Java
src/core/android/SDL_android.c - This eventually produces a standard Android .apk package
Your project must include some glue code that starts your main() routine: The Android Java code implements an "Activity" and can be found in:
src/main/android/SDL_android_main.c android-project/src/org/libsdl/app/SDLActivity.java
The Java code loads your game code, the SDL shared library, and
================================================================================ dispatches to native functions implemented in the SDL library:
Building an app src/core/android/SDL_android.c
================================================================================
Your project must include some glue code that starts your main() routine:
For simple projects you can use the script located at build-scripts/androidbuild.sh src/main/android/SDL_android_main.c
There's two ways of using it:
================================================================================
androidbuild.sh com.yourcompany.yourapp < sources.list Building an app
androidbuild.sh com.yourcompany.yourapp source1.c source2.c ...sourceN.c ================================================================================
sources.list should be a text file with a source file name in each line For simple projects you can use the script located at build-scripts/androidbuild.sh
Filenames should be specified relative to the current directory, for example if
you are in the build-scripts directory and want to create the testgles.c test, you'll There's two ways of using it:
run:
androidbuild.sh com.yourcompany.yourapp < sources.list
./androidbuild.sh org.libsdl.testgles ../test/testgles.c androidbuild.sh com.yourcompany.yourapp source1.c source2.c ...sourceN.c
One limitation of this script is that all sources provided will be aggregated into sources.list should be a text file with a source file name in each line
a single directory, thus all your source files should have a unique name. Filenames should be specified relative to the current directory, for example if
you are in the build-scripts directory and want to create the testgles.c test, you'll
Once the project is complete the script will tell you where the debug APK is located. run:
If you want to create a signed release APK, you can use the project created by this
utility to generate it. ./androidbuild.sh org.libsdl.testgles ../test/testgles.c
Finally, a word of caution: re running androidbuild.sh wipes any changes you may have One limitation of this script is that all sources provided will be aggregated into
done in the build directory for the app! a single directory, thus all your source files should have a unique name.
Once the project is complete the script will tell you where the debug APK is located.
For more complex projects, follow these instructions: If you want to create a signed release APK, you can use the project created by this
utility to generate it.
1. Copy the android-project directory wherever you want to keep your projects
and rename it to the name of your project. Finally, a word of caution: re running androidbuild.sh wipes any changes you may have
2. Move or symlink this SDL directory into the <project>/jni directory done in the build directory for the app!
3. Edit <project>/jni/src/Android.mk to include your source files
4. Run 'ndk-build' (a script provided by the NDK). This compiles the C source
For more complex projects, follow these instructions:
If you want to use the Eclipse IDE, skip to the Eclipse section below.
1. Copy the android-project directory wherever you want to keep your projects
5. Create <project>/local.properties and use that to point to the Android SDK directory, by writing a line with the following form: and rename it to the name of your project.
2. Move or symlink this SDL directory into the "<project>/jni" directory
sdk.dir=PATH_TO_ANDROID_SDK 3. Edit "<project>/jni/src/Android.mk" to include your source files
4. Run 'ndk-build' (a script provided by the NDK). This compiles the C source
6. Run 'ant debug' in android/project. This compiles the .java and eventually
creates a .apk with the native code embedded If you want to use the Eclipse IDE, skip to the Eclipse section below.
7. 'ant debug install' will push the apk to the device or emulator (if connected)
5. Create "<project>/local.properties" and use that to point to the Android SDK directory, by writing a line with the following form:
Here's an explanation of the files in the Android project, so you can customize them:
sdk.dir=PATH_TO_ANDROID_SDK
android-project/
AndroidManifest.xml - package manifest. Among others, it contains the class name 6. Run 'ant debug' in android/project. This compiles the .java and eventually
of the main Activity and the package name of the application. creates a .apk with the native code embedded
build.properties - empty 7. 'ant debug install' will push the apk to the device or emulator (if connected)
build.xml - build description file, used by ant. The actual application name
is specified here. Here's an explanation of the files in the Android project, so you can customize them:
default.properties - holds the target ABI for the application, android-10 and up
project.properties - holds the target ABI for the application, android-10 and up android-project/
local.properties - holds the SDK path, you should change this to the path to your SDK AndroidManifest.xml - package manifest. Among others, it contains the class name
jni/ - directory holding native code of the main Activity and the package name of the application.
jni/Android.mk - Android makefile that can call recursively the Android.mk files build.properties - empty
in all subdirectories build.xml - build description file, used by ant. The actual application name
jni/SDL/ - (symlink to) directory holding the SDL library files is specified here.
jni/SDL/Android.mk - Android makefile for creating the SDL shared library default.properties - holds the target ABI for the application, android-10 and up
jni/src/ - directory holding your C/C++ source project.properties - holds the target ABI for the application, android-10 and up
jni/src/Android.mk - Android makefile that you should customize to include your local.properties - holds the SDK path, you should change this to the path to your SDK
source code and any library references jni/ - directory holding native code
res/ - directory holding resources for your application jni/Android.mk - Android makefile that can call recursively the Android.mk files
res/drawable-* - directories holding icons for different phone hardware. Could be in all subdirectories
one dir called "drawable". jni/SDL/ - (symlink to) directory holding the SDL library files
res/layout/main.xml - Usually contains a file main.xml, which declares the screen layout. jni/SDL/Android.mk - Android makefile for creating the SDL shared library
We don't need it because we use the SDL video output. jni/src/ - directory holding your C/C++ source
res/values/strings.xml - strings used in your application, including the application name jni/src/Android.mk - Android makefile that you should customize to include your
shown on the phone. source code and any library references
src/org/libsdl/app/SDLActivity.java - the Java class handling the initialization and binding res/ - directory holding resources for your application
to SDL. Be very careful changing this, as the SDL library relies res/drawable-* - directories holding icons for different phone hardware. Could be
on this implementation. one dir called "drawable".
res/layout/main.xml - Usually contains a file main.xml, which declares the screen layout.
We don't need it because we use the SDL video output.
================================================================================ res/values/strings.xml - strings used in your application, including the application name
Build an app with static linking of libSDL shown on the phone.
================================================================================ src/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
This build uses the Android NDK module system. on this implementation.
Instructions:
1. Copy the android-project directory wherever you want to keep your projects ================================================================================
and rename it to the name of your project. Build an app with static linking of libSDL
2. Rename <project>/jni/src/Android_static.mk to <project>/jni/src/Android.mk ================================================================================
(overwrite the existing one)
3. Edit <project>/jni/src/Android.mk to include your source files This build uses the Android NDK module system.
4. create and export an environment variable named NDK_MODULE_PATH that points
to the parent directory of this SDL directory. e.g.: Instructions:
1. Copy the android-project directory wherever you want to keep your projects
export NDK_MODULE_PATH="$PWD"/.. and rename it to the name of your project.
2. Rename "<project>/jni/src/Android_static.mk" to "<project>/jni/src/Android.mk"
5. Edit <project>/src/org/libsdl/app/SDLActivity.java and remove the call to (overwrite the existing one)
System.loadLibrary("SDL2"). 3. Edit "<project>/jni/src/Android.mk" to include your source files
6. Run 'ndk-build' (a script provided by the NDK). This compiles the C source 4. create and export an environment variable named NDK_MODULE_PATH that points
to the parent directory of this SDL directory. e.g.:
================================================================================ export NDK_MODULE_PATH="$PWD"/..
Customizing your application name
================================================================================ 5. Edit "<project>/src/org/libsdl/app/SDLActivity.java" and remove the call to
System.loadLibrary("SDL2").
To customize your application name, edit AndroidManifest.xml and replace 6. Run 'ndk-build' (a script provided by the NDK). This compiles the C source
"org.libsdl.app" with an identifier for your product package.
Then create a Java class extending SDLActivity and place it in a directory ================================================================================
under src matching your package, e.g. Customizing your application name
================================================================================
src/com/gamemaker/game/MyGame.java
To customize your application name, edit AndroidManifest.xml and replace
Here's an example of a minimal class file: "org.libsdl.app" with an identifier for your product package.
--- MyGame.java -------------------------- Then create a Java class extending SDLActivity and place it in a directory
package com.gamemaker.game; under src matching your package, e.g.
import org.libsdl.app.SDLActivity; src/com/gamemaker/game/MyGame.java
/** Here's an example of a minimal class file:
* A sample wrapper class that just calls SDLActivity
*/ --- MyGame.java --------------------------
package com.gamemaker.game;
public class MyGame extends SDLActivity { }
import org.libsdl.app.SDLActivity;
------------------------------------------
/**
Then replace "SDLActivity" in AndroidManifest.xml with the name of your * A sample wrapper class that just calls SDLActivity
class, .e.g. "MyGame" */
================================================================================ public class MyGame extends SDLActivity { }
Customizing your application icon
================================================================================ ------------------------------------------
Conceptually changing your icon is just replacing the "ic_launcher.png" files in Then replace "SDLActivity" in AndroidManifest.xml with the name of your
the drawable directories under the res directory. There are four directories for class, .e.g. "MyGame"
different screen sizes. These can be replaced with one dir called "drawable",
containing an icon file "ic_launcher.png" with dimensions 48x48 or 72x72. ================================================================================
Customizing your application icon
You may need to change the name of your icon in AndroidManifest.xml to match ================================================================================
this icon filename.
Conceptually changing your icon is just replacing the "ic_launcher.png" files in
================================================================================ the drawable directories under the res directory. There are four directories for
Loading assets different screen sizes. These can be replaced with one dir called "drawable",
================================================================================ containing an icon file "ic_launcher.png" with dimensions 48x48 or 72x72.
Any files you put in the "assets" directory of your android-project directory You may need to change the name of your icon in AndroidManifest.xml to match
will get bundled into the application package and you can load them using the this icon filename.
standard functions in SDL_rwops.h.
================================================================================
There are also a few Android specific functions that allow you to get other Loading assets
useful paths for saving and loading data: ================================================================================
* SDL_AndroidGetInternalStoragePath()
* SDL_AndroidGetExternalStorageState() Any files you put in the "assets" directory of your android-project directory
* SDL_AndroidGetExternalStoragePath() will get bundled into the application package and you can load them using the
standard functions in SDL_rwops.h.
See SDL_system.h for more details on these functions.
There are also a few Android specific functions that allow you to get other
The asset packaging system will, by default, compress certain file extensions. useful paths for saving and loading data:
SDL includes two asset file access mechanisms, the preferred one is the so * SDL_AndroidGetInternalStoragePath()
called "File Descriptor" method, which is faster and doesn't involve the Dalvik * SDL_AndroidGetExternalStorageState()
GC, but given this method does not work on compressed assets, there is also the * SDL_AndroidGetExternalStoragePath()
"Input Stream" method, which is automatically used as a fall back by SDL. You
may want to keep this fact in mind when building your APK, specially when large See SDL_system.h for more details on these functions.
files are involved.
For more information on which extensions get compressed by default and how to The asset packaging system will, by default, compress certain file extensions.
disable this behaviour, see for example: SDL includes two asset file access mechanisms, the preferred one is the so
called "File Descriptor" method, which is faster and doesn't involve the Dalvik
http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/ GC, but given this method does not work on compressed assets, there is also the
"Input Stream" method, which is automatically used as a fall back by SDL. You
================================================================================ may want to keep this fact in mind when building your APK, specially when large
Pause / Resume behaviour files are involved.
================================================================================ For more information on which extensions get compressed by default and how to
disable this behaviour, see for example:
If SDL is compiled with SDL_ANDROID_BLOCK_ON_PAUSE defined (the default),
the event loop will block itself when the app is paused (ie, when the user http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/
returns to the main Android dashboard). Blocking is better in terms of battery
use, and it allows your app to spring back to life instantaneously after resume ================================================================================
(versus polling for a resume message). Pause / Resume behaviour
================================================================================
Upon resume, SDL will attempt to restore the GL context automatically.
In modern devices (Android 3.0 and up) this will most likely succeed and your If SDL is compiled with SDL_ANDROID_BLOCK_ON_PAUSE defined (the default),
app can continue to operate as it was. the event loop will block itself when the app is paused (ie, when the user
returns to the main Android dashboard). Blocking is better in terms of battery
However, there's a chance (on older hardware, or on systems under heavy load), use, and it allows your app to spring back to life instantaneously after resume
where the GL context can not be restored. In that case you have to listen for (versus polling for a resume message).
a specific message, (which is not yet implemented!) and restore your textures
manually or quit the app (which is actually the kind of behaviour you'll see Upon resume, SDL will attempt to restore the GL context automatically.
under iOS, if the OS can not restore your GL context it will just kill your app) In modern devices (Android 3.0 and up) this will most likely succeed and your
app can continue to operate as it was.
================================================================================
Threads and the Java VM 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
a specific message, (which is not yet implemented!) and restore your textures
For a quick tour on how Linux native threads interoperate with the Java VM, take manually or quit the app (which is actually the kind of behaviour you'll see
a look here: http://developer.android.com/guide/practices/jni.html under iOS, if the OS can not restore your GL context it will just kill your app)
If you want to use threads in your SDL app, it's strongly recommended that you ================================================================================
do so by creating them using SDL functions. This way, the required attach/detach Threads and the Java VM
handling is managed by SDL automagically. If you have threads created by other ================================================================================
means and they make calls to SDL functions, make sure that you call
Android_JNI_SetupThread() before doing anything else otherwise SDL will attach For a quick tour on how Linux native threads interoperate with the Java VM, take
your thread automatically anyway (when you make an SDL call), but it'll never a look here: https://developer.android.com/guide/practices/jni.html
detach it.
If you want to use threads in your SDL app, it's strongly recommended that you
================================================================================ do so by creating them using SDL functions. This way, the required attach/detach
Using STL handling is managed by SDL automagically. If you have threads created by other
================================================================================ means and they make calls to SDL functions, make sure that you call
Android_JNI_SetupThread() before doing anything else otherwise SDL will attach
You can use STL in your project by creating an Application.mk file in the jni your thread automatically anyway (when you make an SDL call), but it'll never
folder and adding the following line: detach it.
APP_STL := stlport_static ================================================================================
Using STL
For more information check out CPLUSPLUS-SUPPORT.html in the NDK documentation. ================================================================================
================================================================================ You can use STL in your project by creating an Application.mk file in the jni
Additional documentation folder and adding the following line:
================================================================================
APP_STL := stlport_static
The documentation in the NDK docs directory is very helpful in understanding the
build process and how to work with native code on the Android platform. For more information check out CPLUSPLUS-SUPPORT.html in the NDK documentation.
The best place to start is with docs/OVERVIEW.TXT ================================================================================
Additional documentation
================================================================================
================================================================================
Using Eclipse The documentation in the NDK docs directory is very helpful in understanding the
================================================================================ build process and how to work with native code on the Android platform.
First make sure that you've installed Eclipse and the Android extensions as described here: The best place to start is with docs/OVERVIEW.TXT
http://developer.android.com/tools/sdk/eclipse-adt.html
Once you've copied the SDL android project and customized it, you can create an Eclipse project from it: ================================================================================
* File -> New -> Other Using Eclipse
* Select the Android -> Android Project wizard and click Next ================================================================================
* Enter the name you'd like your project to have
* Select "Create project from existing source" and browse for your project directory First make sure that you've installed Eclipse and the Android extensions as described here:
* Make sure the Build Target is set to Android 3.1 (API 12) https://developer.android.com/tools/sdk/eclipse-adt.html
* Click Finish
Once you've copied the SDL android project and customized it, you can create an Eclipse project from it:
* File -> New -> Other
================================================================================ * Select the Android -> Android Project wizard and click Next
Using the emulator * Enter the name you'd like your project to have
================================================================================ * Select "Create project from existing source" and browse for your project directory
* Make sure the Build Target is set to Android 3.1 (API 12)
There are some good tips and tricks for getting the most out of the * Click Finish
emulator here: http://developer.android.com/tools/devices/emulator.html
Especially useful is the info on setting up OpenGL ES 2.0 emulation. ================================================================================
Using the emulator
Notice that this software emulator is incredibly slow and needs a lot of disk space. ================================================================================
Using a real device works better.
There are some good tips and tricks for getting the most out of the
================================================================================ emulator here: https://developer.android.com/tools/devices/emulator.html
Troubleshooting
================================================================================ Especially useful is the info on setting up OpenGL ES 2.0 emulation.
You can create and run an emulator from the Eclipse IDE: Notice that this software emulator is incredibly slow and needs a lot of disk space.
* Window -> Android SDK and AVD Manager Using a real device works better.
You can see if adb can see any devices with the following command: ================================================================================
Troubleshooting
adb devices ================================================================================
You can see the output of log messages on the default device with: You can create and run an emulator from the Eclipse IDE:
* Window -> Android SDK and AVD Manager
adb logcat
You can see if adb can see any devices with the following command:
You can push files to the device with:
adb devices
adb push local_file remote_path_and_file
You can see the output of log messages on the default device with:
You can push files to the SD Card at /sdcard, for example:
adb logcat
adb push moose.dat /sdcard/moose.dat
You can push files to the device with:
You can see the files on the SD card with a shell command:
adb push local_file remote_path_and_file
adb shell ls /sdcard/
You can push files to the SD Card at /sdcard, for example:
You can start a command shell on the default device with:
adb push moose.dat /sdcard/moose.dat
adb shell
You can see the files on the SD card with a shell command:
You can remove the library files of your project (and not the SDL lib files) with:
adb shell ls /sdcard/
ndk-build clean
You can start a command shell on the default device with:
You can do a build with the following command:
adb shell
ndk-build
You can remove the library files of your project (and not the SDL lib files) with:
You can see the complete command line that ndk-build is using by passing V=1 on the command line:
ndk-build clean
ndk-build V=1
You can do a build with the following command:
If your application crashes in native code, you can use addr2line to convert the
addresses in the stack trace to lines in your code. ndk-build
For example, if your crash looks like this: You can see the complete command line that ndk-build is using by passing V=1 on the command line:
I/DEBUG ( 31): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 400085d0 ndk-build V=1
I/DEBUG ( 31): r0 00000000 r1 00001000 r2 00000003 r3 400085d4
I/DEBUG ( 31): r4 400085d0 r5 40008000 r6 afd41504 r7 436c6a7c If your application crashes in native code, you can use addr2line to convert the
I/DEBUG ( 31): r8 436c6b30 r9 435c6fb0 10 435c6f9c fp 4168d82c addresses in the stack trace to lines in your code.
I/DEBUG ( 31): ip 8346aff0 sp 436c6a60 lr afd1c8ff pc afd1c902 cpsr 60000030
I/DEBUG ( 31): #00 pc 0001c902 /system/lib/libc.so For example, if your crash looks like this:
I/DEBUG ( 31): #01 pc 0001ccf6 /system/lib/libc.so
I/DEBUG ( 31): #02 pc 000014bc /data/data/org.libsdl.app/lib/libmain.so I/DEBUG ( 31): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 400085d0
I/DEBUG ( 31): #03 pc 00001506 /data/data/org.libsdl.app/lib/libmain.so I/DEBUG ( 31): r0 00000000 r1 00001000 r2 00000003 r3 400085d4
I/DEBUG ( 31): r4 400085d0 r5 40008000 r6 afd41504 r7 436c6a7c
You can see that there's a crash in the C library being called from the main code. I/DEBUG ( 31): r8 436c6b30 r9 435c6fb0 10 435c6f9c fp 4168d82c
I run addr2line with the debug version of my code: I/DEBUG ( 31): ip 8346aff0 sp 436c6a60 lr afd1c8ff pc afd1c902 cpsr 60000030
I/DEBUG ( 31): #00 pc 0001c902 /system/lib/libc.so
arm-eabi-addr2line -C -f -e obj/local/armeabi/libmain.so I/DEBUG ( 31): #01 pc 0001ccf6 /system/lib/libc.so
I/DEBUG ( 31): #02 pc 000014bc /data/data/org.libsdl.app/lib/libmain.so
and then paste in the number after "pc" in the call stack, from the line that I care about: I/DEBUG ( 31): #03 pc 00001506 /data/data/org.libsdl.app/lib/libmain.so
000014bc
You can see that there's a crash in the C library being called from the main code.
I get output from addr2line showing that it's in the quit function, in testspriteminimal.c, on line 23. I run addr2line with the debug version of my code:
You can add logging to your code to help show what's happening: arm-eabi-addr2line -C -f -e obj/local/armeabi/libmain.so
#include <android/log.h> and then paste in the number after "pc" in the call stack, from the line that I care about:
000014bc
__android_log_print(ANDROID_LOG_INFO, "foo", "Something happened! x = %d", x);
I get output from addr2line showing that it's in the quit function, in testspriteminimal.c, on line 23.
If you need to build without optimization turned on, you can create a file called
"Application.mk" in the jni directory, with the following line in it: You can add logging to your code to help show what's happening:
APP_OPTIM := debug #include <android/log.h>
__android_log_print(ANDROID_LOG_INFO, "foo", "Something happened! x = %d", x);
================================================================================
Memory debugging If you need to build without optimization turned on, you can create a file called
================================================================================ "Application.mk" in the jni directory, with the following line in it:
The best (and slowest) way to debug memory issues on Android is valgrind. APP_OPTIM := debug
Valgrind has support for Android out of the box, just grab code using:
svn co svn://svn.valgrind.org/valgrind/trunk valgrind ================================================================================
Memory debugging
... and follow the instructions in the file README.android to build it. ================================================================================
One thing I needed to do on Mac OS X was change the path to the toolchain, The best (and slowest) way to debug memory issues on Android is valgrind.
and add ranlib to the environment variables: Valgrind has support for Android out of the box, just grab code using:
export RANLIB=$NDKROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-ranlib
svn co svn://svn.valgrind.org/valgrind/trunk valgrind
Once valgrind is built, you can create a wrapper script to launch your
application with it, changing org.libsdl.app to your package identifier: ... and follow the instructions in the file README.android to build it.
--- start_valgrind_app ------------------- One thing I needed to do on Mac OS X was change the path to the toolchain,
#!/system/bin/sh and add ranlib to the environment variables:
export TMPDIR=/data/data/org.libsdl.app export RANLIB=$NDKROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-ranlib
exec /data/local/Inst/bin/valgrind --log-file=/sdcard/valgrind.log --error-limit=no $*
------------------------------------------ Once valgrind is built, you can create a wrapper script to launch your
application with it, changing org.libsdl.app to your package identifier:
Then push it to the device:
--- start_valgrind_app -------------------
adb push start_valgrind_app /data/local #!/system/bin/sh
export TMPDIR=/data/data/org.libsdl.app
and make it executable: exec /data/local/Inst/bin/valgrind --log-file=/sdcard/valgrind.log --error-limit=no $*
------------------------------------------
adb shell chmod 755 /data/local/start_valgrind_app
Then push it to the device:
and tell Android to use the script to launch your application:
adb push start_valgrind_app /data/local
adb shell setprop wrap.org.libsdl.app "logwrapper /data/local/start_valgrind_app"
and make it executable:
If the setprop command says "could not set property", it's likely that
your package name is too long and you should make it shorter by changing adb shell chmod 755 /data/local/start_valgrind_app
AndroidManifest.xml and the path to your class file in android-project/src
and tell Android to use the script to launch your application:
You can then launch your application normally and waaaaaaaiiittt for it.
You can monitor the startup process with the logcat command above, and adb shell setprop wrap.org.libsdl.app "logwrapper /data/local/start_valgrind_app"
when it's done (or even while it's running) you can grab the valgrind
output file: If the setprop command says "could not set property", it's likely that
your package name is too long and you should make it shorter by changing
adb pull /sdcard/valgrind.log AndroidManifest.xml and the path to your class file in android-project/src
When you're done instrumenting with valgrind, you can disable the wrapper: You can then launch your application normally and waaaaaaaiiittt for it.
You can monitor the startup process with the logcat command above, and
adb shell setprop wrap.org.libsdl.app "" when it's done (or even while it's running) you can grab the valgrind
output file:
================================================================================
Why is API level 10 the minimum required? adb pull /sdcard/valgrind.log
================================================================================
When you're done instrumenting with valgrind, you can disable the wrapper:
API level 10 is the minimum required level at runtime (that is, on the device)
because SDL requires some functionality for running not adb shell setprop wrap.org.libsdl.app ""
available on older devices. Since the incorporation of joystick support into SDL,
the minimum SDK required to *build* SDL is version 12. Devices running API levels ================================================================================
10-11 are still supported, only with the joystick functionality disabled. Graphics debugging
================================================================================
Support for native OpenGL ES and ES2 applications was introduced in the NDK for
API level 4 and 8. EGL was made a stable API in the NDK for API level 9, which If you are developing on a compatible Tegra-based tablet, NVidia provides
has since then been obsoleted, with the recommendation to developers to bump the Tegra Graphics Debugger at their website. Because SDL2 dynamically loads EGL
required API level to 10. and GLES libraries, you must follow their instructions for installing the
As of this writing, according to http://developer.android.com/about/dashboards/index.html interposer library on a rooted device. The non-rooted instructions are not
about 90% of the Android devices accessing Google Play support API level 10 or compatible with applications that use SDL2 for video.
higher (March 2013).
The Tegra Graphics Debugger is available from NVidia here:
================================================================================ https://developer.nvidia.com/tegra-graphics-debugger
A note regarding the use of the "dirty rectangles" rendering technique
================================================================================ ================================================================================
Why is API level 10 the minimum required?
If your app uses a variation of the "dirty rectangles" rendering technique, ================================================================================
where you only update a portion of the screen on each frame, you may notice a
variety of visual glitches on Android, that are not present on other platforms. API level 10 is the minimum required level at runtime (that is, on the device)
This is caused by SDL's use of EGL as the support system to handle OpenGL ES/ES2 because SDL requires some functionality for running not
contexts, in particular the use of the eglSwapBuffers function. As stated in the available on older devices. Since the incorporation of joystick support into SDL,
documentation for the function "The contents of ancillary buffers are always the minimum SDK required to *build* SDL is version 12. Devices running API levels
undefined after calling eglSwapBuffers". 10-11 are still supported, only with the joystick functionality disabled.
Setting the EGL_SWAP_BEHAVIOR attribute of the surface to EGL_BUFFER_PRESERVED
is not possible for SDL as it requires EGL 1.4, available only on the API level Support for native OpenGL ES and ES2 applications was introduced in the NDK for
17+, so the only workaround available on this platform is to redraw the entire API level 4 and 8. EGL was made a stable API in the NDK for API level 9, which
screen each frame. has since then been obsoleted, with the recommendation to developers to bump the
required API level to 10.
Reference: http://www.khronos.org/registry/egl/specs/EGLTechNote0001.html As of this writing, according to https://developer.android.com/about/dashboards/index.html
about 90% of the Android devices accessing Google Play support API level 10 or
================================================================================ higher (March 2013).
Known issues
================================================================================ ================================================================================
A note regarding the use of the "dirty rectangles" rendering technique
- The number of buttons reported for each joystick is hardcoded to be 36, which ================================================================================
is the current maximum number of buttons Android can report.
If your app uses a variation of the "dirty rectangles" rendering technique,
where you only update a portion of the screen on each frame, you may notice a
variety of visual glitches on Android, that are not present on other platforms.
This is caused by SDL's use of EGL as the support system to handle OpenGL ES/ES2
contexts, in particular the use of the eglSwapBuffers function. As stated in the
documentation for the function "The contents of ancillary buffers are always
undefined after calling eglSwapBuffers".
Setting the EGL_SWAP_BEHAVIOR attribute of the surface to EGL_BUFFER_PRESERVED
is not possible for SDL as it requires EGL 1.4, available only on the API level
17+, so the only workaround available on this platform is to redraw the entire
screen each frame.
Reference: http://www.khronos.org/registry/egl/specs/EGLTechNote0001.html
================================================================================
Known issues
================================================================================
- The number of buttons reported for each joystick is hardcoded to be 36, which
is the current maximum number of buttons Android can report.

View File

@ -1,32 +1,32 @@
CMake CMake
================================================================================ ================================================================================
(www.cmake.org) (www.cmake.org)
SDL's build system was traditionally based on autotools. Over time, this SDL's build system was traditionally based on autotools. Over time, this
approach has suffered from several issues across the different supported approach has suffered from several issues across the different supported
platforms. platforms.
To solve these problems, a new build system based on CMake is under development. To solve these problems, a new build system based on CMake is under development.
It works in parallel to the legacy system, so users can experiment with it It works in parallel to the legacy system, so users can experiment with it
without complication. without complication.
While still experimental, the build system should be usable on the following While still experimental, the build system should be usable on the following
platforms: platforms:
* FreeBSD * FreeBSD
* Linux * Linux
* VS.NET 2010 * VS.NET 2010
* MinGW and Msys * MinGW and Msys
* OS X with support for XCode * OS X with support for XCode
================================================================================ ================================================================================
Usage Usage
================================================================================ ================================================================================
Assuming the source for SDL is located at ~/sdl Assuming the source for SDL is located at ~/sdl
cd ~ cd ~
mkdir build mkdir build
cd build cd build
cmake ../sdl cmake ../sdl
This will build the static and dynamic versions of SDL in the ~/build directory. This will build the static and dynamic versions of SDL in the ~/build directory.

View File

@ -1,107 +1,107 @@
DirectFB DirectFB
======== ========
Supports: Supports:
- Hardware YUV overlays - Hardware YUV overlays
- OpenGL - software only - OpenGL - software only
- 2D/3D accelerations (depends on directfb driver) - 2D/3D accelerations (depends on directfb driver)
- multiple displays - multiple displays
- windows - windows
What you need: What you need:
* DirectFB 1.0.1, 1.2.x, 1.3.0 * DirectFB 1.0.1, 1.2.x, 1.3.0
* Kernel-Framebuffer support: required: vesafb, radeonfb .... * Kernel-Framebuffer support: required: vesafb, radeonfb ....
* Mesa 7.0.x - optional for OpenGL * Mesa 7.0.x - optional for OpenGL
/etc/directfbrc /etc/directfbrc
This file should contain the following lines to make This file should contain the following lines to make
your joystick work and avoid crashes: your joystick work and avoid crashes:
------------------------ ------------------------
disable-module=joystick disable-module=joystick
disable-module=cle266 disable-module=cle266
disable-module=cyber5k disable-module=cyber5k
no-linux-input-grab no-linux-input-grab
------------------------ ------------------------
To disable to use x11 backend when DISPLAY variable is found use To disable to use x11 backend when DISPLAY variable is found use
export SDL_DIRECTFB_X11_CHECK=0 export SDL_DIRECTFB_X11_CHECK=0
To disable the use of linux input devices, i.e. multimice/multikeyboard support, To disable the use of linux input devices, i.e. multimice/multikeyboard support,
use use
export SDL_DIRECTFB_LINUX_INPUT=0 export SDL_DIRECTFB_LINUX_INPUT=0
To use hardware accelerated YUV-overlays for YUV-textures, use: To use hardware accelerated YUV-overlays for YUV-textures, use:
export SDL_DIRECTFB_YUV_DIRECT=1 export SDL_DIRECTFB_YUV_DIRECT=1
This is disabled by default. It will only support one This is disabled by default. It will only support one
YUV texture, namely the first. Every other YUV texture will be YUV texture, namely the first. Every other YUV texture will be
rendered in software. rendered in software.
In addition, you may use (directfb-1.2.x) In addition, you may use (directfb-1.2.x)
export SDL_DIRECTFB_YUV_UNDERLAY=1 export SDL_DIRECTFB_YUV_UNDERLAY=1
to make the YUV texture an underlay. This will make the cursor to to make the YUV texture an underlay. This will make the cursor to
be shown. be shown.
Simple Window Manager Simple Window Manager
===================== =====================
The driver has support for a very, very basic window manager you may The driver has support for a very, very basic window manager you may
want to use when running with "wm=default". Use want to use when running with "wm=default". Use
export SDL_DIRECTFB_WM=1 export SDL_DIRECTFB_WM=1
to enable basic window borders. In order to have the window title rendered, to enable basic window borders. In order to have the window title rendered,
you need to have the following font installed: you need to have the following font installed:
/usr/share/fonts/truetype/freefont/FreeSans.ttf /usr/share/fonts/truetype/freefont/FreeSans.ttf
OpenGL Support OpenGL Support
============== ==============
The following instructions will give you *software* OpenGL. However this The following instructions will give you *software* OpenGL. However this
works at least on all directfb supported platforms. works at least on all directfb supported platforms.
As of this writing 20100802 you need to pull Mesa from git and do the following: As of this writing 20100802 you need to pull Mesa from git and do the following:
------------------------ ------------------------
git clone git://anongit.freedesktop.org/git/mesa/mesa git clone git://anongit.freedesktop.org/git/mesa/mesa
cd mesa cd mesa
git checkout 2c9fdaf7292423c157fc79b5ce43f0f199dd753a git checkout 2c9fdaf7292423c157fc79b5ce43f0f199dd753a
------------------------ ------------------------
Edit configs/linux-directfb so that the Directories-section looks like Edit configs/linux-directfb so that the Directories-section looks like
------------------------ ------------------------
# Directories # Directories
SRC_DIRS = mesa glu SRC_DIRS = mesa glu
GLU_DIRS = sgi GLU_DIRS = sgi
DRIVER_DIRS = directfb DRIVER_DIRS = directfb
PROGRAM_DIRS = PROGRAM_DIRS =
------------------------ ------------------------
make linux-directfb make linux-directfb
make make
echo Installing - please enter sudo pw. echo Installing - please enter sudo pw.
sudo make install INSTALL_DIR=/usr/local/dfb_GL sudo make install INSTALL_DIR=/usr/local/dfb_GL
cd src/mesa/drivers/directfb cd src/mesa/drivers/directfb
make make
sudo make install INSTALL_DIR=/usr/local/dfb_GL sudo make install INSTALL_DIR=/usr/local/dfb_GL
------------------------ ------------------------
To run the SDL - testprograms: To run the SDL - testprograms:
export SDL_VIDEODRIVER=directfb export SDL_VIDEODRIVER=directfb
export LD_LIBRARY_PATH=/usr/local/dfb_GL/lib export LD_LIBRARY_PATH=/usr/local/dfb_GL/lib
export LD_PRELOAD=/usr/local/dfb_GL/libGL.so.7 export LD_PRELOAD=/usr/local/dfb_GL/libGL.so.7
./testgl ./testgl

View File

@ -5,7 +5,7 @@ Build:
$ mkdir build $ mkdir build
$ cd build $ cd build
$ emconfigure ../configure --host=asmjs-unknown-emscripten --disable-assembly --disable-threads --enable-cpuinfo=false CFLAGS="-O2" $ emconfigure ../configure --host=asmjs-unknown-emscripten --disable-assembly --disable-threads --disable-cpuinfo CFLAGS="-O2"
$ emmake make $ emmake make
Or with cmake: Or with cmake:
@ -22,8 +22,6 @@ To build one of the tests:
Uses GLES2 renderer or software Uses GLES2 renderer or software
tests: https://dl.dropboxusercontent.com/u/17360362/SDL2-em/index.html
Some other SDL2 libraries can be easily built (assuming SDL2 is installed somewhere): Some other SDL2 libraries can be easily built (assuming SDL2 is installed somewhere):
SDL_mixer (http://www.libsdl.org/projects/SDL_mixer/): SDL_mixer (http://www.libsdl.org/projects/SDL_mixer/):

View File

@ -1,71 +1,71 @@
Dollar Gestures Dollar Gestures
=========================================================================== ===========================================================================
SDL provides an implementation of the $1 gesture recognition system. This allows for recording, saving, loading, and performing single stroke gestures. SDL provides an implementation of the $1 gesture recognition system. This allows for recording, saving, loading, and performing single stroke gestures.
Gestures can be performed with any number of fingers (the centroid of the fingers must follow the path of the gesture), but the number of fingers must be constant (a finger cannot go down in the middle of a gesture). The path of a gesture is considered the path from the time when the final finger went down, to the first time any finger comes up. Gestures can be performed with any number of fingers (the centroid of the fingers must follow the path of the gesture), but the number of fingers must be constant (a finger cannot go down in the middle of a gesture). The path of a gesture is considered the path from the time when the final finger went down, to the first time any finger comes up.
Dollar gestures are assigned an Id based on a hash function. This is guaranteed to remain constant for a given gesture. There is a (small) chance that two different gestures will be assigned the same ID. In this case, simply re-recording one of the gestures should result in a different ID. Dollar gestures are assigned an Id based on a hash function. This is guaranteed to remain constant for a given gesture. There is a (small) chance that two different gestures will be assigned the same ID. In this case, simply re-recording one of the gestures should result in a different ID.
Recording: Recording:
---------- ----------
To begin recording on a touch device call: To begin recording on a touch device call:
SDL_RecordGesture(SDL_TouchID touchId), where touchId is the id of the touch device you wish to record on, or -1 to record on all connected devices. SDL_RecordGesture(SDL_TouchID touchId), where touchId is the id of the touch device you wish to record on, or -1 to record on all connected devices.
Recording terminates as soon as a finger comes up. Recording is acknowledged by an SDL_DOLLARRECORD event. Recording terminates as soon as a finger comes up. Recording is acknowledged by an SDL_DOLLARRECORD event.
A SDL_DOLLARRECORD event is a dgesture with the following fields: A SDL_DOLLARRECORD event is a dgesture with the following fields:
* event.dgesture.touchId - the Id of the touch used to record the gesture. * event.dgesture.touchId - the Id of the touch used to record the gesture.
* event.dgesture.gestureId - the unique id of the recorded gesture. * event.dgesture.gestureId - the unique id of the recorded gesture.
Performing: Performing:
----------- -----------
As long as there is a dollar gesture assigned to a touch, every finger-up event will also cause an SDL_DOLLARGESTURE event with the following fields: As long as there is a dollar gesture assigned to a touch, every finger-up event will also cause an SDL_DOLLARGESTURE event with the following fields:
* event.dgesture.touchId - the Id of the touch which performed the gesture. * event.dgesture.touchId - the Id of the touch which performed the gesture.
* event.dgesture.gestureId - the unique id of the closest gesture to the performed stroke. * event.dgesture.gestureId - the unique id of the closest gesture to the performed stroke.
* event.dgesture.error - the difference between the gesture template and the actual performed gesture. Lower error is a better match. * event.dgesture.error - the difference between the gesture template and the actual performed gesture. Lower error is a better match.
* event.dgesture.numFingers - the number of fingers used to draw the stroke. * event.dgesture.numFingers - the number of fingers used to draw the stroke.
Most programs will want to define an appropriate error threshold and check to be sure that the error of a gesture is not abnormally high (an indicator that no gesture was performed). Most programs will want to define an appropriate error threshold and check to be sure that the error of a gesture is not abnormally high (an indicator that no gesture was performed).
Saving: Saving:
------- -------
To save a template, call SDL_SaveDollarTemplate(gestureId, dst) where gestureId is the id of the gesture you want to save, and dst is an SDL_RWops pointer to the file where the gesture will be stored. To save a template, call SDL_SaveDollarTemplate(gestureId, dst) where gestureId is the id of the gesture you want to save, and dst is an SDL_RWops pointer to the file where the gesture will be stored.
To save all currently loaded templates, call SDL_SaveAllDollarTemplates(dst) where dst is an SDL_RWops pointer to the file where the gesture will be stored. To save all currently loaded templates, call SDL_SaveAllDollarTemplates(dst) where dst is an SDL_RWops pointer to the file where the gesture will be stored.
Both functions return the number of gestures successfully saved. Both functions return the number of gestures successfully saved.
Loading: Loading:
-------- --------
To load templates from a file, call SDL_LoadDollarTemplates(touchId,src) where touchId is the id of the touch to load to (or -1 to load to all touch devices), and src is an SDL_RWops pointer to a gesture save file. To load templates from a file, call SDL_LoadDollarTemplates(touchId,src) where touchId is the id of the touch to load to (or -1 to load to all touch devices), and src is an SDL_RWops pointer to a gesture save file.
SDL_LoadDollarTemplates returns the number of templates successfully loaded. SDL_LoadDollarTemplates returns the number of templates successfully loaded.
=========================================================================== ===========================================================================
Multi Gestures Multi Gestures
=========================================================================== ===========================================================================
SDL provides simple support for pinch/rotate/swipe gestures. SDL provides simple support for pinch/rotate/swipe gestures.
Every time a finger is moved an SDL_MULTIGESTURE event is sent with the following fields: Every time a finger is moved an SDL_MULTIGESTURE event is sent with the following fields:
* event.mgesture.touchId - the Id of the touch on which the gesture was performed. * event.mgesture.touchId - the Id of the touch on which the gesture was performed.
* event.mgesture.x - the normalized x coordinate of the gesture. (0..1) * event.mgesture.x - the normalized x coordinate of the gesture. (0..1)
* event.mgesture.y - the normalized y coordinate of the gesture. (0..1) * event.mgesture.y - the normalized y coordinate of the gesture. (0..1)
* event.mgesture.dTheta - the amount that the fingers rotated during this motion. * event.mgesture.dTheta - the amount that the fingers rotated during this motion.
* event.mgesture.dDist - the amount that the fingers pinched during this motion. * event.mgesture.dDist - the amount that the fingers pinched during this motion.
* event.mgesture.numFingers - the number of fingers used in the gesture. * event.mgesture.numFingers - the number of fingers used in the gesture.
=========================================================================== ===========================================================================
Notes Notes
=========================================================================== ===========================================================================
For a complete example see test/testgesture.c For a complete example see test/testgesture.c
Please direct questions/comments to: Please direct questions/comments to:
jim.tla+sdl_touch@gmail.com jim.tla+sdl_touch@gmail.com

View File

@ -1,25 +1,22 @@
Mercurial Mercurial
========= =========
The latest development version of SDL is available via Mercurial. The latest development version of SDL is available via Mercurial.
Mercurial allows you to get up-to-the-minute fixes and enhancements; 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 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 source tree instead of waiting for an official release. Please look
at the Mercurial website ( http://mercurial.selenic.com/ ) for more at the Mercurial website ( https://www.mercurial-scm.org/ ) for more
information on using hg, where you can also download software for information on using hg, where you can also download software for
Mac OS X, Windows, and Unix systems. Mac OS X, Windows, and Unix systems.
hg clone http://hg.libsdl.org/SDL hg clone http://hg.libsdl.org/SDL
If you are building SDL with an IDE, you will need to copy the file If you are building SDL via configure, you will need to run autogen.sh
include/SDL_config.h.default to include/SDL_config.h before building. before running configure.
If you are building SDL via configure, you will need to run autogen.sh There is a web interface to the subversion repository at:
before running configure. http://hg.libsdl.org/SDL/
There is a web interface to the subversion repository at: There is an RSS feed available at that URL, for those that want to
http://hg.libsdl.org/SDL/ track commits in real time.
There is an RSS feed available at that URL, for those that want to
track commits in real time.

View File

@ -1,266 +1,284 @@
iOS iOS
====== ======
============================================================================== ==============================================================================
Building the Simple DirectMedia Layer for iOS 5.1+ Building the Simple DirectMedia Layer for iOS 5.1+
============================================================================== ==============================================================================
Requirements: Mac OS X 10.8 or later and the iOS 7+ SDK. Requirements: Mac OS X 10.8 or later and the iOS 7+ SDK.
Instructions: Instructions:
1. Open SDL.xcodeproj (located in Xcode-iOS/SDL) in Xcode.
2. Select your desired target, and hit build. 1. Open SDL.xcodeproj (located in Xcode-iOS/SDL) in Xcode.
2. Select your desired target, and hit build.
There are three build targets:
- libSDL.a: There are three build targets:
Build SDL as a statically linked library - libSDL.a:
- testsdl: Build SDL as a statically linked library
Build a test program (there are known test failures which are fine) - testsdl:
- Template: Build a test program (there are known test failures which are fine)
Package a project template together with the SDL for iPhone static libraries and copies of the SDL headers. The template includes proper references to the SDL library and headers, skeleton code for a basic SDL program, and placeholder graphics for the application icon and startup screen. - Template:
Package a project template together with the SDL for iPhone static libraries and copies of the SDL headers. The template includes proper references to the SDL library and headers, skeleton code for a basic SDL program, and placeholder graphics for the application icon and startup screen.
==============================================================================
Build SDL for iOS from the command line ==============================================================================
============================================================================== Build SDL for iOS from the command line
==============================================================================
1. cd (PATH WHERE THE SDL CODE IS)/build-scripts
2. ./iosbuild.sh 1. cd (PATH WHERE THE SDL CODE IS)/build-scripts
2. ./iosbuild.sh
If everything goes fine, you should see a build/ios directory, inside there's
two directories "lib" and "include". If everything goes fine, you should see a build/ios directory, inside there's
"include" contains a copy of the SDL headers that you'll need for your project, two directories "lib" and "include".
make sure to configure XCode to look for headers there. "include" contains a copy of the SDL headers that you'll need for your project,
"lib" contains find two files, libSDL2.a and libSDL2main.a, you have to add both make sure to configure XCode to look for headers there.
to your XCode project. These libraries contain three architectures in them, "lib" contains find two files, libSDL2.a and libSDL2main.a, you have to add both
armv6 for legacy devices, armv7, and i386 (for the simulator). to your XCode project. These libraries contain three architectures in them,
By default, iosbuild.sh will autodetect the SDK version you have installed using armv6 for legacy devices, armv7, and i386 (for the simulator).
xcodebuild -showsdks, and build for iOS >= 3.0, you can override this behaviour By default, iosbuild.sh will autodetect the SDK version you have installed using
by setting the MIN_OS_VERSION variable, ie: xcodebuild -showsdks, and build for iOS >= 3.0, you can override this behaviour
by setting the MIN_OS_VERSION variable, ie:
MIN_OS_VERSION=4.2 ./iosbuild.sh
MIN_OS_VERSION=4.2 ./iosbuild.sh
==============================================================================
Using the Simple DirectMedia Layer for iOS ==============================================================================
============================================================================== Using the Simple DirectMedia Layer for iOS
==============================================================================
FIXME: This needs to be updated for the latest methods
FIXME: This needs to be updated for the latest methods
Here is the easiest method:
1. Build the SDL library (libSDL2.a) and the iPhone SDL Application template. Here is the easiest method:
2. Install the iPhone SDL Application template by copying it to one of Xcode's template directories. I recommend creating a directory called "SDL" in "/Developer/Platforms/iOS.platform/Developer/Library/Xcode/Project Templates/" and placing it there. 1. Build the SDL library (libSDL2.a) and the iPhone SDL Application template.
3. Start a new project using the template. The project should be immediately ready for use with SDL. 2. Install the iPhone SDL Application template by copying it to one of Xcode's template directories. I recommend creating a directory called "SDL" in "/Developer/Platforms/iOS.platform/Developer/Library/Xcode/Project Templates/" and placing it there.
3. Start a new project using the template. The project should be immediately ready for use with SDL.
Here is a more manual method:
1. Create a new iOS view based application. Here is a more manual method:
2. Build the SDL static library (libSDL2.a) for iOS and include them in your project. Xcode will ignore the library that is not currently of the correct architecture, hence your app will work both on iOS and in the iOS Simulator. 1. Create a new iOS view based application.
3. Include the SDL header files in your project. 2. Build the SDL static library (libSDL2.a) for iOS and include them in your project. Xcode will ignore the library that is not currently of the correct architecture, hence your app will work both on iOS and in the iOS Simulator.
4. Remove the ApplicationDelegate.h and ApplicationDelegate.m files -- SDL for iOS provides its own UIApplicationDelegate. Remove MainWindow.xib -- SDL for iOS produces its user interface programmatically. 3. Include the SDL header files in your project.
5. Delete the contents of main.m and program your app as a regular SDL program instead. You may replace main.m with your own main.c, but you must tell Xcode not to use the project prefix file, as it includes Objective-C code. 4. Remove the ApplicationDelegate.h and ApplicationDelegate.m files -- SDL for iOS provides its own UIApplicationDelegate. Remove MainWindow.xib -- SDL for iOS produces its user interface programmatically.
5. Delete the contents of main.m and program your app as a regular SDL program instead. You may replace main.m with your own main.c, but you must tell Xcode not to use the project prefix file, as it includes Objective-C code.
==============================================================================
Notes -- Retina / High-DPI and window sizes ==============================================================================
============================================================================== Notes -- Retina / High-DPI and window sizes
==============================================================================
Window and display mode sizes in SDL are in "screen coordinates" (or "points",
in Apple's terminology) rather than in pixels. On iOS this means that a window Window and display mode sizes in SDL are in "screen coordinates" (or "points",
created on an iPhone 6 will have a size in screen coordinates of 375 x 667, in Apple's terminology) rather than in pixels. On iOS this means that a window
rather than a size in pixels of 750 x 1334. All iOS apps are expected to created on an iPhone 6 will have a size in screen coordinates of 375 x 667,
size their content based on screen coordinates / points rather than pixels, rather than a size in pixels of 750 x 1334. All iOS apps are expected to
as this allows different iOS devices to have different pixel densities size their content based on screen coordinates / points rather than pixels,
(Retina versus non-Retina screens, etc.) without apps caring too much. as this allows different iOS devices to have different pixel densities
(Retina versus non-Retina screens, etc.) without apps caring too much.
By default SDL will not use the full pixel density of the screen on
Retina/high-dpi capable devices. Use the SDL_WINDOW_ALLOW_HIGHDPI flag when By default SDL will not use the full pixel density of the screen on
creating your window to enable high-dpi support. Retina/high-dpi capable devices. Use the SDL_WINDOW_ALLOW_HIGHDPI flag when
creating your window to enable high-dpi support.
When high-dpi support is enabled, SDL_GetWindowSize and display mode sizes
will still be in "screen coordinates" rather than pixels, but the window will When high-dpi support is enabled, SDL_GetWindowSize() and display mode sizes
have a much greater pixel density when the device supports it, and the will still be in "screen coordinates" rather than pixels, but the window will
SDL_GL_GetDrawableSize or SDL_GetRendererOutputSize functions (depending on have a much greater pixel density when the device supports it, and the
whether raw OpenGL or the SDL_Render API is used) can be queried to determine SDL_GL_GetDrawableSize() or SDL_GetRendererOutputSize() functions (depending on
the size in pixels of the drawable screen framebuffer. whether raw OpenGL or the SDL_Render API is used) can be queried to determine
the size in pixels of the drawable screen framebuffer.
Some OpenGL ES functions such as glViewport expect sizes in pixels rather than
sizes in screen coordinates. When doing 2D rendering with OpenGL ES, an Some OpenGL ES functions such as glViewport expect sizes in pixels rather than
orthographic projection matrix using the size in screen coordinates sizes in screen coordinates. When doing 2D rendering with OpenGL ES, an
(SDL_GetWindowSize) can be used in order to display content at the same scale orthographic projection matrix using the size in screen coordinates
no matter whether a Retina device is used or not. (SDL_GetWindowSize()) can be used in order to display content at the same scale
no matter whether a Retina device is used or not.
==============================================================================
Notes -- Application events ==============================================================================
============================================================================== Notes -- Application events
==============================================================================
On iOS the application goes through a fixed life cycle and you will get
notifications of state changes via application events. When these events On iOS the application goes through a fixed life cycle and you will get
are delivered you must handle them in an event callback because the OS may notifications of state changes via application events. When these events
not give you any processing time after the events are delivered. are delivered you must handle them in an event callback because the OS may
not give you any processing time after the events are delivered.
e.g.
e.g.
int HandleAppEvents(void *userdata, SDL_Event *event)
{ int HandleAppEvents(void *userdata, SDL_Event *event)
switch (event->type) {
{ switch (event->type)
case SDL_APP_TERMINATING: {
/* Terminate the app. case SDL_APP_TERMINATING:
Shut everything down before returning from this function. /* Terminate the app.
*/ Shut everything down before returning from this function.
return 0; */
case SDL_APP_LOWMEMORY: return 0;
/* You will get this when your app is paused and iOS wants more memory. case SDL_APP_LOWMEMORY:
Release as much memory as possible. /* You will get this when your app is paused and iOS wants more memory.
*/ Release as much memory as possible.
return 0; */
case SDL_APP_WILLENTERBACKGROUND: return 0;
/* Prepare your app to go into the background. Stop loops, etc. case SDL_APP_WILLENTERBACKGROUND:
This gets called when the user hits the home button, or gets a call. /* Prepare your app to go into the background. Stop loops, etc.
*/ This gets called when the user hits the home button, or gets a call.
return 0; */
case SDL_APP_DIDENTERBACKGROUND: return 0;
/* This will get called if the user accepted whatever sent your app to the background. case SDL_APP_DIDENTERBACKGROUND:
If the user got a phone call and canceled it, you'll instead get an SDL_APP_DIDENTERFOREGROUND event and restart your loops. /* This will get called if the user accepted whatever sent your app to the background.
When you get this, you have 5 seconds to save all your state or the app will be terminated. If the user got a phone call and canceled it, you'll instead get an SDL_APP_DIDENTERFOREGROUND event and restart your loops.
Your app is NOT active at this point. When you get this, you have 5 seconds to save all your state or the app will be terminated.
*/ Your app is NOT active at this point.
return 0; */
case SDL_APP_WILLENTERFOREGROUND: return 0;
/* This call happens when your app is coming back to the foreground. case SDL_APP_WILLENTERFOREGROUND:
Restore all your state here. /* This call happens when your app is coming back to the foreground.
*/ Restore all your state here.
return 0; */
case SDL_APP_DIDENTERFOREGROUND: return 0;
/* Restart your loops here. case SDL_APP_DIDENTERFOREGROUND:
Your app is interactive and getting CPU again. /* Restart your loops here.
*/ Your app is interactive and getting CPU again.
return 0; */
default: return 0;
/* No special processing, add it to the event queue */ default:
return 1; /* No special processing, add it to the event queue */
} return 1;
} }
}
int main(int argc, char *argv[])
{ int main(int argc, char *argv[])
SDL_SetEventFilter(HandleAppEvents, NULL); {
SDL_SetEventFilter(HandleAppEvents, NULL);
... run your main loop
... run your main loop
return 0;
} return 0;
}
==============================================================================
Notes -- Accelerometer as Joystick ==============================================================================
============================================================================== Notes -- Accelerometer as Joystick
==============================================================================
SDL for iPhone supports polling the built in accelerometer as a joystick device. For an example on how to do this, see the accelerometer.c in the demos directory.
SDL for iPhone supports polling the built in accelerometer as a joystick device. For an example on how to do this, see the accelerometer.c in the demos directory.
The main thing to note when using the accelerometer with SDL is that while the iPhone natively reports accelerometer as floating point values in units of g-force, SDL_JoystickGetAxis reports joystick values as signed integers. Hence, in order to convert between the two, some clamping and scaling is necessary on the part of the iPhone SDL joystick driver. To convert SDL_JoystickGetAxis reported values BACK to units of g-force, simply multiply the values by SDL_IPHONE_MAX_GFORCE / 0x7FFF.
The main thing to note when using the accelerometer with SDL is that while the iPhone natively reports accelerometer as floating point values in units of g-force, SDL_JoystickGetAxis() reports joystick values as signed integers. Hence, in order to convert between the two, some clamping and scaling is necessary on the part of the iPhone SDL joystick driver. To convert SDL_JoystickGetAxis() reported values BACK to units of g-force, simply multiply the values by SDL_IPHONE_MAX_GFORCE / 0x7FFF.
==============================================================================
Notes -- OpenGL ES ==============================================================================
============================================================================== Notes -- OpenGL ES
==============================================================================
Your SDL application for iOS uses OpenGL ES for video by default.
Your SDL application for iOS uses OpenGL ES for video by default.
OpenGL ES for iOS supports several display pixel formats, such as RGBA8 and RGB565, which provide a 32 bit and 16 bit color buffer respectively. By default, the implementation uses RGB565, but you may use RGBA8 by setting each color component to 8 bits in SDL_GL_SetAttribute.
OpenGL ES for iOS supports several display pixel formats, such as RGBA8 and RGB565, which provide a 32 bit and 16 bit color buffer respectively. By default, the implementation uses RGB565, but you may use RGBA8 by setting each color component to 8 bits in SDL_GL_SetAttribute().
If your application doesn't use OpenGL's depth buffer, you may find significant performance improvement by setting SDL_GL_DEPTH_SIZE to 0.
If your application doesn't use OpenGL's depth buffer, you may find significant performance improvement by setting SDL_GL_DEPTH_SIZE to 0.
Finally, if your application completely redraws the screen each frame, you may find significant performance improvement by setting the attribute SDL_GL_RETAINED_BACKING to 0.
Finally, if your application completely redraws the screen each frame, you may find significant performance improvement by setting the attribute SDL_GL_RETAINED_BACKING to 0.
OpenGL ES on iOS doesn't use the traditional system-framebuffer setup provided in other operating systems. Special care must be taken because of this:
OpenGL ES on iOS doesn't use the traditional system-framebuffer setup provided in other operating systems. Special care must be taken because of this:
- The drawable Renderbuffer must be bound to the GL_RENDERBUFFER binding point when SDL_GL_SwapWindow is called.
- The drawable Framebuffer Object must be bound while rendering to the screen and when SDL_GL_SwapWindow is called. - The drawable Renderbuffer must be bound to the GL_RENDERBUFFER binding point when SDL_GL_SwapWindow() is called.
- If multisample antialiasing (MSAA) is used and glReadPixels is used on the screen, the drawable framebuffer must be resolved to the MSAA resolve framebuffer (via glBlitFramebuffer or glResolveMultisampleFramebufferAPPLE), and the MSAA resolve framebuffer must be bound to the GL_READ_FRAMEBUFFER binding point, before glReadPixels is called. - The drawable Framebuffer Object must be bound while rendering to the screen and when SDL_GL_SwapWindow() is called.
- If multisample antialiasing (MSAA) is used and glReadPixels is used on the screen, the drawable framebuffer must be resolved to the MSAA resolve framebuffer (via glBlitFramebuffer or glResolveMultisampleFramebufferAPPLE), and the MSAA resolve framebuffer must be bound to the GL_READ_FRAMEBUFFER binding point, before glReadPixels is called.
The above objects can be obtained via SDL_GetWindowWMInfo (in SDL_syswm.h).
The above objects can be obtained via SDL_GetWindowWMInfo() (in SDL_syswm.h).
==============================================================================
Notes -- Keyboard ==============================================================================
============================================================================== Notes -- Keyboard
==============================================================================
The SDL keyboard API has been extended to support on-screen keyboards:
The SDL keyboard API has been extended to support on-screen keyboards:
void SDL_StartTextInput()
-- enables text events and reveals the onscreen keyboard. void SDL_StartTextInput()
-- enables text events and reveals the onscreen keyboard.
void SDL_StopTextInput()
-- disables text events and hides the onscreen keyboard. void SDL_StopTextInput()
-- disables text events and hides the onscreen keyboard.
SDL_bool SDL_IsTextInputActive()
-- returns whether or not text events are enabled (and the onscreen keyboard is visible) SDL_bool SDL_IsTextInputActive()
-- returns whether or not text events are enabled (and the onscreen keyboard is visible)
==============================================================================
Notes -- Reading and Writing files ==============================================================================
============================================================================== Notes -- Reading and Writing files
==============================================================================
Each application installed on iPhone resides in a sandbox which includes its own Application Home directory. Your application may not access files outside this directory.
Each application installed on iPhone resides in a sandbox which includes its own Application Home directory. Your application may not access files outside this directory.
Once your application is installed its directory tree looks like:
Once your application is installed its directory tree looks like:
MySDLApp Home/
MySDLApp.app MySDLApp Home/
Documents/ MySDLApp.app
Library/ Documents/
Preferences/ Library/
tmp/ Preferences/
tmp/
When your SDL based iPhone application starts up, it sets the working directory to the main bundle (MySDLApp Home/MySDLApp.app), where your application resources are stored. You cannot write to this directory. Instead, I advise you to write document files to "../Documents/" and preferences to "../Library/Preferences".
When your SDL based iPhone application starts up, it sets the working directory to the main bundle (MySDLApp Home/MySDLApp.app), where your application resources are stored. You cannot write to this directory. Instead, I advise you to write document files to "../Documents/" and preferences to "../Library/Preferences".
More information on this subject is available here:
http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html More information on this subject is available here:
http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html
==============================================================================
Notes -- iPhone SDL limitations ==============================================================================
============================================================================== Notes -- iPhone SDL limitations
==============================================================================
Windows:
Full-size, single window applications only. You cannot create multi-window SDL applications for iPhone OS. The application window will fill the display, though you have the option of turning on or off the menu-bar (pass SDL_CreateWindow the flag SDL_WINDOW_BORDERLESS). Windows:
Full-size, single window applications only. You cannot create multi-window SDL applications for iPhone OS. The application window will fill the display, though you have the option of turning on or off the menu-bar (pass SDL_CreateWindow() the flag SDL_WINDOW_BORDERLESS).
Textures:
The optimal texture formats on iOS are SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, and SDL_PIXELFORMAT_RGB24 pixel formats. Textures:
The optimal texture formats on iOS are SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, and SDL_PIXELFORMAT_RGB24 pixel formats.
Loading Shared Objects:
This is disabled by default since it seems to break the terms of the iOS SDK agreement for iOS versions prior to iOS 8. It can be re-enabled in SDL_config_iphoneos.h. Loading Shared Objects:
This is disabled by default since it seems to break the terms of the iOS SDK agreement for iOS versions prior to iOS 8. It can be re-enabled in SDL_config_iphoneos.h.
==============================================================================
Game Center ==============================================================================
============================================================================== Game Center
==============================================================================
Game Center integration might require that you break up your main loop in order to yield control back to the system. In other words, instead of running an endless main loop, you run each frame in a callback function, using:
Game Center integration might require that you break up your main loop in order to yield control back to the system. In other words, instead of running an endless main loop, you run each frame in a callback function, using:
int SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, void (*callback)(void*), void *callbackParam);
int SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, void (*callback)(void*), void *callbackParam);
This will set up the given function to be called back on the animation callback, and then you have to return from main() to let the Cocoa event loop run.
This will set up the given function to be called back on the animation callback, and then you have to return from main() to let the Cocoa event loop run.
e.g.
e.g.
extern "C"
void ShowFrame(void*) extern "C"
{ void ShowFrame(void*)
... do event handling, frame logic and rendering ... {
} ... do event handling, frame logic and rendering ...
}
int main(int argc, char *argv[])
{ int main(int argc, char *argv[])
... initialize game ... {
... initialize game ...
#if __IPHONEOS__
// Initialize the Game Center for scoring and matchmaking #if __IPHONEOS__
InitGameCenter(); // Initialize the Game Center for scoring and matchmaking
InitGameCenter();
// Set up the game to run in the window animation callback on iOS
// so that Game Center and so forth works correctly. // Set up the game to run in the window animation callback on iOS
SDL_iPhoneSetAnimationCallback(window, 1, ShowFrame, NULL); // so that Game Center and so forth works correctly.
#else SDL_iPhoneSetAnimationCallback(window, 1, ShowFrame, NULL);
while ( running ) { #else
ShowFrame(0); while ( running ) {
DelayFrame(); ShowFrame(0);
} DelayFrame();
#endif }
return 0; #endif
} return 0;
}
==============================================================================
Deploying to older versions of iOS
==============================================================================
SDL supports deploying to older versions of iOS than are supported by the latest version of Xcode, all the way back to iOS 6.1
In order to do that you need to download an older version of Xcode:
https://developer.apple.com/download/more/?name=Xcode
Open the package contents of the older Xcode and your newer version of Xcode and copy over the folders in Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
Then open the file Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/SDKSettings.plist and add the versions of iOS you want to deploy to the key Root/DefaultProperties/DEPLOYMENT_TARGET_SUGGESTED_VALUES
Open your project and set your deployment target to the desired version of iOS
Finally, remove GameController from the list of frameworks linked by your application and edit the build settings for "Other Linker Flags" and add -weak_framework GameController

View File

@ -19,14 +19,22 @@ sudo apt-get install build-essential mercurial make cmake autoconf automake \
libtool libasound2-dev libpulse-dev libaudio-dev libx11-dev libxext-dev \ libtool libasound2-dev libpulse-dev libaudio-dev libx11-dev libxext-dev \
libxrandr-dev libxcursor-dev libxi-dev libxinerama-dev libxxf86vm-dev \ libxrandr-dev libxcursor-dev libxi-dev libxinerama-dev libxxf86vm-dev \
libxss-dev libgl1-mesa-dev libesd0-dev libdbus-1-dev libudev-dev \ libxss-dev libgl1-mesa-dev libesd0-dev libdbus-1-dev libudev-dev \
libgles1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev libibus-1.0-dev libgles1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev libibus-1.0-dev \
fcitx-libs-dev libsamplerate0-dev libsndio-dev
Ubuntu 14.04 can also add "libwayland-dev libmirclient-dev libxkbcommon-dev" Ubuntu 16.04+ can also add "libwayland-dev libxkbcommon-dev wayland-protocols"
to that command line for Wayland and Mir support. to that command line for Wayland support.
Ubuntu 16.10 can also add "libmirclient-dev libxkbcommon-dev" to that command
line for Mir support.
NOTES: NOTES:
- This includes all the audio targets except arts, because Ubuntu pulled the - This includes all the audio targets except arts, because Ubuntu pulled the
artsc0-dev package, but in theory SDL still supports it. artsc0-dev package, but in theory SDL still supports it.
- libsamplerate0-dev lets SDL optionally link to libresamplerate at runtime
for higher-quality audio resampling. SDL will work without it if the library
is missing, so it's safe to build in support even if the end user doesn't
have this library installed.
- DirectFB isn't included because the configure script (currently) fails to find - DirectFB isn't included because the configure script (currently) fails to find
it at all. You can do "sudo apt-get install libdirectfb-dev" and fix the it at all. You can do "sudo apt-get install libdirectfb-dev" and fix the
configure script to include DirectFB support. Send patches. :) configure script to include DirectFB support. Send patches. :)

View File

@ -1,230 +1,240 @@
Mac OS X Mac OS X
============================================================================== ==============================================================================
These instructions are for people using Apple's Mac OS X (pronounced These instructions are for people using Apple's Mac OS X (pronounced
"ten"). "ten").
From the developer's point of view, OS X is a sort of hybrid Mac and From the developer's point of view, OS X is a sort of hybrid Mac and
Unix system, and you have the option of using either traditional Unix system, and you have the option of using either traditional
command line tools or Apple's IDE Xcode. command line tools or Apple's IDE Xcode.
To build SDL using the command line, use the standard configure and make Command Line Build
process: ==================
./configure To build SDL using the command line, use the standard configure and make
make process:
sudo make install
./configure
You can also build SDL as a Universal library (a single binary for both make
32-bit and 64-bit Intel architectures), on Mac OS X 10.7 and newer, by using sudo make install
the gcc-fat.sh script in build-scripts:
You can also build SDL as a Universal library (a single binary for both
mkdir mybuild 32-bit and 64-bit Intel architectures), on Mac OS X 10.7 and newer, by using
cd mybuild the gcc-fat.sh script in build-scripts:
CC=$PWD/../build-scripts/gcc-fat.sh CXX=$PWD/../build-scripts/g++fat.sh ../configure
make mkdir mybuild
sudo make install cd mybuild
CC=$PWD/../build-scripts/gcc-fat.sh CXX=$PWD/../build-scripts/g++-fat.sh ../configure
This script builds SDL with 10.5 ABI compatibility on i386 and 10.6 make
ABI compatibility on x86_64 architectures. For best compatibility you sudo make install
should compile your application the same way.
This script builds SDL with 10.5 ABI compatibility on i386 and 10.6
Please note that building SDL requires at least Xcode 4.6 and the 10.7 SDK ABI compatibility on x86_64 architectures. For best compatibility you
(even if you target back to 10.5 systems). PowerPC support for Mac OS X has should compile your application the same way.
been officially dropped as of SDL 2.0.2.
Please note that building SDL requires at least Xcode 4.6 and the 10.7 SDK
To use the library once it's built, you essential have two possibilities: (even if you target back to 10.5 systems). PowerPC support for Mac OS X has
use the traditional autoconf/automake/make method, or use Xcode. been officially dropped as of SDL 2.0.2.
============================================================================== To use the library once it's built, you essential have two possibilities:
Caveats for using SDL with Mac OS X use the traditional autoconf/automake/make method, or use Xcode.
==============================================================================
==============================================================================
Some things you have to be aware of when using SDL on Mac OS X: Caveats for using SDL with Mac OS X
==============================================================================
- If you register your own NSApplicationDelegate (using [NSApp setDelegate:]),
SDL will not register its own. This means that SDL will not terminate using Some things you have to be aware of when using SDL on Mac OS X:
SDL_Quit if it receives a termination request, it will terminate like a
normal app, and it will not send a SDL_DROPFILE when you request to open a - If you register your own NSApplicationDelegate (using [NSApp setDelegate:]),
file with the app. To solve these issues, put the following code in your SDL will not register its own. This means that SDL will not terminate using
NSApplicationDelegate implementation: SDL_Quit if it receives a termination request, it will terminate like a
normal app, and it will not send a SDL_DROPFILE when you request to open a
file with the app. To solve these issues, put the following code in your
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender NSApplicationDelegate implementation:
{
if (SDL_GetEventState(SDL_QUIT) == SDL_ENABLE) {
SDL_Event event; - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
event.type = SDL_QUIT; {
SDL_PushEvent(&event); if (SDL_GetEventState(SDL_QUIT) == SDL_ENABLE) {
} SDL_Event event;
event.type = SDL_QUIT;
return NSTerminateCancel; SDL_PushEvent(&event);
} }
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename return NSTerminateCancel;
{ }
if (SDL_GetEventState(SDL_DROPFILE) == SDL_ENABLE) {
SDL_Event event; - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
event.type = SDL_DROPFILE; {
event.drop.file = SDL_strdup([filename UTF8String]); if (SDL_GetEventState(SDL_DROPFILE) == SDL_ENABLE) {
return (SDL_PushEvent(&event) > 0); SDL_Event event;
} event.type = SDL_DROPFILE;
event.drop.file = SDL_strdup([filename UTF8String]);
return NO; return (SDL_PushEvent(&event) > 0);
} }
============================================================================== return NO;
Using the Simple DirectMedia Layer with a traditional Makefile }
==============================================================================
==============================================================================
An existing autoconf/automake build system for your SDL app has good chances Using the Simple DirectMedia Layer with a traditional Makefile
to work almost unchanged on OS X. However, to produce a "real" Mac OS X binary ==============================================================================
that you can distribute to users, you need to put the generated binary into a
so called "bundle", which basically is a fancy folder with a name like An existing autoconf/automake build system for your SDL app has good chances
"MyCoolGame.app". to work almost unchanged on OS X. However, to produce a "real" Mac OS X binary
that you can distribute to users, you need to put the generated binary into a
To get this build automatically, add something like the following rule to so called "bundle", which basically is a fancy folder with a name like
your Makefile.am: "MyCoolGame.app".
bundle_contents = APP_NAME.app/Contents To get this build automatically, add something like the following rule to
APP_NAME_bundle: EXE_NAME your Makefile.am:
mkdir -p $(bundle_contents)/MacOS
mkdir -p $(bundle_contents)/Resources bundle_contents = APP_NAME.app/Contents
echo "APPL????" > $(bundle_contents)/PkgInfo APP_NAME_bundle: EXE_NAME
$(INSTALL_PROGRAM) $< $(bundle_contents)/MacOS/ mkdir -p $(bundle_contents)/MacOS
mkdir -p $(bundle_contents)/Resources
You should replace EXE_NAME with the name of the executable. APP_NAME is what echo "APPL????" > $(bundle_contents)/PkgInfo
will be visible to the user in the Finder. Usually it will be the same $(INSTALL_PROGRAM) $< $(bundle_contents)/MacOS/
as EXE_NAME but capitalized. E.g. if EXE_NAME is "testgame" then APP_NAME
usually is "TestGame". You might also want to use @PACKAGE@ to use the package You should replace EXE_NAME with the name of the executable. APP_NAME is what
name as specified in your configure.in file. will be visible to the user in the Finder. Usually it will be the same
as EXE_NAME but capitalized. E.g. if EXE_NAME is "testgame" then APP_NAME
If your project builds more than one application, you will have to do a bit usually is "TestGame". You might also want to use `@PACKAGE@` to use the package
more. For each of your target applications, you need a separate rule. name as specified in your configure.in file.
If you want the created bundles to be installed, you may want to add this If your project builds more than one application, you will have to do a bit
rule to your Makefile.am: more. For each of your target applications, you need a separate rule.
install-exec-hook: APP_NAME_bundle If you want the created bundles to be installed, you may want to add this
rm -rf $(DESTDIR)$(prefix)/Applications/APP_NAME.app rule to your Makefile.am:
mkdir -p $(DESTDIR)$(prefix)/Applications/
cp -r $< /$(DESTDIR)$(prefix)Applications/ install-exec-hook: APP_NAME_bundle
rm -rf $(DESTDIR)$(prefix)/Applications/APP_NAME.app
This rule takes the Bundle created by the rule from step 3 and installs them mkdir -p $(DESTDIR)$(prefix)/Applications/
into $(DESTDIR)$(prefix)/Applications/. cp -r $< /$(DESTDIR)$(prefix)Applications/
Again, if you want to install multiple applications, you will have to augment This rule takes the Bundle created by the rule from step 3 and installs them
the make rule accordingly. into "$(DESTDIR)$(prefix)/Applications/".
Again, if you want to install multiple applications, you will have to augment
But beware! That is only part of the story! With the above, you end up with the make rule accordingly.
a bare bone .app bundle, which is double clickable from the Finder. But
there are some more things you should do before shipping your product...
But beware! That is only part of the story! With the above, you end up with
1) The bundle right now probably is dynamically linked against SDL. That a bare bone .app bundle, which is double clickable from the Finder. But
means that when you copy it to another computer, *it will not run*, there are some more things you should do before shipping your product...
unless you also install SDL on that other computer. A good solution
for this dilemma is to static link against SDL. On OS X, you can 1) The bundle right now probably is dynamically linked against SDL. That
achieve that by linking against the libraries listed by means that when you copy it to another computer, *it will not run*,
sdl-config --static-libs unless you also install SDL on that other computer. A good solution
instead of those listed by for this dilemma is to static link against SDL. On OS X, you can
sdl-config --libs achieve that by linking against the libraries listed by
Depending on how exactly SDL is integrated into your build systems, the
way to achieve that varies, so I won't describe it here in detail sdl-config --static-libs
2) Add an 'Info.plist' to your application. That is a special XML file which
contains some meta-information about your application (like some copyright instead of those listed by
information, the version of your app, the name of an optional icon file,
and other things). Part of that information is displayed by the Finder sdl-config --libs
when you click on the .app, or if you look at the "Get Info" window.
More information about Info.plist files can be found on Apple's homepage. Depending on how exactly SDL is integrated into your build systems, the
way to achieve that varies, so I won't describe it here in detail
As a final remark, let me add that I use some of the techniques (and some 2) Add an 'Info.plist' to your application. That is a special XML file which
variations of them) in Exult and ScummVM; both are available in source on contains some meta-information about your application (like some copyright
the net, so feel free to take a peek at them for inspiration! information, the version of your app, the name of an optional icon file,
and other things). Part of that information is displayed by the Finder
when you click on the .app, or if you look at the "Get Info" window.
============================================================================== More information about Info.plist files can be found on Apple's homepage.
Using the Simple DirectMedia Layer with Xcode
==============================================================================
As a final remark, let me add that I use some of the techniques (and some
These instructions are for using Apple's Xcode IDE to build SDL applications. variations of them) in Exult and ScummVM; both are available in source on
the net, so feel free to take a peek at them for inspiration!
- First steps
The first thing to do is to unpack the Xcode.tar.gz archive in the ==============================================================================
top level SDL directory (where the Xcode.tar.gz archive resides). Using the Simple DirectMedia Layer with Xcode
Because Stuffit Expander will unpack the archive into a subdirectory, ==============================================================================
you should unpack the archive manually from the command line:
cd [path_to_SDL_source] These instructions are for using Apple's Xcode IDE to build SDL applications.
tar zxf Xcode.tar.gz
This will create a new folder called Xcode, which you can browse - First steps
normally from the Finder.
The first thing to do is to unpack the Xcode.tar.gz archive in the
- Building the Framework top level SDL directory (where the Xcode.tar.gz archive resides).
Because Stuffit Expander will unpack the archive into a subdirectory,
The SDL Library is packaged as a framework bundle, an organized you should unpack the archive manually from the command line:
relocatable folder hierarchy of executable code, interface headers,
and additional resources. For practical purposes, you can think of a cd [path_to_SDL_source]
framework as a more user and system-friendly shared library, whose library tar zxf Xcode.tar.gz
file behaves more or less like a standard UNIX shared library.
This will create a new folder called Xcode, which you can browse
To build the framework, simply open the framework project and build it. normally from the Finder.
By default, the framework bundle "SDL.framework" is installed in
/Library/Frameworks. Therefore, the testers and project stationary expect - Building the Framework
it to be located there. However, it will function the same in any of the
following locations: The SDL Library is packaged as a framework bundle, an organized
relocatable folder hierarchy of executable code, interface headers,
~/Library/Frameworks and additional resources. For practical purposes, you can think of a
/Local/Library/Frameworks framework as a more user and system-friendly shared library, whose library
/System/Library/Frameworks file behaves more or less like a standard UNIX shared library.
- Build Options To build the framework, simply open the framework project and build it.
There are two "Build Styles" (See the "Targets" tab) for SDL. By default, the framework bundle "SDL.framework" is installed in
"Deployment" should be used if you aren't tweaking the SDL library. /Library/Frameworks. Therefore, the testers and project stationary expect
"Development" should be used to debug SDL apps or the library itself. it to be located there. However, it will function the same in any of the
following locations:
- Building the Testers
Open the SDLTest project and build away! ~/Library/Frameworks
/Local/Library/Frameworks
- Using the Project Stationary /System/Library/Frameworks
Copy the stationary to the indicated folders to access it from
the "New Project" and "Add target" menus. What could be easier? - Build Options
There are two "Build Styles" (See the "Targets" tab) for SDL.
- Setting up a new project by hand "Deployment" should be used if you aren't tweaking the SDL library.
Some of you won't want to use the Stationary so I'll give some tips: "Development" should be used to debug SDL apps or the library itself.
* Create a new "Cocoa Application"
* Add src/main/macosx/SDLMain.m , .h and .nib to your project - Building the Testers
* Remove "main.c" from your project Open the SDLTest project and build away!
* Remove "MainMenu.nib" from your project
* Add "$(HOME)/Library/Frameworks/SDL.framework/Headers" to include path - Using the Project Stationary
* Add "$(HOME)/Library/Frameworks" to the frameworks search path Copy the stationary to the indicated folders to access it from
* Add "-framework SDL -framework Foundation -framework AppKit" to "OTHER_LDFLAGS" the "New Project" and "Add target" menus. What could be easier?
* Set the "Main Nib File" under "Application Settings" to "SDLMain.nib"
* Add your files - Setting up a new project by hand
* Clean and build Some of you won't want to use the Stationary so I'll give some tips:
* Create a new "Cocoa Application"
- Building from command line * Add src/main/macosx/SDLMain.m , .h and .nib to your project
Use pbxbuild in the same directory as your .pbproj file * Remove "main.c" from your project
* Remove "MainMenu.nib" from your project
- Running your app * Add "$(HOME)/Library/Frameworks/SDL.framework/Headers" to include path
You can send command line args to your app by either invoking it from * Add "$(HOME)/Library/Frameworks" to the frameworks search path
the command line (in *.app/Contents/MacOS) or by entering them in the * Add "-framework SDL -framework Foundation -framework AppKit" to "OTHER_LDFLAGS"
"Executables" panel of the target settings. * Set the "Main Nib File" under "Application Settings" to "SDLMain.nib"
* Add your files
- Implementation Notes * Clean and build
Some things that may be of interest about how it all works...
* Working directory - Building from command line
As defined in the SDL_main.m file, the working directory of your SDL app Use pbxbuild in the same directory as your .pbproj file
is by default set to its parent. You may wish to change this to better
suit your needs. - Running your app
* You have a Cocoa App! You can send command line args to your app by either invoking it from
Your SDL app is essentially a Cocoa application. When your app the command line (in *.app/Contents/MacOS) or by entering them in the
starts up and the libraries finish loading, a Cocoa procedure is called, "Executables" panel of the target settings.
which sets up the working directory and calls your main() method.
You are free to modify your Cocoa app with generally no consequence - Implementation Notes
to SDL. You cannot, however, easily change the SDL window itself. Some things that may be of interest about how it all works...
Functionality may be added in the future to help this. * Working directory
As defined in the SDL_main.m file, the working directory of your SDL app
is by default set to its parent. You may wish to change this to better
Known bugs are listed in the file "BUGS" suit your needs.
* You have a Cocoa App!
Your SDL app is essentially a Cocoa application. When your app
starts up and the libraries finish loading, a Cocoa procedure is called,
which sets up the working directory and calls your main() method.
You are free to modify your Cocoa app with generally no consequence
to SDL. You cannot, however, easily change the SDL window itself.
Functionality may be added in the future to help this.
Known bugs are listed in the file "BUGS.txt".

View File

@ -1,17 +1,17 @@
Pandora Pandora
===================================================================== =====================================================================
( http://openpandora.org/ ) ( http://openpandora.org/ )
- A pandora specific video driver was written to allow SDL 2.0 with OpenGL ES - A pandora specific video driver was written to allow SDL 2.0 with OpenGL ES
support to work on the pandora under the framebuffer. This driver do not have support to work on the pandora under the framebuffer. This driver do not have
input support for now, so if you use it you will have to add your own control code. input support for now, so if you use it you will have to add your own control code.
The video driver name is "pandora" so if you have problem running it from The video driver name is "pandora" so if you have problem running it from
the framebuffer, try to set the following variable before starting your application : the framebuffer, try to set the following variable before starting your application :
"export SDL_VIDEODRIVER=pandora" "export SDL_VIDEODRIVER=pandora"
- OpenGL ES support was added to the x11 driver, so it's working like the normal - OpenGL ES support was added to the x11 driver, so it's working like the normal
x11 driver one with OpenGLX support, with SDL input event's etc.. x11 driver one with OpenGLX support, with SDL input event's etc..
David Carré (Cpasjuste) David Carré (Cpasjuste)
cpasjuste@gmail.com cpasjuste@gmail.com

View File

@ -1,64 +1,68 @@
Porting Porting
======= =======
* Porting To A New Platform * Porting To A New Platform
The first thing you have to do when porting to a new platform, is look at The first thing you have to do when porting to a new platform, is look at
include/SDL_platform.h and create an entry there for your operating system. include/SDL_platform.h and create an entry there for your operating system.
The standard format is __PLATFORM__, where PLATFORM is the name of the OS. The standard format is "__PLATFORM__", where PLATFORM is the name of the OS.
Ideally SDL_platform.h will be able to auto-detect the system it's building Ideally SDL_platform.h will be able to auto-detect the system it's building
on based on C preprocessor symbols. on based on C preprocessor symbols.
There are two basic ways of building SDL at the moment: There are two basic ways of building SDL at the moment:
1. The "UNIX" way: ./configure; make; make install 1. The "UNIX" way: ./configure; make; make install
If you have a GNUish system, then you might try this. Edit configure.in, If you have a GNUish system, then you might try this. Edit configure.in,
take a look at the large section labelled: take a look at the large section labelled:
"Set up the configuration based on the host platform!"
Add a section for your platform, and then re-run autogen.sh and build! "Set up the configuration based on the host platform!"
2. Using an IDE: Add a section for your platform, and then re-run autogen.sh and build!
If you're using an IDE or other non-configure build system, you'll probably 2. Using an IDE:
want to create a custom SDL_config.h for your platform. Edit SDL_config.h,
add a section for your platform, and create a custom SDL_config_{platform}.h, If you're using an IDE or other non-configure build system, you'll probably
based on SDL_config.h.minimal and SDL_config.h.in want to create a custom SDL_config.h for your platform. Edit SDL_config.h,
add a section for your platform, and create a custom SDL_config_{platform}.h,
Add the top level include directory to the header search path, and then add based on SDL_config_minimal.h and SDL_config.h.in
the following sources to the project:
src/*.c Add the top level include directory to the header search path, and then add
src/atomic/*.c the following sources to the project:
src/audio/*.c
src/cpuinfo/*.c src/*.c
src/events/*.c src/atomic/*.c
src/file/*.c src/audio/*.c
src/haptic/*.c src/cpuinfo/*.c
src/joystick/*.c src/events/*.c
src/power/*.c src/file/*.c
src/render/*.c src/haptic/*.c
src/stdlib/*.c src/joystick/*.c
src/thread/*.c src/power/*.c
src/timer/*.c src/render/*.c
src/video/*.c src/render/software/*.c
src/audio/disk/*.c src/stdlib/*.c
src/audio/dummy/*.c src/thread/*.c
src/filesystem/dummy/*.c src/timer/*.c
src/video/dummy/*.c src/video/*.c
src/haptic/dummy/*.c src/audio/disk/*.c
src/joystick/dummy/*.c src/audio/dummy/*.c
src/main/dummy/*.c src/filesystem/dummy/*.c
src/thread/generic/*.c src/video/dummy/*.c
src/timer/dummy/*.c src/haptic/dummy/*.c
src/loadso/dummy/*.c src/joystick/dummy/*.c
src/main/dummy/*.c
src/thread/generic/*.c
Once you have a working library without any drivers, you can go back to each src/timer/dummy/*.c
of the major subsystems and start implementing drivers for your platform. src/loadso/dummy/*.c
If you have any questions, don't hesitate to ask on the SDL mailing list:
http://www.libsdl.org/mailing-list.php Once you have a working library without any drivers, you can go back to each
of the major subsystems and start implementing drivers for your platform.
Enjoy!
Sam Lantinga (slouken@libsdl.org) If you have any questions, don't hesitate to ask on the SDL mailing list:
http://www.libsdl.org/mailing-list.php
Enjoy!
Sam Lantinga (slouken@libsdl.org)

View File

@ -1,19 +1,19 @@
PSP PSP
====== ======
SDL port for the Sony PSP contributed by SDL port for the Sony PSP contributed by
Captian Lex Captian Lex
Credit to Credit to
Marcus R.Brown,Jim Paris,Matthew H for the original SDL 1.2 for PSP Marcus R.Brown,Jim Paris,Matthew H for the original SDL 1.2 for PSP
Geecko for his PSP GU lib "Glib2d" Geecko for his PSP GU lib "Glib2d"
Building Building
-------- --------
To build for the PSP, make sure psp-config is in the path and run: To build for the PSP, make sure psp-config is in the path and run:
make -f Makefile.psp make -f Makefile.psp
To Do To Do
------ ------
PSP Screen Keyboard PSP Screen Keyboard

View File

@ -1,178 +1,178 @@
Raspberry Pi Raspberry Pi
================================================================================ ================================================================================
Requirements: Requirements:
Raspbian (other Linux distros may work as well). Raspbian (other Linux distros may work as well).
================================================================================ ================================================================================
Features Features
================================================================================ ================================================================================
* Works without X11 * Works without X11
* Hardware accelerated OpenGL ES 2.x * Hardware accelerated OpenGL ES 2.x
* Sound via ALSA * Sound via ALSA
* Input (mouse/keyboard/joystick) via EVDEV * Input (mouse/keyboard/joystick) via EVDEV
* Hotplugging of input devices via UDEV * Hotplugging of input devices via UDEV
================================================================================ ================================================================================
Raspbian Build Dependencies Raspbian Build Dependencies
================================================================================ ================================================================================
sudo apt-get install libudev-dev libasound2-dev libdbus-1-dev sudo apt-get install libudev-dev libasound2-dev libdbus-1-dev
You also need the VideoCore binary stuff that ships in /opt/vc for EGL and You also need the VideoCore binary stuff that ships in /opt/vc for EGL and
OpenGL ES 2.x, it usually comes pre installed, but in any case: OpenGL ES 2.x, it usually comes pre-installed, but in any case:
sudo apt-get install libraspberrypi0 libraspberrypi-bin libraspberrypi-dev sudo apt-get install libraspberrypi0 libraspberrypi-bin libraspberrypi-dev
================================================================================ ================================================================================
Cross compiling from x86 Linux Cross compiling from x86 Linux
================================================================================ ================================================================================
To cross compile SDL for Raspbian from your desktop machine, you'll need a To cross compile SDL for Raspbian from your desktop machine, you'll need a
Raspbian system root and the cross compilation tools. We'll assume these tools Raspbian system root and the cross compilation tools. We'll assume these tools
will be placed in /opt/rpi-tools will be placed in /opt/rpi-tools
sudo git clone --depth 1 https://github.com/raspberrypi/tools /opt/rpi-tools sudo git clone --depth 1 https://github.com/raspberrypi/tools /opt/rpi-tools
You'll also need a Rasbian binary image. You'll also need a Raspbian binary image.
Get it from: http://downloads.raspberrypi.org/raspbian_latest Get it from: http://downloads.raspberrypi.org/raspbian_latest
After unzipping, you'll get file with a name like: <date>-wheezy-raspbian.img After unzipping, you'll get file with a name like: "<date>-wheezy-raspbian.img"
Let's assume the sysroot will be built in /opt/rpi-sysroot. Let's assume the sysroot will be built in /opt/rpi-sysroot.
export SYSROOT=/opt/rpi-sysroot export SYSROOT=/opt/rpi-sysroot
sudo kpartx -a -v <path_to_raspbian_image>.img sudo kpartx -a -v <path_to_raspbian_image>.img
sudo mount -o loop /dev/mapper/loop0p2 /mnt sudo mount -o loop /dev/mapper/loop0p2 /mnt
sudo cp -r /mnt $SYSROOT sudo cp -r /mnt $SYSROOT
sudo apt-get install qemu binfmt-support qemu-user-static sudo apt-get install qemu binfmt-support qemu-user-static
sudo cp /usr/bin/qemu-arm-static $SYSROOT/usr/bin sudo cp /usr/bin/qemu-arm-static $SYSROOT/usr/bin
sudo mount --bind /dev $SYSROOT/dev sudo mount --bind /dev $SYSROOT/dev
sudo mount --bind /proc $SYSROOT/proc sudo mount --bind /proc $SYSROOT/proc
sudo mount --bind /sys $SYSROOT/sys sudo mount --bind /sys $SYSROOT/sys
Now, before chrooting into the ARM sysroot, you'll need to apply a workaround, Now, before chrooting into the ARM sysroot, you'll need to apply a workaround,
edit $SYSROOT/etc/ld.so.preload and comment out all lines in it. edit $SYSROOT/etc/ld.so.preload and comment out all lines in it.
sudo chroot $SYSROOT sudo chroot $SYSROOT
apt-get install libudev-dev libasound2-dev libdbus-1-dev libraspberrypi0 libraspberrypi-bin libraspberrypi-dev libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxinerama-dev libxxf86vm-dev libxss-dev apt-get install libudev-dev libasound2-dev libdbus-1-dev libraspberrypi0 libraspberrypi-bin libraspberrypi-dev libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxinerama-dev libxxf86vm-dev libxss-dev
exit exit
sudo umount $SYSROOT/dev sudo umount $SYSROOT/dev
sudo umount $SYSROOT/proc sudo umount $SYSROOT/proc
sudo umount $SYSROOT/sys sudo umount $SYSROOT/sys
sudo umount /mnt sudo umount /mnt
There's one more fix required, as the libdl.so symlink uses an absolute path There's one more fix required, as the libdl.so symlink uses an absolute path
which doesn't quite work in our setup. which doesn't quite work in our setup.
sudo rm -rf $SYSROOT/usr/lib/arm-linux-gnueabihf/libdl.so sudo rm -rf $SYSROOT/usr/lib/arm-linux-gnueabihf/libdl.so
sudo ln -s ../../../lib/arm-linux-gnueabihf/libdl.so.2 $SYSROOT/usr/lib/arm-linux-gnueabihf/libdl.so sudo ln -s ../../../lib/arm-linux-gnueabihf/libdl.so.2 $SYSROOT/usr/lib/arm-linux-gnueabihf/libdl.so
The final step is compiling SDL itself. The final step is compiling SDL itself.
export CC="/opt/rpi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc --sysroot=$SYSROOT -I$SYSROOT/opt/vc/include -I$SYSROOT/usr/include -I$SYSROOT/opt/vc/include/interface/vcos/pthreads -I$SYSROOT/opt/vc/include/interface/vmcs_host/linux" export CC="/opt/rpi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc --sysroot=$SYSROOT -I$SYSROOT/opt/vc/include -I$SYSROOT/usr/include -I$SYSROOT/opt/vc/include/interface/vcos/pthreads -I$SYSROOT/opt/vc/include/interface/vmcs_host/linux"
cd <SDL SOURCE> cd <SDL SOURCE>
mkdir -p build;cd build mkdir -p build;cd build
LDFLAGS="-L$SYSROOT/opt/vc/lib" ../configure --with-sysroot=$SYSROOT --host=arm-raspberry-linux-gnueabihf --prefix=$PWD/rpi-sdl2-installed --disable-pulseaudio --disable-esd LDFLAGS="-L$SYSROOT/opt/vc/lib" ../configure --with-sysroot=$SYSROOT --host=arm-raspberry-linux-gnueabihf --prefix=$PWD/rpi-sdl2-installed --disable-pulseaudio --disable-esd
make make
make install make install
To be able to deploy this to /usr/local in the Raspbian system you need to fix up a few paths: To be able to deploy this to /usr/local in the Raspbian system you need to fix up a few paths:
perl -w -pi -e "s#$PWD/rpi-sdl2-installed#/usr/local#g;" ./rpi-sdl2-installed/lib/libSDL2.la ./rpi-sdl2-installed/lib/pkgconfig/sdl2.pc ./rpi-sdl2-installed/bin/sdl2-config perl -w -pi -e "s#$PWD/rpi-sdl2-installed#/usr/local#g;" ./rpi-sdl2-installed/lib/libSDL2.la ./rpi-sdl2-installed/lib/pkgconfig/sdl2.pc ./rpi-sdl2-installed/bin/sdl2-config
================================================================================ ================================================================================
Apps don't work or poor video/audio performance Apps don't work or poor video/audio performance
================================================================================ ================================================================================
If you get sound problems, buffer underruns, etc, run "sudo rpi-update" to If you get sound problems, buffer underruns, etc, run "sudo rpi-update" to
update the RPi's firmware. Note that doing so will fix these problems, but it update the RPi's firmware. Note that doing so will fix these problems, but it
will also render the CMA - Dynamic Memory Split functionality useless. will also render the CMA - Dynamic Memory Split functionality useless.
Also, by default the Raspbian distro configures the GPU RAM at 64MB, this is too Also, by default the Raspbian distro configures the GPU RAM at 64MB, this is too
low in general, specially if a 1080p TV is hooked up. low in general, specially if a 1080p TV is hooked up.
See here how to configure this setting: http://elinux.org/RPiconfig See here how to configure this setting: http://elinux.org/RPiconfig
Using a fixed gpu_mem=128 is the best option (specially if you updated the Using a fixed gpu_mem=128 is the best option (specially if you updated the
firmware, using CMA probably won't work, at least it's the current case). firmware, using CMA probably won't work, at least it's the current case).
================================================================================ ================================================================================
No input No input
================================================================================ ================================================================================
Make sure you belong to the "input" group. Make sure you belong to the "input" group.
sudo usermod -aG input `whoami` sudo usermod -aG input `whoami`
================================================================================ ================================================================================
No HDMI Audio No HDMI Audio
================================================================================ ================================================================================
If you notice that ALSA works but there's no audio over HDMI, try adding: If you notice that ALSA works but there's no audio over HDMI, try adding:
hdmi_drive=2 hdmi_drive=2
to your config.txt file and reboot. to your config.txt file and reboot.
Reference: http://www.raspberrypi.org/phpBB3/viewtopic.php?t=5062 Reference: http://www.raspberrypi.org/phpBB3/viewtopic.php?t=5062
================================================================================ ================================================================================
Text Input API support Text Input API support
================================================================================ ================================================================================
The Text Input API is supported, with translation of scan codes done via the The Text Input API is supported, with translation of scan codes done via the
kernel symbol tables. For this to work, SDL needs access to a valid console. kernel symbol tables. For this to work, SDL needs access to a valid console.
If you notice there's no SDL_TEXTINPUT message being emitted, double check that If you notice there's no SDL_TEXTINPUT message being emitted, double check that
your app has read access to one of the following: your app has read access to one of the following:
* /proc/self/fd/0 * /proc/self/fd/0
* /dev/tty * /dev/tty
* /dev/tty[0...6] * /dev/tty[0...6]
* /dev/vc/0 * /dev/vc/0
* /dev/console * /dev/console
This is usually not a problem if you run from the physical terminal (as opposed This is usually not a problem if you run from the physical terminal (as opposed
to running from a pseudo terminal, such as via SSH). If running from a PTS, a to running from a pseudo terminal, such as via SSH). If running from a PTS, a
quick workaround is to run your app as root or add yourself to the tty group, quick workaround is to run your app as root or add yourself to the tty group,
then re login to the system. then re-login to the system.
sudo usermod -aG tty `whoami` sudo usermod -aG tty `whoami`
The keyboard layout used by SDL is the same as the one the kernel uses. The keyboard layout used by SDL is the same as the one the kernel uses.
To configure the layout on Raspbian: To configure the layout on Raspbian:
sudo dpkg-reconfigure keyboard-configuration sudo dpkg-reconfigure keyboard-configuration
To configure the locale, which controls which keys are interpreted as letters, To configure the locale, which controls which keys are interpreted as letters,
this determining the CAPS LOCK behavior: this determining the CAPS LOCK behavior:
sudo dpkg-reconfigure locales sudo dpkg-reconfigure locales
================================================================================ ================================================================================
OpenGL problems OpenGL problems
================================================================================ ================================================================================
If you have desktop OpenGL headers installed at build time in your RPi or cross If you have desktop OpenGL headers installed at build time in your RPi or cross
compilation environment, support for it will be built in. However, the chipset compilation environment, support for it will be built in. However, the chipset
does not actually have support for it, which causes issues in certain SDL apps does not actually have support for it, which causes issues in certain SDL apps
since the presence of OpenGL support supersedes the ES/ES2 variants. since the presence of OpenGL support supersedes the ES/ES2 variants.
The workaround is to disable OpenGL at configuration time: The workaround is to disable OpenGL at configuration time:
./configure --disable-video-opengl ./configure --disable-video-opengl
Or if the application uses the Render functions, you can use the SDL_RENDER_DRIVER Or if the application uses the Render functions, you can use the SDL_RENDER_DRIVER
environment variable: environment variable:
export SDL_RENDER_DRIVER=opengles2 export SDL_RENDER_DRIVER=opengles2
================================================================================ ================================================================================
Notes Notes
================================================================================ ================================================================================
* When launching apps remotely (via SSH), SDL can prevent local keystrokes from * When launching apps remotely (via SSH), SDL can prevent local keystrokes from
leaking into the console only if it has root privileges. Launching apps locally leaking into the console only if it has root privileges. Launching apps locally
does not suffer from this issue. does not suffer from this issue.

View File

@ -1,86 +1,86 @@
Touch Touch
=========================================================================== ===========================================================================
System Specific Notes System Specific Notes
=========================================================================== ===========================================================================
Linux: Linux:
The linux touch system is currently based off event streams, and proc/bus/devices. The active user must be given permissions to read /dev/input/TOUCHDEVICE, where TOUCHDEVICE is the event stream for your device. Currently only Wacom tablets are supported. If you have an unsupported tablet contact me at jim.tla+sdl_touch@gmail.com and I will help you get support for it. The linux touch system is currently based off event streams, and proc/bus/devices. The active user must be given permissions to read /dev/input/TOUCHDEVICE, where TOUCHDEVICE is the event stream for your device. Currently only Wacom tablets are supported. If you have an unsupported tablet contact me at jim.tla+sdl_touch@gmail.com and I will help you get support for it.
Mac: Mac:
The Mac and iPhone APIs are pretty. If your touch device supports them then you'll be fine. If it doesn't, then there isn't much we can do. The Mac and iPhone APIs are pretty. If your touch device supports them then you'll be fine. If it doesn't, then there isn't much we can do.
iPhone: iPhone:
Works out of box. Works out of box.
Windows: Windows:
Unfortunately there is no windows support as of yet. Support for Windows 7 is planned, but we currently have no way to test. If you have a Windows 7 WM_TOUCH supported device, and are willing to help test please contact me at jim.tla+sdl_touch@gmail.com Unfortunately there is no windows support as of yet. Support for Windows 7 is planned, but we currently have no way to test. If you have a Windows 7 WM_TOUCH supported device, and are willing to help test please contact me at jim.tla+sdl_touch@gmail.com
=========================================================================== ===========================================================================
Events Events
=========================================================================== ===========================================================================
SDL_FINGERDOWN: SDL_FINGERDOWN:
Sent when a finger (or stylus) is placed on a touch device. Sent when a finger (or stylus) is placed on a touch device.
Fields: Fields:
* event.tfinger.touchId - the Id of the touch device. * event.tfinger.touchId - the Id of the touch device.
* event.tfinger.fingerId - the Id of the finger which just went down. * event.tfinger.fingerId - the Id of the finger which just went down.
* event.tfinger.x - the x coordinate of the touch (0..1) * event.tfinger.x - the x coordinate of the touch (0..1)
* event.tfinger.y - the y coordinate of the touch (0..1) * event.tfinger.y - the y coordinate of the touch (0..1)
* event.tfinger.pressure - the pressure of the touch (0..1) * event.tfinger.pressure - the pressure of the touch (0..1)
SDL_FINGERMOTION: SDL_FINGERMOTION:
Sent when a finger (or stylus) is moved on the touch device. Sent when a finger (or stylus) is moved on the touch device.
Fields: Fields:
Same as SDL_FINGERDOWN but with additional: Same as SDL_FINGERDOWN but with additional:
* event.tfinger.dx - change in x coordinate during this motion event. * event.tfinger.dx - change in x coordinate during this motion event.
* event.tfinger.dy - change in y coordinate during this motion event. * event.tfinger.dy - change in y coordinate during this motion event.
SDL_FINGERUP: SDL_FINGERUP:
Sent when a finger (or stylus) is lifted from the touch device. Sent when a finger (or stylus) is lifted from the touch device.
Fields: Fields:
Same as SDL_FINGERDOWN. Same as SDL_FINGERDOWN.
=========================================================================== ===========================================================================
Functions Functions
=========================================================================== ===========================================================================
SDL provides the ability to access the underlying Finger structures. SDL provides the ability to access the underlying SDL_Finger structures.
These structures should _never_ be modified. These structures should _never_ be modified.
The following functions are included from SDL_touch.h The following functions are included from SDL_touch.h
To get a SDL_TouchID call SDL_GetTouchDevice(index). To get a SDL_TouchID call SDL_GetTouchDevice(int index).
This returns a SDL_TouchID. This returns a SDL_TouchID.
IMPORTANT: If the touch has been removed, or there is no touch with the given ID, SDL_GetTouchID will return 0. Be sure to check for this! IMPORTANT: If the touch has been removed, or there is no touch with the given index, SDL_GetTouchDevice() will return 0. Be sure to check for this!
The number of touch devices can be queried with SDL_GetNumTouchDevices(). The number of touch devices can be queried with SDL_GetNumTouchDevices().
A SDL_TouchID may be used to get pointers to SDL_Finger. A SDL_TouchID may be used to get pointers to SDL_Finger.
SDL_GetNumTouchFingers(touchID) may be used to get the number of fingers currently down on the device. SDL_GetNumTouchFingers(touchID) may be used to get the number of fingers currently down on the device.
The most common reason to access SDL_Finger is to query the fingers outside the event. In most cases accessing the fingers is using the event. This would be accomplished by code like the following: The most common reason to access SDL_Finger is to query the fingers outside the event. In most cases accessing the fingers is using the event. This would be accomplished by code like the following:
float x = event.tfinger.x; float x = event.tfinger.x;
float y = event.tfinger.y; float y = event.tfinger.y;
To get a SDL_Finger, call SDL_GetTouchFinger(touchID,index), where touchID is a SDL_TouchID, and index is the requested finger. To get a SDL_Finger, call SDL_GetTouchFinger(SDL_TouchID touchID, int index), where touchID is a SDL_TouchID, and index is the requested finger.
This returns a SDL_Finger*, or NULL if the finger does not exist, or has been removed. This returns a SDL_Finger *, or NULL if the finger does not exist, or has been removed.
A SDL_Finger is guaranteed to be persistent for the duration of a touch, but it will be de-allocated as soon as the finger is removed. This occurs when the SDL_FINGERUP event is _added_ to the event queue, and thus _before_ the SDL_FINGERUP event is polled. A SDL_Finger is guaranteed to be persistent for the duration of a touch, but it will be de-allocated as soon as the finger is removed. This occurs when the SDL_FINGERUP event is _added_ to the event queue, and thus _before_ the SDL_FINGERUP event is polled.
As a result, be very careful to check for NULL return values. As a result, be very careful to check for NULL return values.
A SDL_Finger has the following fields: A SDL_Finger has the following fields:
* x,y,pressure: * x, y:
The current coordinates of the touch. The current coordinates of the touch.
* pressure: * pressure:
The pressure of the touch. The pressure of the touch.
=========================================================================== ===========================================================================
Notes Notes
=========================================================================== ===========================================================================
For a complete example see test/testgesture.c For a complete example see test/testgesture.c
Please direct questions/comments to: Please direct questions/comments to:
jim.tla+sdl_touch@gmail.com jim.tla+sdl_touch@gmail.com
(original author, API was changed since) (original author, API was changed since)

View File

@ -1,10 +1,10 @@
WinCE WinCE
===== =====
Windows CE is no longer supported by SDL. Windows CE is no longer supported by SDL.
We have left the CE support in SDL 1.2 for those that must have it, and we We have left the CE support in SDL 1.2 for those that must have it, and we
have support for Windows Phone 8 and WinRT in SDL2, as of SDL 2.0.3. have support for Windows Phone 8 and WinRT in SDL2, as of SDL 2.0.3.
--ryan. --ryan.

View File

@ -38,4 +38,8 @@ Known Bugs:
* SDL_GL_SetSwapInterval is currently a no op when using ANGLE. It appears * SDL_GL_SetSwapInterval is currently a no op when using ANGLE. It appears
that there's a bug in the library which prevents the window contents from that there's a bug in the library which prevents the window contents from
refreshing if this is set to anything other than the default value. refreshing if this is set to anything other than the default value.
Vulkan Surface Support
==============
Support for creating Vulkan surfaces is configured on by default. To disable it change the value of `SDL_VIDEO_VULKAN` to 0 in `SDL_config_windows.h`. You must install the [Vulkan SDK](https://www.lunarg.com/vulkan-sdk/) in order to use Vulkan graphics in your application.

View File

@ -2,11 +2,8 @@ WinRT
===== =====
This port allows SDL applications to run on Microsoft's platforms that require This port allows SDL applications to run on Microsoft's platforms that require
use of "Windows Runtime", aka. "WinRT", APIs. WinRT apps are currently use of "Windows Runtime", aka. "WinRT", APIs. Microsoft may, in some cases,
full-screen only, and run in what Microsoft sometimes refers to as their refer to them as either "Windows Store", or for Windows 10, "UWP" apps.
"Modern" (formerly, "Metro"), environment. For Windows 8.x, Microsoft may also
refer to them as "Windows Store" apps, due to them being distributed,
primarily, via a Microsoft-run online store (of the same name).
Some of the operating systems that include WinRT, are: Some of the operating systems that include WinRT, are:
@ -19,13 +16,22 @@ Some of the operating systems that include WinRT, are:
Requirements Requirements
------------ ------------
* Microsoft Visual C++ (aka Visual Studio), either 2015, 2013, or 2012 * Microsoft Visual C++ (aka Visual Studio), either 2017, 2015, 2013, or 2012
- Free, "Community" or "Express" editions may be used, so long as they - Free, "Community" or "Express" editions may be used, so long as they
include support for either "Windows Store" or "Windows Phone" apps. include support for either "Windows Store" or "Windows Phone" apps.
"Express" versions marked as supporting "Windows Desktop" development "Express" versions marked as supporting "Windows Desktop" development
typically do not include support for creating WinRT apps, to note. typically do not include support for creating WinRT apps, to note.
(The "Community" editions of Visual C++ do, however, support both (The "Community" editions of Visual C++ do, however, support both
desktop/Win32 and WinRT development). desktop/Win32 and WinRT development).
- Visual Studio 2017 can be used, however it is recommented that you install
the Visual C++ 2015 build tools. These build tools can be installed
using VS 2017's installer. Be sure to also install the workload for
"Universal Windows Platform development", its optional component, the
"C++ Universal Windows Platform tools", and for UWP / Windows 10
development, the "Windows 10 SDK (10.0.10240.0)". Please note that
targeting UWP / Windows 10 apps from development machine(s) running
earlier versions of Windows, such as Windows 7, is not always supported
by Visual Studio, and you may get error(s) when attempting to do so.
- Visual C++ 2012 can only build apps that target versions 8.0 of Windows, - Visual C++ 2012 can only build apps that target versions 8.0 of Windows,
or Windows Phone. 8.0-targetted apps will run on devices running 8.1 or Windows Phone. 8.0-targetted apps will run on devices running 8.1
editions of Windows, however they will not be able to take advantage of editions of Windows, however they will not be able to take advantage of
@ -69,7 +75,10 @@ Here is a rough list of what works, and what doens't:
anything outside of the app is not supported. anything outside of the app is not supported.
* system path retrieval via SDL's filesystem APIs * system path retrieval via SDL's filesystem APIs
* game controllers. Support is provided via the SDL_Joystick and * game controllers. Support is provided via the SDL_Joystick and
SDL_GameController APIs, and is backed by Microsoft's XInput API. SDL_GameController APIs, and is backed by Microsoft's XInput API. Please
note, however, that Windows limits game-controller support in UWP apps to,
"Xbox compatible controllers" (many controllers that work in Win32 apps,
do not work in UWP, due to restrictions in UWP itself.)
* multi-touch input * multi-touch input
* app events. SDL_APP_WILLENTER* and SDL_APP_DIDENTER* events get sent out as * app events. SDL_APP_WILLENTER* and SDL_APP_DIDENTER* events get sent out as
appropriate. appropriate.
@ -82,7 +91,9 @@ Here is a rough list of what works, and what doens't:
* What partially works: * What partially works:
* keyboard input. Most of WinRT's documented virtual keys are supported, as * keyboard input. Most of WinRT's documented virtual keys are supported, as
well as many keys with documented hardware scancodes. well as many keys with documented hardware scancodes. Converting
SDL_Scancodes to or from SDL_Keycodes may not work, due to missing APIs
(MapVirtualKey()) in Microsoft's Windows Store / UWP APIs.
* SDLmain. WinRT uses a different signature for each app's main() function. * SDLmain. WinRT uses a different signature for each app's main() function.
SDL-based apps that use this port must compile in SDL_winrt_main_NonXAML.cpp SDL-based apps that use this port must compile in SDL_winrt_main_NonXAML.cpp
(in `SDL\src\main\winrt\`) directly in order for their C-style main() (in `SDL\src\main\winrt\`) directly in order for their C-style main()
@ -95,8 +106,10 @@ Here is a rough list of what works, and what doens't:
SDL_CreateSystemCursor() (unsupported on Windows Phone) SDL_CreateSystemCursor() (unsupported on Windows Phone)
* SDL_WarpMouseInWindow() or SDL_WarpMouseGlobal(). This are not currently * SDL_WarpMouseInWindow() or SDL_WarpMouseGlobal(). This are not currently
supported by WinRT itself. supported by WinRT itself.
* joysticks and game controllers that aren't supported by Microsoft's XInput * joysticks and game controllers that either are not supported by
API. Microsoft's XInput API, or are not supported within UWP apps (many
controllers that work in Win32, do not work in UWP, due to restrictions in
UWP itself).
* turning off VSync when rendering on Windows Phone. Attempts to turn VSync * turning off VSync when rendering on Windows Phone. Attempts to turn VSync
off on Windows Phone result either in Direct3D not drawing anything, or it off on Windows Phone result either in Direct3D not drawing anything, or it
forcing VSync back on. As such, SDL_RENDERER_PRESENTVSYNC will always get forcing VSync back on. As such, SDL_RENDERER_PRESENTVSYNC will always get
@ -160,7 +173,9 @@ following, at a high-level:
the linker, and will copy SDL's .dll files to your app's final output. the linker, and will copy SDL's .dll files to your app's final output.
4. adjust your app's build settings, at minimum, telling it where to find SDL's 4. adjust your app's build settings, at minimum, telling it where to find SDL's
header files. header files.
5. add a file that contains a WinRT-appropriate main function. 5. add files that contains a WinRT-appropriate main function, along with some
data to make sure mouse-cursor-hiding (via SDL_ShowCursor(SDL_DISABLE) calls)
work properly.
6. add SDL-specific app code. 6. add SDL-specific app code.
7. build and run your app. 7. build and run your app.
@ -268,33 +283,27 @@ To change these settings:
10. close the dialog, saving settings, by clicking the "OK" button 10. close the dialog, saving settings, by clicking the "OK" button
### 5. Add a WinRT-appropriate main function to the app. ### ### 5. Add a WinRT-appropriate main function, and a blank-cursor image, to the app. ###
C/C++-based WinRT apps do contain a `main` function that the OS will invoke when A few files should be included directly in your app's MSVC project, specifically:
the app starts launching. The parameters of WinRT main functions are different 1. a WinRT-appropriate main function (which is different than main() functions on
than those found on other platforms, Win32 included. SDL/WinRT provides a other platforms)
platform-appropriate main function that will perform these actions, setup key 2. a Win32-style cursor resource, used by SDL_ShowCursor() to hide the mouse cursor
portions of the app, then invoke a classic, C/C++-style main function (that take (if and when the app needs to do so). *If this cursor resource is not
in "argc" and "argv" parameters). The code for this file is contained inside included, mouse-position reporting may fail if and when the cursor is
SDL's source distribution, under `src/main/winrt/SDL_winrt_main_NonXAML.cpp`. hidden, due to possible bugs/design-oddities in Windows itself.*
You'll need to add this file, or a copy of it, to your app's project, and make
sure it gets compiled using a Microsoft-specific set of C++ extensions called
C++/CX.
**NOTE: C++/CX compilation is currently required in at least one file of your To include these files:
app's project. This is to make sure that Visual C++'s linker builds a 'Windows
Metadata' file (.winmd) for your app. Not doing so can lead to build errors.**
To include `SDL_winrt_main_NonXAML.cpp`:
1. right-click on your project (again, in Visual C++'s Solution Explorer), 1. right-click on your project (again, in Visual C++'s Solution Explorer),
navigate to "Add", then choose "Existing Item...". navigate to "Add", then choose "Existing Item...".
2. open `SDL_winrt_main_NonXAML.cpp`, which is found inside SDL's source 2. navigate to the directory containing SDL's source code, then into its
distribution, under `src/main/winrt/`. Make sure that the open-file dialog subdirectory, 'src/main/winrt/'. Select, then add, the following files:
closes, either by double-clicking on the file, or single-clicking on it and - `SDL_winrt_main_NonXAML.cpp`
then clicking Add. - `SDL2-WinRTResources.rc`
3. right-click on the file (as listed in your project), then click on - `SDL2-WinRTResource_BlankCursor.cur`
"Properties...". 3. right-click on the file `SDL_winrt_main_NonXAML.cpp` (as listed in your
project), then click on "Properties...".
4. in the drop-down box next to "Configuration", choose, "All Configurations" 4. in the drop-down box next to "Configuration", choose, "All Configurations"
5. in the drop-down box next to "Platform", choose, "All Platforms" 5. in the drop-down box next to "Platform", choose, "All Platforms"
6. in the left-hand list, click on "C/C++" 6. in the left-hand list, click on "C/C++"
@ -302,6 +311,11 @@ To include `SDL_winrt_main_NonXAML.cpp`:
8. click the OK button. This will close the dialog. 8. click the OK button. This will close the dialog.
**NOTE: C++/CX compilation is currently required in at least one file of your
app's project. This is to make sure that Visual C++'s linker builds a 'Windows
Metadata' file (.winmd) for your app. Not doing so can lead to build errors.**
### 6. Add app code and assets ### ### 6. Add app code and assets ###
At this point, you can add in SDL-specific source code. Be sure to include a At this point, you can add in SDL-specific source code. Be sure to include a
@ -466,3 +480,62 @@ section.
/nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib
#### Mouse-motion events fail to get sent, or SDL_GetMouseState() fails to return updated values
This may be caused by a bug in Windows itself, whereby hiding the mouse
cursor can cause mouse-position reporting to fail.
SDL provides a workaround for this, but it requires that an app links to a
set of Win32-style cursor image-resource files. A copy of suitable resource
files can be found in `src/main/winrt/`. Adding them to an app's Visual C++
project file should be sufficient to get the app to use them.
#### SDL's Visual Studio project file fails to open, with message, "The system can't find the file specified."
This can be caused for any one of a few reasons, which Visual Studio can
report, but won't always do so in an up-front manner.
To help determine why this error comes up:
1. open a copy of Visual Studio without opening a project file. This can be
accomplished via Windows' Start Menu, among other means.
2. show Visual Studio's Output window. This can be done by going to VS'
menu bar, then to View, and then to Output.
3. try opening the SDL project file directly by going to VS' menu bar, then
to File, then to Open, then to Project/Solution. When a File-Open dialog
appears, open the SDL project (such as the one in SDL's source code, in its
directory, VisualC-WinRT/UWP_VS2015/).
4. after attempting to open SDL's Visual Studio project file, additional error
information will be output to the Output window.
If Visual Studio reports (via its Output window) that the project:
"could not be loaded because it's missing install components. To fix this launch Visual Studio setup with the following selections:
Microsoft.VisualStudio.ComponentGroup.UWP.VC"
... then you will need to re-launch Visual Studio's installer, and make sure that
the workflow for "Universal Windows Platform development" is checked, and that its
optional component, "C++ Universal Windows Platform tools" is also checked. While
you are there, if you are planning on targeting UWP / Windows 10, also make sure
that you check the optional component, "Windows 10 SDK (10.0.10240.0)". After
making sure these items are checked as-appropriate, install them.
Once you install these components, try re-launching Visual Studio, and re-opening
the SDL project file. If you still get the error dialog, try using the Output
window, again, seeing what Visual Studio says about it.
#### Game controllers / joysticks aren't working!
Windows only permits certain game controllers and joysticks to work within
WinRT / UWP apps. Even if a game controller or joystick works in a Win32
app, that device is not guaranteed to work inside a WinRT / UWP app.
According to Microsoft, "Xbox compatible controllers" should work inside
UWP apps, potentially with more working in the future. This includes, but
may not be limited to, Microsoft-made Xbox controllers and USB adapters.
(Source: https://social.msdn.microsoft.com/Forums/en-US/9064838b-e8c3-4c18-8a83-19bf0dfe150d/xinput-fails-to-detect-game-controllers?forum=wpdevelop)

View File

@ -54,7 +54,7 @@ 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 [developers mailing list](http://www.libsdl.org/mailing-list.php)
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](http://bugzilla.libsdl.org/) [bugzilla](https://bugzilla.libsdl.org/)
Enjoy! Enjoy!

View File

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
prefix=/usr/local/cross-tools/i686-w64-mingw32 prefix=/usr/local/i686-w64-mingw32
exec_prefix=${prefix} exec_prefix=${prefix}
exec_prefix_set=no exec_prefix_set=no
libdir=${exec_prefix}/lib libdir=${exec_prefix}/lib
@ -39,7 +39,7 @@ while test $# -gt 0; do
echo $exec_prefix echo $exec_prefix
;; ;;
--version) --version)
echo 2.0.4 echo 2.0.7
;; ;;
--cflags) --cflags)
echo -I${prefix}/include/SDL2 -Dmain=SDL_main echo -I${prefix}/include/SDL2 -Dmain=SDL_main

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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
@ -26,8 +26,8 @@
*/ */
#ifndef _SDL_H #ifndef SDL_h_
#define _SDL_H #define SDL_h_
#include "SDL_main.h" #include "SDL_main.h"
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
@ -40,10 +40,10 @@
#include "SDL_error.h" #include "SDL_error.h"
#include "SDL_events.h" #include "SDL_events.h"
#include "SDL_filesystem.h" #include "SDL_filesystem.h"
#include "SDL_joystick.h"
#include "SDL_gamecontroller.h" #include "SDL_gamecontroller.h"
#include "SDL_haptic.h" #include "SDL_haptic.h"
#include "SDL_hints.h" #include "SDL_hints.h"
#include "SDL_joystick.h"
#include "SDL_loadso.h" #include "SDL_loadso.h"
#include "SDL_log.h" #include "SDL_log.h"
#include "SDL_messagebox.h" #include "SDL_messagebox.h"
@ -51,6 +51,7 @@
#include "SDL_power.h" #include "SDL_power.h"
#include "SDL_render.h" #include "SDL_render.h"
#include "SDL_rwops.h" #include "SDL_rwops.h"
#include "SDL_shape.h"
#include "SDL_system.h" #include "SDL_system.h"
#include "SDL_thread.h" #include "SDL_thread.h"
#include "SDL_timer.h" #include "SDL_timer.h"
@ -72,14 +73,14 @@ extern "C" {
* specify the subsystems which you will be using in your application. * specify the subsystems which you will be using in your application.
*/ */
/* @{ */ /* @{ */
#define SDL_INIT_TIMER 0x00000001 #define SDL_INIT_TIMER 0x00000001u
#define SDL_INIT_AUDIO 0x00000010 #define SDL_INIT_AUDIO 0x00000010u
#define SDL_INIT_VIDEO 0x00000020 /**< SDL_INIT_VIDEO implies SDL_INIT_EVENTS */ #define SDL_INIT_VIDEO 0x00000020u /**< SDL_INIT_VIDEO implies SDL_INIT_EVENTS */
#define SDL_INIT_JOYSTICK 0x00000200 /**< SDL_INIT_JOYSTICK implies SDL_INIT_EVENTS */ #define SDL_INIT_JOYSTICK 0x00000200u /**< SDL_INIT_JOYSTICK implies SDL_INIT_EVENTS */
#define SDL_INIT_HAPTIC 0x00001000 #define SDL_INIT_HAPTIC 0x00001000u
#define SDL_INIT_GAMECONTROLLER 0x00002000 /**< SDL_INIT_GAMECONTROLLER implies SDL_INIT_JOYSTICK */ #define SDL_INIT_GAMECONTROLLER 0x00002000u /**< SDL_INIT_GAMECONTROLLER implies SDL_INIT_JOYSTICK */
#define SDL_INIT_EVENTS 0x00004000 #define SDL_INIT_EVENTS 0x00004000u
#define SDL_INIT_NOPARACHUTE 0x00100000 /**< compatibility; this flag is ignored. */ #define SDL_INIT_NOPARACHUTE 0x00100000u /**< compatibility; this flag is ignored. */
#define SDL_INIT_EVERYTHING ( \ #define SDL_INIT_EVERYTHING ( \
SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_EVENTS | \ SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_EVENTS | \
SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_GAMECONTROLLER \ SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_GAMECONTROLLER \
@ -95,8 +96,8 @@ extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags);
* This function initializes specific SDL subsystems * This function initializes specific SDL subsystems
* *
* Subsystem initialization is ref-counted, you must call * Subsystem initialization is ref-counted, you must call
* SDL_QuitSubSystem for each SDL_InitSubSystem to correctly * SDL_QuitSubSystem() for each SDL_InitSubSystem() to correctly
* shutdown a subsystem manually (or call SDL_Quit to force shutdown). * shutdown a subsystem manually (or call SDL_Quit() to force shutdown).
* If a subsystem is already loaded then this call will * If a subsystem is already loaded then this call will
* increase the ref-count and return. * increase the ref-count and return.
*/ */
@ -127,6 +128,6 @@ extern DECLSPEC void SDLCALL SDL_Quit(void);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_H */ #endif /* SDL_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +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.
*/ */
#ifndef _SDL_assert_h #ifndef SDL_assert_h_
#define _SDL_assert_h #define SDL_assert_h_
#include "SDL_config.h" #include "SDL_config.h"
@ -51,9 +51,11 @@ assert can have unique static variables associated with it.
/* Don't include intrin.h here because it contains C++ code */ /* Don't include intrin.h here because it contains C++ code */
extern void __cdecl __debugbreak(void); extern void __cdecl __debugbreak(void);
#define SDL_TriggerBreakpoint() __debugbreak() #define SDL_TriggerBreakpoint() __debugbreak()
#elif (!defined(__NACL__) && defined(__GNUC__) && (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(HAVE_SIGNAL_H) #elif defined(__386__) && defined(__WATCOMC__)
#define SDL_TriggerBreakpoint() { _asm { int 0x03 } }
#elif defined(HAVE_SIGNAL_H) && !defined(__WATCOMC__)
#include <signal.h> #include <signal.h>
#define SDL_TriggerBreakpoint() raise(SIGTRAP) #define SDL_TriggerBreakpoint() raise(SIGTRAP)
#else #else
@ -63,7 +65,7 @@ assert can have unique static variables associated with it.
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */ #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */
# define SDL_FUNCTION __func__ # define SDL_FUNCTION __func__
#elif ((__GNUC__ >= 2) || defined(_MSC_VER)) #elif ((__GNUC__ >= 2) || defined(_MSC_VER) || defined (__WATCOMC__))
# define SDL_FUNCTION __FUNCTION__ # define SDL_FUNCTION __FUNCTION__
#else #else
# define SDL_FUNCTION "???" # define SDL_FUNCTION "???"
@ -201,7 +203,7 @@ typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)(
* *
* 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. * Return SDL_AssertState value of how to handle the assertion failure.
* *
* \param handler Callback function, called when an assertion fails. * \param handler Callback function, called when an assertion fails.
* \param userdata A pointer passed to the callback as-is. * \param userdata A pointer passed to the callback as-is.
@ -250,7 +252,7 @@ extern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void **puse
* <code> * <code>
* 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",
* item->condition, item->function, item->filename, * item->condition, item->function, item->filename,
* item->linenum, item->trigger_count, * item->linenum, item->trigger_count,
* item->always_ignore ? "yes" : "no"); * item->always_ignore ? "yes" : "no");
@ -284,6 +286,6 @@ extern DECLSPEC void SDLCALL SDL_ResetAssertionReport(void);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_assert_h */ #endif /* SDL_assert_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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
@ -56,8 +56,8 @@
* All of the atomic operations that modify memory are full memory barriers. * All of the atomic operations that modify memory are full memory barriers.
*/ */
#ifndef _SDL_atomic_h_ #ifndef SDL_atomic_h_
#define _SDL_atomic_h_ #define SDL_atomic_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#include "SDL_platform.h" #include "SDL_platform.h"
@ -118,13 +118,16 @@ extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock);
* The compiler barrier prevents the compiler from reordering * The compiler barrier prevents the compiler from reordering
* reads and writes to globally visible variables across the call. * reads and writes to globally visible variables across the call.
*/ */
#if defined(_MSC_VER) && (_MSC_VER > 1200) #if defined(_MSC_VER) && (_MSC_VER > 1200) && !defined(__clang__)
void _ReadWriteBarrier(void); void _ReadWriteBarrier(void);
#pragma intrinsic(_ReadWriteBarrier) #pragma intrinsic(_ReadWriteBarrier)
#define SDL_CompilerBarrier() _ReadWriteBarrier() #define SDL_CompilerBarrier() _ReadWriteBarrier()
#elif (defined(__GNUC__) && !defined(__EMSCRIPTEN__)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120)) #elif (defined(__GNUC__) && !defined(__EMSCRIPTEN__)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))
/* This is correct for all CPUs when using GCC or Solaris Studio 12.1+. */ /* This is correct for all CPUs when using GCC or Solaris Studio 12.1+. */
#define SDL_CompilerBarrier() __asm__ __volatile__ ("" : : : "memory") #define SDL_CompilerBarrier() __asm__ __volatile__ ("" : : : "memory")
#elif defined(__WATCOMC__)
extern _inline void SDL_CompilerBarrier (void);
#pragma aux SDL_CompilerBarrier = "" parm [] modify exact [];
#else #else
#define SDL_CompilerBarrier() \ #define SDL_CompilerBarrier() \
{ SDL_SpinLock _tmp = 0; SDL_AtomicLock(&_tmp); SDL_AtomicUnlock(&_tmp); } { SDL_SpinLock _tmp = 0; SDL_AtomicLock(&_tmp); SDL_AtomicUnlock(&_tmp); }
@ -149,6 +152,9 @@ void _ReadWriteBarrier(void);
* For more information on these semantics, take a look at the blog post: * For more information on these semantics, take a look at the blog post:
* http://preshing.com/20120913/acquire-and-release-semantics * http://preshing.com/20120913/acquire-and-release-semantics
*/ */
extern DECLSPEC void SDLCALL SDL_MemoryBarrierReleaseFunction(void);
extern DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void);
#if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) #if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("lwsync" : : : "memory") #define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("lwsync" : : : "memory")
#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("lwsync" : : : "memory") #define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("lwsync" : : : "memory")
@ -156,11 +162,11 @@ void _ReadWriteBarrier(void);
#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__)
#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory") #define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory")
#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory") #define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory")
#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_5TE__)
#ifdef __thumb__ #ifdef __thumb__
/* The mcr instruction isn't available in thumb mode, use real functions */ /* The mcr instruction isn't available in thumb mode, use real functions */
extern DECLSPEC void SDLCALL SDL_MemoryBarrierRelease(); #define SDL_MemoryBarrierRelease() SDL_MemoryBarrierReleaseFunction()
extern DECLSPEC void SDLCALL SDL_MemoryBarrierAcquire(); #define SDL_MemoryBarrierAcquire() SDL_MemoryBarrierAcquireFunction()
#else #else
#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory") #define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory")
#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory") #define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory")
@ -263,6 +269,6 @@ extern DECLSPEC void* SDLCALL SDL_AtomicGetPtr(void **a);
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_atomic_h_ */ #endif /* SDL_atomic_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +25,8 @@
* Access to the raw audio mixing buffer for the SDL library. * Access to the raw audio mixing buffer for the SDL library.
*/ */
#ifndef _SDL_audio_h #ifndef SDL_audio_h_
#define _SDL_audio_h #define SDL_audio_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#include "SDL_error.h" #include "SDL_error.h"
@ -164,6 +164,15 @@ typedef void (SDLCALL * SDL_AudioCallback) (void *userdata, Uint8 * stream,
/** /**
* The calculated values in this structure are calculated by SDL_OpenAudio(). * The calculated values in this structure are calculated by SDL_OpenAudio().
*
* For multi-channel audio, the default SDL channel mapping is:
* 2: FL FR (stereo)
* 3: FL FR LFE (2.1 surround)
* 4: FL FR BL BR (quad)
* 5: FL FR FC BL BR (quad + center)
* 6: FL FR FC LFE SL SR (5.1 surround - last two can also be BL BR)
* 7: FL FR FC LFE BC SL SR (6.1 surround)
* 8: FL FR FC LFE BL BR SL SR (7.1 surround)
*/ */
typedef struct SDL_AudioSpec typedef struct SDL_AudioSpec
{ {
@ -171,7 +180,7 @@ typedef struct SDL_AudioSpec
SDL_AudioFormat format; /**< Audio data format */ SDL_AudioFormat format; /**< Audio data format */
Uint8 channels; /**< Number of channels: 1 mono, 2 stereo */ Uint8 channels; /**< Number of channels: 1 mono, 2 stereo */
Uint8 silence; /**< Audio buffer silence value (calculated) */ Uint8 silence; /**< Audio buffer silence value (calculated) */
Uint16 samples; /**< Audio buffer size in samples (power of 2) */ Uint16 samples; /**< Audio buffer size in sample FRAMES (total samples divided by channel count) */
Uint16 padding; /**< Necessary for some compile environments */ Uint16 padding; /**< Necessary for some compile environments */
Uint32 size; /**< Audio buffer size in bytes (calculated) */ Uint32 size; /**< Audio buffer size in bytes (calculated) */
SDL_AudioCallback callback; /**< Callback that feeds the audio device (NULL to use SDL_QueueAudio()). */ SDL_AudioCallback callback; /**< Callback that feeds the audio device (NULL to use SDL_QueueAudio()). */
@ -184,7 +193,23 @@ typedef void (SDLCALL * SDL_AudioFilter) (struct SDL_AudioCVT * cvt,
SDL_AudioFormat format); SDL_AudioFormat format);
/** /**
* A structure to hold a set of audio conversion filters and buffers. * \brief Upper limit of filters in SDL_AudioCVT
*
* The maximum number of SDL_AudioFilter functions in SDL_AudioCVT is
* currently limited to 9. The SDL_AudioCVT.filters array has 10 pointers,
* one of which is the terminating NULL pointer.
*/
#define SDL_AUDIOCVT_MAX_FILTERS 9
/**
* \struct SDL_AudioCVT
* \brief A structure to hold a set of audio conversion filters and buffers.
*
* Note that various parts of the conversion pipeline can take advantage
* of SIMD operations (like SSE2, for example). SDL_AudioCVT doesn't require
* you to pass it aligned data, but can possibly run much faster if you
* set both its (buf) field to a pointer that is aligned to 16 bytes, and its
* (len) field to something that's a multiple of 16, if possible.
*/ */
#ifdef __GNUC__ #ifdef __GNUC__
/* This structure is 84 bytes on 32-bit architectures, make sure GCC doesn't /* This structure is 84 bytes on 32-bit architectures, make sure GCC doesn't
@ -208,7 +233,7 @@ typedef struct SDL_AudioCVT
int len_cvt; /**< Length of converted audio buffer */ int len_cvt; /**< Length of converted audio buffer */
int len_mult; /**< buffer must be len*len_mult big */ int len_mult; /**< buffer must be len*len_mult big */
double len_ratio; /**< Given len, final size is len*len_ratio */ double len_ratio; /**< Given len, final size is len*len_ratio */
SDL_AudioFilter filters[10]; /**< Filter list */ SDL_AudioFilter filters[SDL_AUDIOCVT_MAX_FILTERS + 1]; /**< NULL-terminated list of filter functions */
int filter_index; /**< Current audio conversion function */ int filter_index; /**< Current audio conversion function */
} SDL_AUDIOCVT_PACKED SDL_AudioCVT; } SDL_AUDIOCVT_PACKED SDL_AudioCVT;
@ -278,7 +303,8 @@ extern DECLSPEC const char *SDLCALL SDL_GetCurrentAudioDriver(void);
* protect data structures that it accesses by calling SDL_LockAudio() * protect data structures that it accesses by calling SDL_LockAudio()
* and SDL_UnlockAudio() in your code. Alternately, you may pass a NULL * and SDL_UnlockAudio() in your code. Alternately, you may pass a NULL
* pointer here, and call SDL_QueueAudio() with some frequency, to queue * pointer here, and call SDL_QueueAudio() with some frequency, to queue
* more audio samples to be played. * 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 * - \c desired->userdata is passed as the first parameter to your callback
* function. If you passed a NULL callback, this value is ignored. * function. If you passed a NULL callback, this value is ignored.
* *
@ -433,10 +459,10 @@ extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 * audio_buf);
* This function takes a source format and rate and a destination format * This function takes a source format and rate and a destination format
* and rate, and initializes the \c cvt structure with information needed * and rate, and initializes the \c cvt structure with information needed
* by SDL_ConvertAudio() to convert a buffer of audio data from one format * by SDL_ConvertAudio() to convert a buffer of audio data from one format
* to the other. * to the other. An unsupported format causes an error and -1 will be returned.
* *
* \return -1 if the format conversion is not supported, 0 if there's * \return 0 if no conversion is needed, 1 if the audio filter is set up,
* no conversion needed, or 1 if the audio filter is set up. * or -1 on error.
*/ */
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,
@ -455,9 +481,137 @@ extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT * cvt,
* The data conversion may expand the size of the audio data, so the buffer * The data conversion may expand the size of the audio data, so the buffer
* \c cvt->buf should be allocated after the \c cvt structure is initialized by * \c cvt->buf should be allocated after the \c cvt structure is initialized by
* SDL_BuildAudioCVT(), and should be \c cvt->len*cvt->len_mult bytes long. * SDL_BuildAudioCVT(), and should be \c cvt->len*cvt->len_mult bytes long.
*
* \return 0 on success or -1 if \c cvt->buf is NULL.
*/ */
extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT * cvt); extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT * cvt);
/* SDL_AudioStream is a new audio conversion interface.
The benefits vs SDL_AudioCVT:
- it can handle resampling data in chunks without generating
artifacts, when it doesn't have the complete buffer available.
- it can handle incoming data in any variable size.
- You push data as you have it, and pull it when you need it
*/
/* this is opaque to the outside world. */
struct _SDL_AudioStream;
typedef struct _SDL_AudioStream SDL_AudioStream;
/**
* Create a new audio stream
*
* \param src_format The format of the source audio
* \param src_channels The number of channels of the source audio
* \param src_rate The sampling rate of the source audio
* \param dst_format The format 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
* \return 0 on success, or -1 on error.
*
* \sa SDL_AudioStreamPut
* \sa SDL_AudioStreamGet
* \sa SDL_AudioStreamAvailable
* \sa SDL_AudioStreamFlush
* \sa SDL_AudioStreamClear
* \sa SDL_FreeAudioStream
*/
extern DECLSPEC SDL_AudioStream * SDLCALL SDL_NewAudioStream(const SDL_AudioFormat src_format,
const Uint8 src_channels,
const int src_rate,
const SDL_AudioFormat dst_format,
const Uint8 dst_channels,
const int dst_rate);
/**
* Add data to be converted/resampled to the stream
*
* \param stream The stream the audio data is being added to
* \param buf A pointer to the audio data to add
* \param int The number of bytes to write to the stream
* \return 0 on success, or -1 on error.
*
* \sa SDL_NewAudioStream
* \sa SDL_AudioStreamGet
* \sa SDL_AudioStreamAvailable
* \sa SDL_AudioStreamFlush
* \sa SDL_AudioStreamClear
* \sa SDL_FreeAudioStream
*/
extern DECLSPEC int SDLCALL SDL_AudioStreamPut(SDL_AudioStream *stream, const void *buf, int len);
/**
* Get converted/resampled data from the stream
*
* \param stream The stream the audio is being requested from
* \param buf A buffer to fill with audio data
* \param len The maximum number of bytes to fill
* \return The number of bytes read from the stream, or -1 on error
*
* \sa SDL_NewAudioStream
* \sa SDL_AudioStreamPut
* \sa SDL_AudioStreamAvailable
* \sa SDL_AudioStreamFlush
* \sa SDL_AudioStreamClear
* \sa SDL_FreeAudioStream
*/
extern DECLSPEC int SDLCALL SDL_AudioStreamGet(SDL_AudioStream *stream, void *buf, int len);
/**
* Get the number of converted/resampled bytes available. The stream may be
* buffering data behind the scenes until it has enough to resample
* correctly, so this number might be lower than what you expect, or even
* be zero. Add more data or flush the stream if you need the data now.
*
* \sa SDL_NewAudioStream
* \sa SDL_AudioStreamPut
* \sa SDL_AudioStreamGet
* \sa SDL_AudioStreamFlush
* \sa SDL_AudioStreamClear
* \sa SDL_FreeAudioStream
*/
extern DECLSPEC int SDLCALL SDL_AudioStreamAvailable(SDL_AudioStream *stream);
/**
* Tell the stream that you're done sending data, and anything being buffered
* should be converted/resampled and made available immediately.
*
* It is legal to add more data to a stream after flushing, but there will
* be audio gaps in the output. Generally this is intended to signal the
* end of input, so the complete output becomes available.
*
* \sa SDL_NewAudioStream
* \sa SDL_AudioStreamPut
* \sa SDL_AudioStreamGet
* \sa SDL_AudioStreamAvailable
* \sa SDL_AudioStreamClear
* \sa SDL_FreeAudioStream
*/
extern DECLSPEC int SDLCALL SDL_AudioStreamFlush(SDL_AudioStream *stream);
/**
* Clear any pending data in the stream without converting it
*
* \sa SDL_NewAudioStream
* \sa SDL_AudioStreamPut
* \sa SDL_AudioStreamGet
* \sa SDL_AudioStreamAvailable
* \sa SDL_AudioStreamFlush
* \sa SDL_FreeAudioStream
*/
extern DECLSPEC void SDLCALL SDL_AudioStreamClear(SDL_AudioStream *stream);
/**
* Free an audio stream
*
* \sa SDL_NewAudioStream
* \sa SDL_AudioStreamPut
* \sa SDL_AudioStreamGet
* \sa SDL_AudioStreamAvailable
* \sa SDL_AudioStreamFlush
* \sa SDL_AudioStreamClear
*/
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 takes two audio buffers of the playing audio format and mixes
@ -482,6 +636,10 @@ 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
* device, you want SDL_DequeueAudio() instead. This will return -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 method), or you can supply no callback, and then SDL will expect * (pull method), or you can supply no callback, and then SDL will expect
@ -509,28 +667,83 @@ extern DECLSPEC void SDLCALL SDL_MixAudioFormat(Uint8 * dst,
* \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 zero on success, -1 on error. * \return 0 on success, or -1 on error.
* *
* \sa SDL_GetQueuedAudioSize * \sa SDL_GetQueuedAudioSize
* \sa SDL_ClearQueuedAudio * \sa SDL_ClearQueuedAudio
*/ */
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.
*
* (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
* if you use it with playback devices.)
*
* SDL offers two ways to retrieve audio from a capture device: you can
* either supply a callback that SDL triggers with some frequency as the
* device records more audio data, (push method), or you can supply no
* callback, and then SDL will expect you to retrieve data at regular
* intervals (pull method) with this function.
*
* 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
* necessary without further intervention from you. This means you will
* eventually run out of memory if you aren't routinely dequeueing data.
*
* Capture devices will not queue data when paused; if you are expecting
* to not need captured audio for some length of time, use
* SDL_PauseAudioDevice() to stop the capture device from queueing more
* data. This can be useful during, say, level loading times. When
* unpaused, capture devices will start queueing data from that point,
* having flushed any capturable data available while paused.
*
* This function is thread-safe, but dequeueing from the same device from
* two threads at once does not promise which thread will dequeued data
* first.
*
* You may not dequeue audio from a device that is using an
* application-supplied callback; doing so returns an error. You have to use
* the audio callback, or dequeue audio with this function, but not both.
*
* You should not call SDL_LockAudio() on the device before queueing; SDL
* handles locking internally for this function.
*
* \param dev The device ID from which we will dequeue audio.
* \param data A pointer into where audio data should be copied.
* \param len The number of bytes (not samples!) to which (data) points.
* \return number of bytes dequeued, which could be less than requested.
*
* \sa SDL_GetQueuedAudioSize
* \sa SDL_ClearQueuedAudio
*/
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.
* *
* This is the number of bytes that have been queued for playback with * For playback device:
* SDL_QueueAudio(), but have not yet been sent to the hardware.
* *
* Once we've sent it to the hardware, this function can not decide the exact * This is the number of bytes that have been queued for playback with
* byte boundary of what has been played. It's possible that we just gave the * SDL_QueueAudio(), but have not yet been sent to the hardware. This
* hardware several kilobytes right before you called this function, but it * number may shrink at any time, so this only informs of pending data.
* 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
* exact byte boundary of what has been played. It's possible that we just
* gave the hardware several kilobytes right before you called this
* function, but it hasn't played any of it yet, or maybe half of it, etc.
*
* For capture devices:
*
* This is the number of bytes that have been captured by the device and
* are waiting for you to dequeue. This number may grow at any time, so
* this only informs of the lower-bound of available data.
* *
* 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; calling this function on such a device always returns 0. * callback; calling this function on such a device always returns 0.
* You have to use the audio callback or queue audio with SDL_QueueAudio(), * You have to queue audio with SDL_QueueAudio()/SDL_DequeueAudio(), or use
* but not both. * 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.
@ -544,10 +757,17 @@ extern DECLSPEC int SDLCALL SDL_QueueAudio(SDL_AudioDeviceID dev, const void *da
extern DECLSPEC Uint32 SDLCALL SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev); extern DECLSPEC Uint32 SDLCALL SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev);
/** /**
* Drop any queued audio data waiting to be sent to the hardware. * Drop any queued audio data. For playback devices, this is any queued data
* 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 and * Immediately after this call, SDL_GetQueuedAudioSize() will return 0. For
* the hardware will start playing silence if more audio isn't queued. * playback devices, the hardware will start playing silence if more audio
* isn't queued. Unpaused capture devices will start filling the queue again
* as soon as they have more data available (which, depending on the state
* 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 the hardware, as we can not undo that, so expect there to be some * to the hardware, as we can not undo that, so expect there to be some
@ -557,8 +777,8 @@ extern DECLSPEC Uint32 SDLCALL SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev);
* *
* 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; calling this function on such a device is always a no-op. * callback; calling this function on such a device is always a no-op.
* You have to use the audio callback or queue audio with SDL_QueueAudio(), * You have to queue audio with SDL_QueueAudio()/SDL_DequeueAudio(), or use
* but not both. * the audio callback, but 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.
@ -600,6 +820,6 @@ extern DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID dev);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_audio_h */ #endif /* SDL_audio_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +25,8 @@
* Functions for fiddling with bits and bitmasks. * Functions for fiddling with bits and bitmasks.
*/ */
#ifndef _SDL_bits_h #ifndef SDL_bits_h_
#define _SDL_bits_h #define SDL_bits_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
@ -47,10 +47,20 @@ 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__)
extern _inline int _SDL_clz_watcom (Uint32);
#pragma aux _SDL_clz_watcom = \
"bsr eax, eax" \
"xor eax, 31" \
parm [eax] nomemory \
value [eax] \
modify exact [eax] nomemory;
#endif
SDL_FORCE_INLINE int SDL_FORCE_INLINE int
SDL_MostSignificantBitIndex32(Uint32 x) SDL_MostSignificantBitIndex32(Uint32 x)
{ {
#if defined(__GNUC__) && __GNUC__ >= 4 #if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
/* Count Leading Zeroes builtin in GCC. /* Count Leading Zeroes builtin in GCC.
* http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/Other-Builtins.html * http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/Other-Builtins.html
*/ */
@ -58,6 +68,11 @@ SDL_MostSignificantBitIndex32(Uint32 x)
return -1; return -1;
} }
return 31 - __builtin_clz(x); return 31 - __builtin_clz(x);
#elif defined(__WATCOMC__) && defined(__386__)
if (x == 0) {
return -1;
}
return 31 - _SDL_clz_watcom(x);
#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.
@ -92,6 +107,6 @@ SDL_MostSignificantBitIndex32(Uint32 x)
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_bits_h */ #endif /* SDL_bits_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +25,8 @@
* Header file declaring the SDL_BlendMode enumeration * Header file declaring the SDL_BlendMode enumeration
*/ */
#ifndef _SDL_blendmode_h #ifndef SDL_blendmode_h_
#define _SDL_blendmode_h #define SDL_blendmode_h_
#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++ */
@ -47,17 +47,74 @@ typedef enum
SDL_BLENDMODE_ADD = 0x00000002, /**< additive blending SDL_BLENDMODE_ADD = 0x00000002, /**< additive blending
dstRGB = (srcRGB * srcA) + dstRGB dstRGB = (srcRGB * srcA) + dstRGB
dstA = dstA */ dstA = dstA */
SDL_BLENDMODE_MOD = 0x00000004 /**< color modulate SDL_BLENDMODE_MOD = 0x00000004, /**< color modulate
dstRGB = srcRGB * dstRGB dstRGB = srcRGB * dstRGB
dstA = dstA */ dstA = dstA */
SDL_BLENDMODE_INVALID = 0x7FFFFFFF
/* Additional custom blend modes can be returned by SDL_ComposeCustomBlendMode() */
} SDL_BlendMode; } SDL_BlendMode;
/**
* \brief The blend operation used when combining source and destination pixel components
*/
typedef enum
{
SDL_BLENDOPERATION_ADD = 0x1, /**< dst + src: supported by all renderers */
SDL_BLENDOPERATION_SUBTRACT = 0x2, /**< dst - src : supported by D3D9, D3D11, OpenGL, OpenGLES */
SDL_BLENDOPERATION_REV_SUBTRACT = 0x3, /**< src - dst : supported by D3D9, D3D11, OpenGL, OpenGLES */
SDL_BLENDOPERATION_MINIMUM = 0x4, /**< min(dst, src) : supported by D3D11 */
SDL_BLENDOPERATION_MAXIMUM = 0x5 /**< max(dst, src) : supported by D3D11 */
} SDL_BlendOperation;
/**
* \brief The normalized factor used to multiply pixel components
*/
typedef enum
{
SDL_BLENDFACTOR_ZERO = 0x1, /**< 0, 0, 0, 0 */
SDL_BLENDFACTOR_ONE = 0x2, /**< 1, 1, 1, 1 */
SDL_BLENDFACTOR_SRC_COLOR = 0x3, /**< srcR, srcG, srcB, srcA */
SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR = 0x4, /**< 1-srcR, 1-srcG, 1-srcB, 1-srcA */
SDL_BLENDFACTOR_SRC_ALPHA = 0x5, /**< srcA, srcA, srcA, srcA */
SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA = 0x6, /**< 1-srcA, 1-srcA, 1-srcA, 1-srcA */
SDL_BLENDFACTOR_DST_COLOR = 0x7, /**< dstR, dstG, dstB, dstA */
SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR = 0x8, /**< 1-dstR, 1-dstG, 1-dstB, 1-dstA */
SDL_BLENDFACTOR_DST_ALPHA = 0x9, /**< dstA, dstA, dstA, dstA */
SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA = 0xA /**< 1-dstA, 1-dstA, 1-dstA, 1-dstA */
} SDL_BlendFactor;
/**
* \brief Create a custom blend mode, which may or may not be supported by a given renderer
*
* \param srcColorFactor
* \param dstColorFactor
* \param colorOperation
* \param srcAlphaFactor
* \param dstAlphaFactor
* \param alphaOperation
*
* The result of the blend mode operation will be:
* dstRGB = dstRGB * dstColorFactor colorOperation srcRGB * srcColorFactor
* and
* dstA = dstA * dstAlphaFactor alphaOperation srcA * srcAlphaFactor
*/
extern DECLSPEC SDL_BlendMode SDLCALL SDL_ComposeCustomBlendMode(SDL_BlendFactor srcColorFactor,
SDL_BlendFactor dstColorFactor,
SDL_BlendOperation colorOperation,
SDL_BlendFactor srcAlphaFactor,
SDL_BlendFactor dstAlphaFactor,
SDL_BlendOperation alphaOperation);
/* Ends C function definitions when using C++ */ /* Ends C function definitions when using C++ */
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_blendmode_h */ #endif /* SDL_blendmode_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +25,8 @@
* Include file for SDL clipboard handling * Include file for SDL clipboard handling
*/ */
#ifndef _SDL_clipboard_h #ifndef SDL_clipboard_h_
#define _SDL_clipboard_h #define SDL_clipboard_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
@ -66,6 +66,6 @@ extern DECLSPEC SDL_bool SDLCALL SDL_HasClipboardText(void);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_clipboard_h */ #endif /* SDL_clipboard_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +19,9 @@
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.
*/ */
#ifndef _SDL_config_windows_h #ifndef SDL_config_windows_h_
#define _SDL_config_windows_h #define SDL_config_windows_h_
#define SDL_config_h_
#include "SDL_platform.h" #include "SDL_platform.h"
@ -85,12 +86,14 @@ typedef unsigned int uintptr_t;
/* This is disabled by default to avoid C runtime dependencies and manifest requirements */ /* This is disabled by default to avoid C runtime dependencies and manifest requirements */
#ifdef HAVE_LIBC #ifdef HAVE_LIBC
/* Useful headers */ /* Useful headers */
#define HAVE_STDIO_H 1
#define STDC_HEADERS 1 #define STDC_HEADERS 1
#define HAVE_STRING_H 1
#define HAVE_CTYPE_H 1 #define HAVE_CTYPE_H 1
#define HAVE_FLOAT_H 1
#define HAVE_LIMITS_H 1
#define HAVE_MATH_H 1 #define HAVE_MATH_H 1
#define HAVE_SIGNAL_H 1 #define HAVE_SIGNAL_H 1
#define HAVE_STDIO_H 1
#define HAVE_STRING_H 1
/* C library functions */ /* C library functions */
#define HAVE_MALLOC 1 #define HAVE_MALLOC 1
@ -139,12 +142,19 @@ typedef unsigned int uintptr_t;
#define HAVE_SQRTF 1 #define HAVE_SQRTF 1
#define HAVE_TAN 1 #define HAVE_TAN 1
#define HAVE_TANF 1 #define HAVE_TANF 1
#define HAVE__COPYSIGN 1
#if defined(_MSC_VER)
/* 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_VSSCANF 1 #define HAVE_VSSCANF 1
#define HAVE_COPYSIGN 1
#define HAVE_SCALBN 1 #define HAVE_SCALBN 1
#endif #endif
/* This function is available with at least the VC++ 2008 C runtime library */
#if _MSC_VER >= 1400
#define HAVE__FSEEKI64 1
#endif
#endif
#if !defined(_MSC_VER) || defined(_USE_MATH_DEFINES) #if !defined(_MSC_VER) || defined(_USE_MATH_DEFINES)
#define HAVE_M_PI 1 #define HAVE_M_PI 1
#endif #endif
@ -154,8 +164,9 @@ typedef unsigned int uintptr_t;
#endif #endif
/* Enable various audio drivers */ /* Enable various audio drivers */
#define SDL_AUDIO_DRIVER_WASAPI 1
#define SDL_AUDIO_DRIVER_DSOUND 1 #define SDL_AUDIO_DRIVER_DSOUND 1
#define SDL_AUDIO_DRIVER_XAUDIO2 1 #define SDL_AUDIO_DRIVER_XAUDIO2 0
#define SDL_AUDIO_DRIVER_WINMM 1 #define SDL_AUDIO_DRIVER_WINMM 1
#define SDL_AUDIO_DRIVER_DISK 1 #define SDL_AUDIO_DRIVER_DISK 1
#define SDL_AUDIO_DRIVER_DUMMY 1 #define SDL_AUDIO_DRIVER_DUMMY 1
@ -206,6 +217,8 @@ typedef unsigned int uintptr_t;
#define SDL_VIDEO_OPENGL_EGL 1 #define SDL_VIDEO_OPENGL_EGL 1
#endif #endif
/* Enable Vulkan support */
#define SDL_VIDEO_VULKAN 1
/* Enable system power support */ /* Enable system power support */
#define SDL_POWER_WINDOWS 1 #define SDL_POWER_WINDOWS 1
@ -218,4 +231,4 @@ typedef unsigned int uintptr_t;
#define SDL_ASSEMBLY_ROUTINES 1 #define SDL_ASSEMBLY_ROUTINES 1
#endif #endif
#endif /* _SDL_config_windows_h */ #endif /* SDL_config_windows_h_ */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,14 +25,20 @@
* CPU feature detection for SDL. * CPU feature detection for SDL.
*/ */
#ifndef _SDL_cpuinfo_h #ifndef SDL_cpuinfo_h_
#define _SDL_cpuinfo_h #define SDL_cpuinfo_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
/* Need to do this here because intrin.h has C++ code in it */ /* Need to do this here because intrin.h has C++ code in it */
/* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */ /* 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__
/* Many of the intrinsics SDL uses are not implemented by clang with Visual Studio */
#undef __MMX__
#undef __SSE__
#undef __SSE2__
#else
#include <intrin.h> #include <intrin.h>
#ifndef _WIN64 #ifndef _WIN64
#define __MMX__ #define __MMX__
@ -40,6 +46,7 @@
#endif #endif
#define __SSE__ #define __SSE__
#define __SSE2__ #define __SSE2__
#endif /* __clang__ */
#elif defined(__MINGW64_VERSION_MAJOR) #elif defined(__MINGW64_VERSION_MAJOR)
#include <intrin.h> #include <intrin.h>
#else #else
@ -61,6 +68,9 @@
#ifdef __SSE2__ #ifdef __SSE2__
#include <emmintrin.h> #include <emmintrin.h>
#endif #endif
#ifdef __SSE3__
#include <pmmintrin.h>
#endif
#endif #endif
#include "begin_code.h" #include "begin_code.h"
@ -144,6 +154,11 @@ extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX(void);
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX2(void); extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX2(void);
/**
* This function returns true if the CPU has NEON (ARM SIMD) features.
*/
extern DECLSPEC SDL_bool SDLCALL SDL_HasNEON(void);
/** /**
* This function returns the amount of RAM configured in the system, in MB. * This function returns the amount of RAM configured in the system, in MB.
*/ */
@ -156,6 +171,6 @@ extern DECLSPEC int SDLCALL SDL_GetSystemRAM(void);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_cpuinfo_h */ #endif /* SDL_cpuinfo_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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
@ -132,7 +132,7 @@
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
* This precedes the return type of the function in the function prototype. * This precedes the return type of the function in the function prototype.
*/ */
#if defined(_WIN32) && !defined(__SCITECH_SNAP__) #if defined(_WIN32) && !defined(__SCITECH_SNAP__) && !defined(SDL_VIDEO_STATIC_ANGLE)
# define KHRONOS_APICALL __declspec(dllimport) # define KHRONOS_APICALL __declspec(dllimport)
#elif defined (__SYMBIAN32__) #elif defined (__SYMBIAN32__)
# define KHRONOS_APICALL IMPORT_C # define KHRONOS_APICALL IMPORT_C

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +25,8 @@
* Functions for reading and writing endian-specific values * Functions for reading and writing endian-specific values
*/ */
#ifndef _SDL_endian_h #ifndef SDL_endian_h_
#define _SDL_endian_h #define SDL_endian_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
@ -96,6 +96,12 @@ 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(__WATCOMC__) && defined(__386__)
extern _inline Uint16 SDL_Swap16(Uint16);
#pragma aux SDL_Swap16 = \
"xchg al, ah" \
parm [ax] \
modify [ax];
#else #else
SDL_FORCE_INLINE Uint16 SDL_FORCE_INLINE Uint16
SDL_Swap16(Uint16 x) SDL_Swap16(Uint16 x)
@ -136,6 +142,21 @@ SDL_Swap32(Uint32 x)
__asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0": "=d"(x): "0"(x):"cc"); __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0": "=d"(x): "0"(x):"cc");
return x; return x;
} }
#elif defined(__WATCOMC__) && defined(__386__)
extern _inline Uint32 SDL_Swap32(Uint32);
#ifndef __SW_3 /* 486+ */
#pragma aux SDL_Swap32 = \
"bswap eax" \
parm [eax] \
modify [eax];
#else /* 386-only */
#pragma aux SDL_Swap32 = \
"xchg al, ah" \
"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)
@ -234,6 +255,6 @@ SDL_SwapFloat(float x)
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_endian_h */ #endif /* SDL_endian_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +25,8 @@
* Simple error message routines for SDL. * Simple error message routines for SDL.
*/ */
#ifndef _SDL_error_h #ifndef SDL_error_h_
#define _SDL_error_h #define SDL_error_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
@ -71,6 +71,6 @@ extern DECLSPEC int SDLCALL SDL_Error(SDL_errorcode code);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_error_h */ #endif /* SDL_error_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +25,8 @@
* Include file for SDL event handling. * Include file for SDL event handling.
*/ */
#ifndef _SDL_events_h #ifndef SDL_events_h_
#define _SDL_events_h #define SDL_events_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#include "SDL_error.h" #include "SDL_error.h"
@ -136,6 +136,9 @@ typedef enum
/* Drag and drop events */ /* Drag and drop events */
SDL_DROPFILE = 0x1000, /**< The system requests a file open */ SDL_DROPFILE = 0x1000, /**< The system requests a file open */
SDL_DROPTEXT, /**< text/plain drag-and-drop event */
SDL_DROPBEGIN, /**< A new set of drops is beginning (NULL filename) */
SDL_DROPCOMPLETE, /**< Current set of drops is now complete (NULL filename) */
/* Audio hotplug events */ /* Audio hotplug events */
SDL_AUDIODEVICEADDED = 0x1100, /**< A new audio device is available */ SDL_AUDIODEVICEADDED = 0x1100, /**< A new audio device is available */
@ -162,7 +165,7 @@ typedef enum
typedef struct SDL_CommonEvent typedef struct SDL_CommonEvent
{ {
Uint32 type; Uint32 type;
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
} SDL_CommonEvent; } SDL_CommonEvent;
/** /**
@ -171,7 +174,7 @@ typedef struct SDL_CommonEvent
typedef struct SDL_WindowEvent typedef struct SDL_WindowEvent
{ {
Uint32 type; /**< ::SDL_WINDOWEVENT */ Uint32 type; /**< ::SDL_WINDOWEVENT */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID; /**< The associated window */ Uint32 windowID; /**< The associated window */
Uint8 event; /**< ::SDL_WindowEventID */ Uint8 event; /**< ::SDL_WindowEventID */
Uint8 padding1; Uint8 padding1;
@ -187,7 +190,7 @@ typedef struct SDL_WindowEvent
typedef struct SDL_KeyboardEvent typedef struct SDL_KeyboardEvent
{ {
Uint32 type; /**< ::SDL_KEYDOWN or ::SDL_KEYUP */ Uint32 type; /**< ::SDL_KEYDOWN or ::SDL_KEYUP */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID; /**< The window with keyboard focus, if any */ Uint32 windowID; /**< The window with keyboard focus, if any */
Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */
Uint8 repeat; /**< Non-zero if this is a key repeat */ Uint8 repeat; /**< Non-zero if this is a key repeat */
@ -203,7 +206,7 @@ typedef struct SDL_KeyboardEvent
typedef struct SDL_TextEditingEvent typedef struct SDL_TextEditingEvent
{ {
Uint32 type; /**< ::SDL_TEXTEDITING */ Uint32 type; /**< ::SDL_TEXTEDITING */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID; /**< The window with keyboard focus, if any */ Uint32 windowID; /**< The window with keyboard focus, if any */
char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE]; /**< The editing text */ char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE]; /**< The editing text */
Sint32 start; /**< The start cursor of selected editing text */ Sint32 start; /**< The start cursor of selected editing text */
@ -218,7 +221,7 @@ typedef struct SDL_TextEditingEvent
typedef struct SDL_TextInputEvent typedef struct SDL_TextInputEvent
{ {
Uint32 type; /**< ::SDL_TEXTINPUT */ Uint32 type; /**< ::SDL_TEXTINPUT */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID; /**< The window with keyboard focus, if any */ Uint32 windowID; /**< The window with keyboard focus, if any */
char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; /**< The input text */ char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; /**< The input text */
} SDL_TextInputEvent; } SDL_TextInputEvent;
@ -229,7 +232,7 @@ typedef struct SDL_TextInputEvent
typedef struct SDL_MouseMotionEvent typedef struct SDL_MouseMotionEvent
{ {
Uint32 type; /**< ::SDL_MOUSEMOTION */ Uint32 type; /**< ::SDL_MOUSEMOTION */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID; /**< The window with mouse focus, if any */ Uint32 windowID; /**< The window with mouse focus, if any */
Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */
Uint32 state; /**< The current button state */ Uint32 state; /**< The current button state */
@ -245,7 +248,7 @@ typedef struct SDL_MouseMotionEvent
typedef struct SDL_MouseButtonEvent typedef struct SDL_MouseButtonEvent
{ {
Uint32 type; /**< ::SDL_MOUSEBUTTONDOWN or ::SDL_MOUSEBUTTONUP */ Uint32 type; /**< ::SDL_MOUSEBUTTONDOWN or ::SDL_MOUSEBUTTONUP */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID; /**< The window with mouse focus, if any */ Uint32 windowID; /**< The window with mouse focus, if any */
Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */
Uint8 button; /**< The mouse button index */ Uint8 button; /**< The mouse button index */
@ -262,7 +265,7 @@ typedef struct SDL_MouseButtonEvent
typedef struct SDL_MouseWheelEvent typedef struct SDL_MouseWheelEvent
{ {
Uint32 type; /**< ::SDL_MOUSEWHEEL */ Uint32 type; /**< ::SDL_MOUSEWHEEL */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID; /**< The window with mouse focus, if any */ Uint32 windowID; /**< The window with mouse focus, if any */
Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */
Sint32 x; /**< The amount scrolled horizontally, positive to the right and negative to the left */ Sint32 x; /**< The amount scrolled horizontally, positive to the right and negative to the left */
@ -276,7 +279,7 @@ typedef struct SDL_MouseWheelEvent
typedef struct SDL_JoyAxisEvent typedef struct SDL_JoyAxisEvent
{ {
Uint32 type; /**< ::SDL_JOYAXISMOTION */ Uint32 type; /**< ::SDL_JOYAXISMOTION */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_JoystickID which; /**< The joystick instance id */ SDL_JoystickID which; /**< The joystick instance id */
Uint8 axis; /**< The joystick axis index */ Uint8 axis; /**< The joystick axis index */
Uint8 padding1; Uint8 padding1;
@ -292,7 +295,7 @@ typedef struct SDL_JoyAxisEvent
typedef struct SDL_JoyBallEvent typedef struct SDL_JoyBallEvent
{ {
Uint32 type; /**< ::SDL_JOYBALLMOTION */ Uint32 type; /**< ::SDL_JOYBALLMOTION */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_JoystickID which; /**< The joystick instance id */ SDL_JoystickID which; /**< The joystick instance id */
Uint8 ball; /**< The joystick trackball index */ Uint8 ball; /**< The joystick trackball index */
Uint8 padding1; Uint8 padding1;
@ -308,7 +311,7 @@ typedef struct SDL_JoyBallEvent
typedef struct SDL_JoyHatEvent typedef struct SDL_JoyHatEvent
{ {
Uint32 type; /**< ::SDL_JOYHATMOTION */ Uint32 type; /**< ::SDL_JOYHATMOTION */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_JoystickID which; /**< The joystick instance id */ SDL_JoystickID which; /**< The joystick instance id */
Uint8 hat; /**< The joystick hat index */ Uint8 hat; /**< The joystick hat index */
Uint8 value; /**< The hat position value. Uint8 value; /**< The hat position value.
@ -328,7 +331,7 @@ typedef struct SDL_JoyHatEvent
typedef struct SDL_JoyButtonEvent typedef struct SDL_JoyButtonEvent
{ {
Uint32 type; /**< ::SDL_JOYBUTTONDOWN or ::SDL_JOYBUTTONUP */ Uint32 type; /**< ::SDL_JOYBUTTONDOWN or ::SDL_JOYBUTTONUP */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_JoystickID which; /**< The joystick instance id */ SDL_JoystickID which; /**< The joystick instance id */
Uint8 button; /**< The joystick button index */ Uint8 button; /**< The joystick button index */
Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */
@ -342,7 +345,7 @@ typedef struct SDL_JoyButtonEvent
typedef struct SDL_JoyDeviceEvent typedef struct SDL_JoyDeviceEvent
{ {
Uint32 type; /**< ::SDL_JOYDEVICEADDED or ::SDL_JOYDEVICEREMOVED */ Uint32 type; /**< ::SDL_JOYDEVICEADDED or ::SDL_JOYDEVICEREMOVED */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
Sint32 which; /**< The joystick device index for the ADDED event, instance id for the REMOVED event */ Sint32 which; /**< The joystick device index for the ADDED event, instance id for the REMOVED event */
} SDL_JoyDeviceEvent; } SDL_JoyDeviceEvent;
@ -353,7 +356,7 @@ typedef struct SDL_JoyDeviceEvent
typedef struct SDL_ControllerAxisEvent typedef struct SDL_ControllerAxisEvent
{ {
Uint32 type; /**< ::SDL_CONTROLLERAXISMOTION */ Uint32 type; /**< ::SDL_CONTROLLERAXISMOTION */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_JoystickID which; /**< The joystick instance id */ SDL_JoystickID which; /**< The joystick instance id */
Uint8 axis; /**< The controller axis (SDL_GameControllerAxis) */ Uint8 axis; /**< The controller axis (SDL_GameControllerAxis) */
Uint8 padding1; Uint8 padding1;
@ -370,7 +373,7 @@ typedef struct SDL_ControllerAxisEvent
typedef struct SDL_ControllerButtonEvent typedef struct SDL_ControllerButtonEvent
{ {
Uint32 type; /**< ::SDL_CONTROLLERBUTTONDOWN or ::SDL_CONTROLLERBUTTONUP */ Uint32 type; /**< ::SDL_CONTROLLERBUTTONDOWN or ::SDL_CONTROLLERBUTTONUP */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_JoystickID which; /**< The joystick instance id */ SDL_JoystickID which; /**< The joystick instance id */
Uint8 button; /**< The controller button (SDL_GameControllerButton) */ Uint8 button; /**< The controller button (SDL_GameControllerButton) */
Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */
@ -385,7 +388,7 @@ typedef struct SDL_ControllerButtonEvent
typedef struct SDL_ControllerDeviceEvent typedef struct SDL_ControllerDeviceEvent
{ {
Uint32 type; /**< ::SDL_CONTROLLERDEVICEADDED, ::SDL_CONTROLLERDEVICEREMOVED, or ::SDL_CONTROLLERDEVICEREMAPPED */ Uint32 type; /**< ::SDL_CONTROLLERDEVICEADDED, ::SDL_CONTROLLERDEVICEREMOVED, or ::SDL_CONTROLLERDEVICEREMAPPED */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
Sint32 which; /**< The joystick device index for the ADDED event, instance id for the REMOVED or REMAPPED event */ Sint32 which; /**< The joystick device index for the ADDED event, instance id for the REMOVED or REMAPPED event */
} SDL_ControllerDeviceEvent; } SDL_ControllerDeviceEvent;
@ -395,7 +398,7 @@ typedef struct SDL_ControllerDeviceEvent
typedef struct SDL_AudioDeviceEvent typedef struct SDL_AudioDeviceEvent
{ {
Uint32 type; /**< ::SDL_AUDIODEVICEADDED, or ::SDL_AUDIODEVICEREMOVED */ Uint32 type; /**< ::SDL_AUDIODEVICEADDED, or ::SDL_AUDIODEVICEREMOVED */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 which; /**< The audio device index for the ADDED event (valid until next SDL_GetNumAudioDevices() call), SDL_AudioDeviceID for the REMOVED event */ Uint32 which; /**< The audio device index for the ADDED event (valid until next SDL_GetNumAudioDevices() call), SDL_AudioDeviceID for the REMOVED event */
Uint8 iscapture; /**< zero if an output device, non-zero if a capture device. */ Uint8 iscapture; /**< zero if an output device, non-zero if a capture device. */
Uint8 padding1; Uint8 padding1;
@ -410,7 +413,7 @@ typedef struct SDL_AudioDeviceEvent
typedef struct SDL_TouchFingerEvent typedef struct SDL_TouchFingerEvent
{ {
Uint32 type; /**< ::SDL_FINGERMOTION or ::SDL_FINGERDOWN or ::SDL_FINGERUP */ Uint32 type; /**< ::SDL_FINGERMOTION or ::SDL_FINGERDOWN or ::SDL_FINGERUP */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_TouchID touchId; /**< The touch device id */ SDL_TouchID touchId; /**< The touch device id */
SDL_FingerID fingerId; SDL_FingerID fingerId;
float x; /**< Normalized in the range 0...1 */ float x; /**< Normalized in the range 0...1 */
@ -427,8 +430,8 @@ typedef struct SDL_TouchFingerEvent
typedef struct SDL_MultiGestureEvent typedef struct SDL_MultiGestureEvent
{ {
Uint32 type; /**< ::SDL_MULTIGESTURE */ Uint32 type; /**< ::SDL_MULTIGESTURE */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_TouchID touchId; /**< The touch device index */ SDL_TouchID touchId; /**< The touch device id */
float dTheta; float dTheta;
float dDist; float dDist;
float x; float x;
@ -444,7 +447,7 @@ typedef struct SDL_MultiGestureEvent
typedef struct SDL_DollarGestureEvent typedef struct SDL_DollarGestureEvent
{ {
Uint32 type; /**< ::SDL_DOLLARGESTURE or ::SDL_DOLLARRECORD */ Uint32 type; /**< ::SDL_DOLLARGESTURE or ::SDL_DOLLARRECORD */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_TouchID touchId; /**< The touch device id */ SDL_TouchID touchId; /**< The touch device id */
SDL_GestureID gestureId; SDL_GestureID gestureId;
Uint32 numFingers; Uint32 numFingers;
@ -461,9 +464,10 @@ typedef struct SDL_DollarGestureEvent
*/ */
typedef struct SDL_DropEvent typedef struct SDL_DropEvent
{ {
Uint32 type; /**< ::SDL_DROPFILE */ Uint32 type; /**< ::SDL_DROPBEGIN or ::SDL_DROPFILE or ::SDL_DROPTEXT or ::SDL_DROPCOMPLETE */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
char *file; /**< The file name, which should be freed with SDL_free() */ char *file; /**< The file name, which should be freed with SDL_free(), is NULL on begin/complete */
Uint32 windowID; /**< The window that was dropped on, if any */
} SDL_DropEvent; } SDL_DropEvent;
@ -473,7 +477,7 @@ typedef struct SDL_DropEvent
typedef struct SDL_QuitEvent typedef struct SDL_QuitEvent
{ {
Uint32 type; /**< ::SDL_QUIT */ Uint32 type; /**< ::SDL_QUIT */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
} SDL_QuitEvent; } SDL_QuitEvent;
/** /**
@ -482,7 +486,7 @@ typedef struct SDL_QuitEvent
typedef struct SDL_OSEvent typedef struct SDL_OSEvent
{ {
Uint32 type; /**< ::SDL_QUIT */ Uint32 type; /**< ::SDL_QUIT */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
} SDL_OSEvent; } SDL_OSEvent;
/** /**
@ -491,7 +495,7 @@ typedef struct SDL_OSEvent
typedef struct SDL_UserEvent typedef struct SDL_UserEvent
{ {
Uint32 type; /**< ::SDL_USEREVENT through ::SDL_LASTEVENT-1 */ Uint32 type; /**< ::SDL_USEREVENT through ::SDL_LASTEVENT-1 */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID; /**< The associated window if any */ Uint32 windowID; /**< The associated window if any */
Sint32 code; /**< User defined event code */ Sint32 code; /**< User defined event code */
void *data1; /**< User defined data pointer */ void *data1; /**< User defined data pointer */
@ -511,7 +515,7 @@ typedef struct SDL_SysWMmsg SDL_SysWMmsg;
typedef struct SDL_SysWMEvent typedef struct SDL_SysWMEvent
{ {
Uint32 type; /**< ::SDL_SYSWMEVENT */ Uint32 type; /**< ::SDL_SYSWMEVENT */
Uint32 timestamp; Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_SysWMmsg *msg; /**< driver dependent data, defined in SDL_syswm.h */ SDL_SysWMmsg *msg; /**< driver dependent data, defined in SDL_syswm.h */
} SDL_SysWMEvent; } SDL_SysWMEvent;
@ -720,7 +724,7 @@ extern DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter,
/** /**
* This function allows you to set the state of processing certain events. * This function allows you to set the state of processing certain events.
* - If \c state is set to ::SDL_IGNORE, that event will be automatically * - If \c state is set to ::SDL_IGNORE, that event will be automatically
* dropped from the event queue and will not event be filtered. * dropped from the event queue and will not be filtered.
* - If \c state is set to ::SDL_ENABLE, that event will be processed * - If \c state is set to ::SDL_ENABLE, that event will be processed
* normally. * normally.
* - If \c state is set to ::SDL_QUERY, SDL_EventState() will return the * - If \c state is set to ::SDL_QUERY, SDL_EventState() will return the
@ -745,6 +749,6 @@ extern DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_events_h */ #endif /* SDL_events_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +25,8 @@
* \brief Include file for filesystem SDL API functions * \brief Include file for filesystem SDL API functions
*/ */
#ifndef _SDL_filesystem_h #ifndef SDL_filesystem_h_
#define _SDL_filesystem_h #define SDL_filesystem_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
@ -131,6 +131,6 @@ extern DECLSPEC char *SDLCALL SDL_GetPrefPath(const char *org, const char *app);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_filesystem_h */ #endif /* SDL_filesystem_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +25,8 @@
* Include file for SDL game controller event handling * Include file for SDL game controller event handling
*/ */
#ifndef _SDL_gamecontroller_h #ifndef SDL_gamecontroller_h_
#define _SDL_gamecontroller_h #define SDL_gamecontroller_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#include "SDL_error.h" #include "SDL_error.h"
@ -51,7 +51,9 @@ extern "C" {
* SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS
*/ */
/* The gamecontroller structure used to identify an SDL game controller */ /**
* The gamecontroller structure used to identify an SDL game controller
*/
struct _SDL_GameController; struct _SDL_GameController;
typedef struct _SDL_GameController SDL_GameController; typedef struct _SDL_GameController SDL_GameController;
@ -87,13 +89,13 @@ typedef struct SDL_GameControllerButtonBind
* To count the number of game controllers in the system for the following: * To count the number of game controllers in the system for the following:
* int nJoysticks = SDL_NumJoysticks(); * int nJoysticks = SDL_NumJoysticks();
* int nGameControllers = 0; * int nGameControllers = 0;
* for ( int i = 0; i < nJoysticks; i++ ) { * for (int i = 0; i < nJoysticks; i++) {
* if ( SDL_IsGameController(i) ) { * if (SDL_IsGameController(i)) {
* nGameControllers++; * nGameControllers++;
* } * }
* } * }
* *
* Using the SDL_HINT_GAMECONTROLLERCONFIG hint or the SDL_GameControllerAddMapping you can add support for controllers SDL is unaware of or cause an existing controller to have a different binding. The format is: * Using the SDL_HINT_GAMECONTROLLERCONFIG hint or the SDL_GameControllerAddMapping() you can add support for controllers SDL is unaware of or cause an existing controller to have a different binding. The format is:
* guid,name,mappings * guid,name,mappings
* *
* 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. * 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.
@ -105,7 +107,7 @@ typedef struct SDL_GameControllerButtonBind
* Buttons can be used as a controller axis and vice versa. * Buttons can be used as a controller axis and vice versa.
* *
* This string shows an example of a valid mapping for a controller * 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", * "03000000341a00003608000000000000,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",
* *
*/ */
@ -117,7 +119,7 @@ typedef struct SDL_GameControllerButtonBind
* *
* \return number of mappings added, -1 on error * \return number of mappings added, -1 on error
*/ */
extern DECLSPEC int SDLCALL SDL_GameControllerAddMappingsFromRW( SDL_RWops * rw, int freerw ); extern DECLSPEC int SDLCALL SDL_GameControllerAddMappingsFromRW(SDL_RWops * rw, int freerw);
/** /**
* Load a set of mappings from a file, filtered by the current SDL_GetPlatform() * Load a set of mappings from a file, filtered by the current SDL_GetPlatform()
@ -131,28 +133,41 @@ extern DECLSPEC int SDLCALL SDL_GameControllerAddMappingsFromRW( SDL_RWops * rw,
* *
* \return 1 if mapping is added, 0 if updated, -1 on error * \return 1 if mapping is added, 0 if updated, -1 on error
*/ */
extern DECLSPEC int SDLCALL SDL_GameControllerAddMapping( const char* mappingString ); extern DECLSPEC int SDLCALL SDL_GameControllerAddMapping(const char* mappingString);
/**
* Get the number of mappings installed
*
* \return the number of mappings
*/
extern DECLSPEC int SDLCALL SDL_GameControllerNumMappings(void);
/**
* 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.
*/
extern DECLSPEC char * SDLCALL SDL_GameControllerMappingForIndex(int mapping_index);
/** /**
* Get a mapping string for a GUID * Get a mapping string for a GUID
* *
* \return the mapping string. Must be freed with SDL_free. Returns NULL if no mapping is available * \return the mapping string. Must be freed with SDL_free(). Returns NULL if no mapping is available
*/ */
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 a mapping string for an open GameController
* *
* \return the mapping string. Must be freed with SDL_free. Returns NULL if no mapping is available * \return the mapping string. Must be freed with SDL_free(). Returns NULL if no mapping is available
*/ */
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? * Is the joystick on this index supported by the game controller interface?
*/ */
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 of a game controller.
* This can be called before any controllers are opened. * This can be called before any controllers are opened.
@ -181,6 +196,24 @@ extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerFromInstanceID(SDL
*/ */
extern DECLSPEC const char *SDLCALL SDL_GameControllerName(SDL_GameController *gamecontroller); extern DECLSPEC const char *SDLCALL SDL_GameControllerName(SDL_GameController *gamecontroller);
/**
* Get the USB vendor ID of an opened controller, if available.
* If the vendor ID isn't available this function returns 0.
*/
extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetVendor(SDL_GameController * gamecontroller);
/**
* Get the USB product ID of an opened controller, if available.
* If the product ID isn't available this function returns 0.
*/
extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetProduct(SDL_GameController * gamecontroller);
/**
* Get the product version of an opened controller, if available.
* If the product version isn't available this function returns 0.
*/
extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetProductVersion(SDL_GameController * gamecontroller);
/** /**
* Returns SDL_TRUE if the controller has been opened and currently connected, * Returns SDL_TRUE if the controller has been opened and currently connected,
* or SDL_FALSE if it has not. * or SDL_FALSE if it has not.
@ -214,6 +247,12 @@ extern DECLSPEC void SDLCALL SDL_GameControllerUpdate(void);
/** /**
* The list of axes available from a controller * The list of axes available from a controller
*
* Thumbstick axis values range from SDL_JOYSTICK_AXIS_MIN to SDL_JOYSTICK_AXIS_MAX,
* and are centered within ~8000 of zero, though advanced UI will allow users to set
* or autodetect the dead zone, which varies between controllers.
*
* Trigger axis values range from 0 to SDL_JOYSTICK_AXIS_MAX.
*/ */
typedef enum typedef enum
{ {
@ -318,6 +357,6 @@ extern DECLSPEC void SDLCALL SDL_GameControllerClose(SDL_GameController *gamecon
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_gamecontroller_h */ #endif /* SDL_gamecontroller_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +25,8 @@
* Include file for SDL gesture event handling. * Include file for SDL gesture event handling.
*/ */
#ifndef _SDL_gesture_h #ifndef SDL_gesture_h_
#define _SDL_gesture_h #define SDL_gesture_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#include "SDL_error.h" #include "SDL_error.h"
@ -82,6 +82,6 @@ extern DECLSPEC int SDLCALL SDL_LoadDollarTemplates(SDL_TouchID touchId, SDL_RWo
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_gesture_h */ #endif /* SDL_gesture_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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
@ -22,12 +22,12 @@
/** /**
* \file SDL_haptic.h * \file SDL_haptic.h
* *
* \brief The SDL Haptic subsystem allows you to control haptic (force feedback) * \brief The SDL haptic subsystem allows you to control haptic (force feedback)
* devices. * devices.
* *
* The basic usage is as follows: * The basic usage is as follows:
* - Initialize the Subsystem (::SDL_INIT_HAPTIC). * - Initialize the subsystem (::SDL_INIT_HAPTIC).
* - Open a Haptic Device. * - Open a haptic device.
* - SDL_HapticOpen() to open from index. * - SDL_HapticOpen() to open from index.
* - SDL_HapticOpenFromJoystick() to open from an existing joystick. * - SDL_HapticOpenFromJoystick() to open from an existing joystick.
* - Create an effect (::SDL_HapticEffect). * - Create an effect (::SDL_HapticEffect).
@ -104,8 +104,8 @@
* \endcode * \endcode
*/ */
#ifndef _SDL_haptic_h #ifndef SDL_haptic_h_
#define _SDL_haptic_h #define SDL_haptic_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#include "SDL_error.h" #include "SDL_error.h"
@ -149,7 +149,7 @@ typedef struct _SDL_Haptic SDL_Haptic;
* *
* \sa SDL_HapticCondition * \sa SDL_HapticCondition
*/ */
#define SDL_HAPTIC_CONSTANT (1<<0) #define SDL_HAPTIC_CONSTANT (1u<<0)
/** /**
* \brief Sine wave effect supported. * \brief Sine wave effect supported.
@ -158,7 +158,7 @@ typedef struct _SDL_Haptic SDL_Haptic;
* *
* \sa SDL_HapticPeriodic * \sa SDL_HapticPeriodic
*/ */
#define SDL_HAPTIC_SINE (1<<1) #define SDL_HAPTIC_SINE (1u<<1)
/** /**
* \brief Left/Right effect supported. * \brief Left/Right effect supported.
@ -169,7 +169,7 @@ typedef struct _SDL_Haptic SDL_Haptic;
* \warning this value was SDL_HAPTIC_SQUARE right before 2.0.0 shipped. Sorry, * \warning this value was SDL_HAPTIC_SQUARE right before 2.0.0 shipped. Sorry,
* we ran out of bits, and this is important for XInput devices. * we ran out of bits, and this is important for XInput devices.
*/ */
#define SDL_HAPTIC_LEFTRIGHT (1<<2) #define SDL_HAPTIC_LEFTRIGHT (1u<<2)
/* !!! FIXME: put this back when we have more bits in 2.1 */ /* !!! FIXME: put this back when we have more bits in 2.1 */
/* #define SDL_HAPTIC_SQUARE (1<<2) */ /* #define SDL_HAPTIC_SQUARE (1<<2) */
@ -181,7 +181,7 @@ typedef struct _SDL_Haptic SDL_Haptic;
* *
* \sa SDL_HapticPeriodic * \sa SDL_HapticPeriodic
*/ */
#define SDL_HAPTIC_TRIANGLE (1<<3) #define SDL_HAPTIC_TRIANGLE (1u<<3)
/** /**
* \brief Sawtoothup wave effect supported. * \brief Sawtoothup wave effect supported.
@ -190,7 +190,7 @@ typedef struct _SDL_Haptic SDL_Haptic;
* *
* \sa SDL_HapticPeriodic * \sa SDL_HapticPeriodic
*/ */
#define SDL_HAPTIC_SAWTOOTHUP (1<<4) #define SDL_HAPTIC_SAWTOOTHUP (1u<<4)
/** /**
* \brief Sawtoothdown wave effect supported. * \brief Sawtoothdown wave effect supported.
@ -199,7 +199,7 @@ typedef struct _SDL_Haptic SDL_Haptic;
* *
* \sa SDL_HapticPeriodic * \sa SDL_HapticPeriodic
*/ */
#define SDL_HAPTIC_SAWTOOTHDOWN (1<<5) #define SDL_HAPTIC_SAWTOOTHDOWN (1u<<5)
/** /**
* \brief Ramp effect supported. * \brief Ramp effect supported.
@ -208,7 +208,7 @@ typedef struct _SDL_Haptic SDL_Haptic;
* *
* \sa SDL_HapticRamp * \sa SDL_HapticRamp
*/ */
#define SDL_HAPTIC_RAMP (1<<6) #define SDL_HAPTIC_RAMP (1u<<6)
/** /**
* \brief Spring effect supported - uses axes position. * \brief Spring effect supported - uses axes position.
@ -218,7 +218,7 @@ typedef struct _SDL_Haptic SDL_Haptic;
* *
* \sa SDL_HapticCondition * \sa SDL_HapticCondition
*/ */
#define SDL_HAPTIC_SPRING (1<<7) #define SDL_HAPTIC_SPRING (1u<<7)
/** /**
* \brief Damper effect supported - uses axes velocity. * \brief Damper effect supported - uses axes velocity.
@ -228,7 +228,7 @@ typedef struct _SDL_Haptic SDL_Haptic;
* *
* \sa SDL_HapticCondition * \sa SDL_HapticCondition
*/ */
#define SDL_HAPTIC_DAMPER (1<<8) #define SDL_HAPTIC_DAMPER (1u<<8)
/** /**
* \brief Inertia effect supported - uses axes acceleration. * \brief Inertia effect supported - uses axes acceleration.
@ -238,7 +238,7 @@ typedef struct _SDL_Haptic SDL_Haptic;
* *
* \sa SDL_HapticCondition * \sa SDL_HapticCondition
*/ */
#define SDL_HAPTIC_INERTIA (1<<9) #define SDL_HAPTIC_INERTIA (1u<<9)
/** /**
* \brief Friction effect supported - uses axes movement. * \brief Friction effect supported - uses axes movement.
@ -248,14 +248,14 @@ typedef struct _SDL_Haptic SDL_Haptic;
* *
* \sa SDL_HapticCondition * \sa SDL_HapticCondition
*/ */
#define SDL_HAPTIC_FRICTION (1<<10) #define SDL_HAPTIC_FRICTION (1u<<10)
/** /**
* \brief Custom effect is supported. * \brief Custom effect is supported.
* *
* User defined custom haptic effect. * User defined custom haptic effect.
*/ */
#define SDL_HAPTIC_CUSTOM (1<<11) #define SDL_HAPTIC_CUSTOM (1u<<11)
/* @} *//* Haptic effects */ /* @} *//* Haptic effects */
@ -268,7 +268,7 @@ typedef struct _SDL_Haptic SDL_Haptic;
* *
* \sa SDL_HapticSetGain * \sa SDL_HapticSetGain
*/ */
#define SDL_HAPTIC_GAIN (1<<12) #define SDL_HAPTIC_GAIN (1u<<12)
/** /**
* \brief Device can set autocenter. * \brief Device can set autocenter.
@ -277,24 +277,26 @@ typedef struct _SDL_Haptic SDL_Haptic;
* *
* \sa SDL_HapticSetAutocenter * \sa SDL_HapticSetAutocenter
*/ */
#define SDL_HAPTIC_AUTOCENTER (1<<13) #define SDL_HAPTIC_AUTOCENTER (1u<<13)
/** /**
* \brief Device can be queried for effect status. * \brief Device can be queried for effect status.
* *
* Device can be queried for effect status. * Device supports querying effect status.
* *
* \sa SDL_HapticGetEffectStatus * \sa SDL_HapticGetEffectStatus
*/ */
#define SDL_HAPTIC_STATUS (1<<14) #define SDL_HAPTIC_STATUS (1u<<14)
/** /**
* \brief Device can be paused. * \brief Device can be paused.
* *
* Devices supports being paused.
*
* \sa SDL_HapticPause * \sa SDL_HapticPause
* \sa SDL_HapticUnpause * \sa SDL_HapticUnpause
*/ */
#define SDL_HAPTIC_PAUSE (1<<15) #define SDL_HAPTIC_PAUSE (1u<<15)
/** /**
@ -444,7 +446,7 @@ typedef struct SDL_HapticDirection
/** /**
* \brief A structure containing a template for a Constant effect. * \brief A structure containing a template for a Constant effect.
* *
* The struct is exclusive to the ::SDL_HAPTIC_CONSTANT effect. * This struct is exclusively for the ::SDL_HAPTIC_CONSTANT effect.
* *
* A constant effect applies a constant force in the specified direction * A constant effect applies a constant force in the specified direction
* to the joystick. * to the joystick.
@ -676,6 +678,8 @@ typedef struct SDL_HapticLeftRight
/** /**
* \brief A structure containing a template for the ::SDL_HAPTIC_CUSTOM effect. * \brief A structure containing a template for the ::SDL_HAPTIC_CUSTOM effect.
* *
* This struct is exclusively for the ::SDL_HAPTIC_CUSTOM effect.
*
* A custom force feedback effect is much like a periodic effect, where the * A custom force feedback effect is much like a periodic effect, where the
* application can define its exact shape. You will have to allocate the * application can define its exact shape. You will have to allocate the
* data yourself. Data should consist of channels * samples Uint16 samples. * data yourself. Data should consist of channels * samples Uint16 samples.
@ -804,7 +808,7 @@ typedef union SDL_HapticEffect
extern DECLSPEC int SDLCALL SDL_NumHaptics(void); extern DECLSPEC int SDLCALL SDL_NumHaptics(void);
/** /**
* \brief Get the implementation dependent name of a Haptic device. * \brief 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 found, this function returns NULL. * If no name can be found, this function returns NULL.
@ -817,9 +821,9 @@ extern DECLSPEC int SDLCALL SDL_NumHaptics(void);
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 usage. * \brief Opens 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
@ -885,15 +889,15 @@ extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromMouse(void);
* \brief Checks to see if a joystick has haptic features. * \brief Checks to see if a joystick has haptic features.
* *
* \param joystick Joystick to test for haptic capabilities. * \param joystick Joystick to test for haptic capabilities.
* \return 1 if the joystick is haptic, 0 if it isn't * \return SDL_TRUE if the joystick is haptic, SDL_FALSE if it isn't
* or -1 if an error ocurred. * or -1 if an error occurred.
* *
* \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 usage from a Joystick device. * \brief Opens 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.
@ -913,7 +917,7 @@ extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromJoystick(SDL_Joystick *
joystick); joystick);
/** /**
* \brief Closes a Haptic device previously opened with SDL_HapticOpen(). * \brief Closes a haptic device previously opened with SDL_HapticOpen().
* *
* \param haptic Haptic device to close. * \param haptic Haptic device to close.
*/ */
@ -957,7 +961,7 @@ extern DECLSPEC int SDLCALL SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic);
* Example: * Example:
* \code * \code
* if (SDL_HapticQuery(haptic) & SDL_HAPTIC_CONSTANT) { * if (SDL_HapticQuery(haptic) & SDL_HAPTIC_CONSTANT) {
* printf("We have constant haptic effect!"); * printf("We have constant haptic effect!\n");
* } * }
* \endcode * \endcode
* *
@ -996,7 +1000,7 @@ extern DECLSPEC int SDLCALL SDL_HapticEffectSupported(SDL_Haptic * haptic,
* *
* \param haptic Haptic device to create the effect on. * \param haptic Haptic device to create the effect on.
* \param effect Properties of the effect to create. * \param effect Properties of the effect to create.
* \return The id of the effect on success or -1 on error. * \return The identifier of the effect on success or -1 on error.
* *
* \sa SDL_HapticUpdateEffect * \sa SDL_HapticUpdateEffect
* \sa SDL_HapticRunEffect * \sa SDL_HapticRunEffect
@ -1008,13 +1012,13 @@ extern DECLSPEC int SDLCALL SDL_HapticNewEffect(SDL_Haptic * haptic,
/** /**
* \brief Updates the properties of an effect. * \brief Updates the properties of an effect.
* *
* Can be used dynamically, although behaviour 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 reupload itself
* and start playing from the start. You cannot change the type either when * and start playing from the start. You cannot change the type either when
* running SDL_HapticUpdateEffect(). * running SDL_HapticUpdateEffect().
* *
* \param haptic Haptic device that has the effect. * \param haptic Haptic device that has the effect.
* \param effect Effect to update. * \param effect Identifier of the effect to update.
* \param data New effect properties to use. * \param data New effect properties to use.
* \return 0 on success or -1 on error. * \return 0 on success or -1 on error.
* *
@ -1218,6 +1222,6 @@ extern DECLSPEC int SDLCALL SDL_HapticRumbleStop(SDL_Haptic * haptic);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_haptic_h */ #endif /* SDL_haptic_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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
@ -36,8 +36,8 @@
* to how they would like the library to work. * to how they would like the library to work.
*/ */
#ifndef _SDL_hints_h #ifndef SDL_hints_h_
#define _SDL_hints_h #define SDL_hints_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
@ -118,6 +118,17 @@ extern "C" {
*/ */
#define SDL_HINT_RENDER_DIRECT3D11_DEBUG "SDL_RENDER_DIRECT3D11_DEBUG" #define SDL_HINT_RENDER_DIRECT3D11_DEBUG "SDL_RENDER_DIRECT3D11_DEBUG"
/**
* \brief A variable controlling the scaling policy for SDL_RenderSetLogicalSize.
*
* This variable can be set to the following values:
* "0" or "letterbox" - Uses letterbox/sidebars to fit the entire rendering on screen
* "1" or "overscan" - Will zoom the rendering so it fills the entire screen, allowing edges to be drawn offscreen
*
* By default letterbox is used
*/
#define SDL_HINT_RENDER_LOGICAL_SIZE_MODE "SDL_RENDER_LOGICAL_SIZE_MODE"
/** /**
* \brief A variable controlling the scaling quality * \brief A variable controlling the scaling quality
* *
@ -210,6 +221,12 @@ extern "C" {
*/ */
#define SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN "SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN" #define SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN "SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN"
/**
* \brief A variable to specify custom icon resource id from RC file on Windows platform
*/
#define SDL_HINT_WINDOWS_INTRESOURCE_ICON "SDL_WINDOWS_INTRESOURCE_ICON"
#define SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL "SDL_WINDOWS_INTRESOURCE_ICON_SMALL"
/** /**
* \brief A variable controlling whether the windows message loop is processed by SDL * \brief A variable controlling whether the windows message loop is processed by SDL
* *
@ -233,16 +250,48 @@ extern "C" {
#define SDL_HINT_GRAB_KEYBOARD "SDL_GRAB_KEYBOARD" #define SDL_HINT_GRAB_KEYBOARD "SDL_GRAB_KEYBOARD"
/** /**
* \brief A variable controlling whether relative mouse mode is implemented using mouse warping * \brief A variable setting the speed scale for mouse motion, in floating point, when the mouse is not in relative mode
* */
* This variable can be set to the following values: #define SDL_HINT_MOUSE_NORMAL_SPEED_SCALE "SDL_MOUSE_NORMAL_SPEED_SCALE"
* "0" - Relative mouse mode uses raw input
* "1" - Relative mouse mode uses mouse warping /**
* * \brief A variable setting the scale for mouse motion, in floating point, when the mouse is in relative mode
* By default SDL will use raw input for relative mouse mode */
*/ #define SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE "SDL_MOUSE_RELATIVE_SPEED_SCALE"
/**
* \brief A variable controlling whether relative mouse mode is implemented using mouse warping
*
* This variable can be set to the following values:
* "0" - Relative mouse mode uses raw input
* "1" - Relative mouse mode uses mouse warping
*
* By default SDL will use raw input for relative mouse mode
*/
#define SDL_HINT_MOUSE_RELATIVE_MODE_WARP "SDL_MOUSE_RELATIVE_MODE_WARP" #define SDL_HINT_MOUSE_RELATIVE_MODE_WARP "SDL_MOUSE_RELATIVE_MODE_WARP"
/**
* \brief Allow mouse click events when clicking to focus an SDL window
*
* This variable can be set to the following values:
* "0" - Ignore mouse clicks that activate a window
* "1" - Generate events for mouse clicks that activate a window
*
* By default SDL will ignore mouse clicks that activate a window
*/
#define SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH "SDL_MOUSE_FOCUS_CLICKTHROUGH"
/**
* \brief A variable controlling whether touch events should generate synthetic mouse events
*
* This variable can be set to the following values:
* "0" - Touch events will not generate mouse events
* "1" - Touch events will generate mouse events
*
* By default SDL will generate mouse events for touch events
*/
#define SDL_HINT_TOUCH_MOUSE_EVENTS "SDL_TOUCH_MOUSE_EVENTS"
/** /**
* \brief Minimize your SDL_Window if it loses key focus when in fullscreen mode. Defaults to true. * \brief Minimize your SDL_Window if it loses key focus when in fullscreen mode. Defaults to true.
* *
@ -257,8 +306,8 @@ extern "C" {
* this is problematic. This functionality can be disabled by setting this * this is problematic. This functionality can be disabled by setting this
* hint. * hint.
* *
* As of SDL 2.0.4, SDL_EnableScreenSaver and SDL_DisableScreenSaver accomplish * As of SDL 2.0.4, SDL_EnableScreenSaver() and SDL_DisableScreenSaver()
* the same thing on iOS. They should be preferred over this hint. * accomplish the same thing on iOS. They should be preferred over this hint.
* *
* This variable can be set to the following values: * This variable can be set to the following values:
* "0" - Enable idle timer * "0" - Enable idle timer
@ -276,7 +325,35 @@ extern "C" {
* "LandscapeLeft", "LandscapeRight", "Portrait" "PortraitUpsideDown" * "LandscapeLeft", "LandscapeRight", "Portrait" "PortraitUpsideDown"
*/ */
#define SDL_HINT_ORIENTATIONS "SDL_IOS_ORIENTATIONS" #define SDL_HINT_ORIENTATIONS "SDL_IOS_ORIENTATIONS"
/**
* \brief A variable controlling whether controllers used with the Apple TV
* generate UI events.
*
* When UI events are generated by controller input, the app will be
* backgrounded when the Apple TV remote's menu button is pressed, and when the
* pause or B buttons on gamepads are pressed.
*
* More information about properly making use of controllers for the Apple TV
* can be found here:
* https://developer.apple.com/tvos/human-interface-guidelines/remote-and-controllers/
*
* This variable can be set to the following values:
* "0" - Controller input does not generate UI events (the default).
* "1" - Controller input generates UI events.
*/
#define SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS "SDL_APPLE_TV_CONTROLLER_UI_EVENTS"
/**
* \brief A variable controlling whether the Apple TV remote's joystick axes
* will automatically match the rotation of the remote.
*
* This variable can be set to the following values:
* "0" - Remote orientation does not affect joystick axes (the default).
* "1" - Joystick axes are based on the orientation of the remote.
*/
#define SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION "SDL_APPLE_TV_REMOTE_ALLOW_ROTATION"
/** /**
* \brief A variable controlling whether the Android / iOS built-in * \brief A variable controlling whether the Android / iOS built-in
* accelerometer should be listed as a joystick device, rather than listing * accelerometer should be listed as a joystick device, rather than listing
@ -288,7 +365,6 @@ extern "C" {
*/ */
#define SDL_HINT_ACCELEROMETER_AS_JOYSTICK "SDL_ACCELEROMETER_AS_JOYSTICK" #define SDL_HINT_ACCELEROMETER_AS_JOYSTICK "SDL_ACCELEROMETER_AS_JOYSTICK"
/** /**
* \brief A variable that lets you disable the detection and use of Xinput gamepad devices * \brief A variable that lets you disable the detection and use of Xinput gamepad devices
* *
@ -298,7 +374,6 @@ extern "C" {
*/ */
#define SDL_HINT_XINPUT_ENABLED "SDL_XINPUT_ENABLED" #define SDL_HINT_XINPUT_ENABLED "SDL_XINPUT_ENABLED"
/** /**
* \brief A variable that causes SDL to use the old axis and button mapping for XInput devices. * \brief A variable that causes SDL to use the old axis and button mapping for XInput devices.
* *
@ -308,9 +383,8 @@ extern "C" {
*/ */
#define SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING "SDL_XINPUT_USE_OLD_JOYSTICK_MAPPING" #define SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING "SDL_XINPUT_USE_OLD_JOYSTICK_MAPPING"
/** /**
* \brief A variable that lets you manually hint extra gamecontroller db entries * \brief A variable that lets you manually hint extra gamecontroller db entries.
* *
* The variable should be newline delimited rows of gamecontroller config data, see SDL_gamecontroller.h * The variable should be newline delimited rows of gamecontroller config data, see SDL_gamecontroller.h
* *
@ -319,6 +393,31 @@ extern "C" {
*/ */
#define SDL_HINT_GAMECONTROLLERCONFIG "SDL_GAMECONTROLLERCONFIG" #define SDL_HINT_GAMECONTROLLERCONFIG "SDL_GAMECONTROLLERCONFIG"
/**
* \brief A variable containing a list of devices to skip when scanning for game controllers.
*
* The format of the string is a comma separated list of USB VID/PID pairs
* in hexadecimal form, e.g.
*
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
*
* The variable can also take the form of @file, in which case the named
* file will be loaded and interpreted as the value of the variable.
*/
#define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES "SDL_GAMECONTROLLER_IGNORE_DEVICES"
/**
* \brief If set, all devices will be skipped when scanning for game controllers except for the ones listed in this variable.
*
* The format of the string is a comma separated list of USB VID/PID pairs
* in hexadecimal form, e.g.
*
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
*
* The variable can also take the form of @file, in which case the named
* file will be loaded and interpreted as the value of the variable.
*/
#define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT "SDL_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT"
/** /**
* \brief A variable that lets you enable joystick (and gamecontroller) events even when your app is in the background. * \brief A variable that lets you enable joystick (and gamecontroller) events even when your app is in the background.
@ -333,7 +432,6 @@ extern "C" {
*/ */
#define SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS" #define SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS"
/** /**
* \brief If set to "0" then never set the top most bit on a SDL Window, even if the video mode expects it. * \brief If set to "0" then never set the top most bit on a SDL Window, even if the video mode expects it.
* This is a debugging aid for developers and not expected to be used by end users. The default is "1" * This is a debugging aid for developers and not expected to be used by end users. The default is "1"
@ -344,7 +442,6 @@ extern "C" {
*/ */
#define SDL_HINT_ALLOW_TOPMOST "SDL_ALLOW_TOPMOST" #define SDL_HINT_ALLOW_TOPMOST "SDL_ALLOW_TOPMOST"
/** /**
* \brief A variable that controls the timer resolution, in milliseconds. * \brief A variable that controls the timer resolution, in milliseconds.
* *
@ -362,6 +459,33 @@ extern "C" {
#define SDL_HINT_TIMER_RESOLUTION "SDL_TIMER_RESOLUTION" #define SDL_HINT_TIMER_RESOLUTION "SDL_TIMER_RESOLUTION"
/**
* \brief A variable describing the content orientation on QtWayland-based platforms.
*
* On QtWayland platforms, windows are rotated client-side to allow for custom
* transitions. In order to correctly position overlays (e.g. volume bar) and
* gestures (e.g. events view, close/minimize gestures), the system needs to
* know in which orientation the application is currently drawing its contents.
*
* This does not cause the window to be rotated or resized, the application
* needs to take care of drawing the content in the right orientation (the
* framebuffer is always in portrait mode).
*
* This variable can be one of the following values:
* "primary" (default), "portrait", "landscape", "inverted-portrait", "inverted-landscape"
*/
#define SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION "SDL_QTWAYLAND_CONTENT_ORIENTATION"
/**
* \brief Flags to set on QtWayland windows to integrate with the native window manager.
*
* On QtWayland platforms, this hint controls the flags to set on the windows.
* For example, on Sailfish OS "OverridesSystemGestures" disables swipe gestures.
*
* This variable is a space-separated list of the following values (empty = no flags):
* "OverridesSystemGestures", "StaysOnTop", "BypassWindowManager"
*/
#define SDL_HINT_QTWAYLAND_WINDOW_FLAGS "SDL_QTWAYLAND_WINDOW_FLAGS"
/** /**
* \brief A string specifying SDL's threads stack size in bytes or "0" for the backend's default size * \brief A string specifying SDL's threads stack size in bytes or "0" for the backend's default size
@ -369,7 +493,7 @@ extern "C" {
* Use this hint in case you need to set SDL's threads stack size to other than the default. * Use this hint in case you need to set SDL's threads stack size to other than the default.
* This is specially useful if you build SDL against a non glibc libc library (such as musl) which * This is specially useful if you build SDL against a non glibc libc library (such as musl) which
* provides a relatively small default thread stack size (a few kilobytes versus the default 8MB glibc uses). * provides a relatively small default thread stack size (a few kilobytes versus the default 8MB glibc uses).
* Support for this hint is currently available only in the pthread backend. * Support for this hint is currently available only in the pthread, Windows, and PSP backend.
*/ */
#define SDL_HINT_THREAD_STACK_SIZE "SDL_THREAD_STACK_SIZE" #define SDL_HINT_THREAD_STACK_SIZE "SDL_THREAD_STACK_SIZE"
@ -431,7 +555,7 @@ extern "C" {
* privacy policy. * privacy policy.
* *
* To setup a URL to an app's privacy policy, set SDL_HINT_WINRT_PRIVACY_POLICY_URL * To setup a URL to an app's privacy policy, set SDL_HINT_WINRT_PRIVACY_POLICY_URL
* before calling any SDL_Init functions. The contents of the hint should * before calling any SDL_Init() functions. The contents of the hint should
* be a valid URL. For example, "http://www.example.com". * be a valid URL. For example, "http://www.example.com".
* *
* The default value is "", which will prevent SDL from adding a privacy policy * The default value is "", which will prevent SDL from adding a privacy policy
@ -461,7 +585,7 @@ extern "C" {
* The contents of this hint should be encoded as a UTF8 string. * The contents of this hint should be encoded as a UTF8 string.
* *
* The default value is "Privacy Policy". This hint should only be set during app * The default value is "Privacy Policy". This hint should only be set during app
* initialization, preferably before any calls to SDL_Init. * initialization, preferably before any calls to SDL_Init().
* *
* For additional information on linking to a privacy policy, see the documentation for * For additional information on linking to a privacy policy, see the documentation for
* SDL_HINT_WINRT_PRIVACY_POLICY_URL. * SDL_HINT_WINRT_PRIVACY_POLICY_URL.
@ -630,6 +754,119 @@ extern "C" {
*/ */
#define SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4 "SDL_WINDOWS_NO_CLOSE_ON_ALT_F4" #define SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4 "SDL_WINDOWS_NO_CLOSE_ON_ALT_F4"
/**
* \brief Prevent SDL from using version 4 of the bitmap header when saving BMPs.
*
* The bitmap header version 4 is required for proper alpha channel support and
* SDL will use it when required. Should this not be desired, this hint can
* force the use of the 40 byte header version which is supported everywhere.
*
* The variable can be set to the following values:
* "0" - Surfaces with a colorkey or an alpha channel are saved to a
* 32-bit BMP file with an alpha mask. SDL will use the bitmap
* header version 4 and set the alpha mask accordingly.
* "1" - Surfaces with a colorkey or an alpha channel are saved to a
* 32-bit BMP file without an alpha mask. The alpha channel data
* will be in the file, but applications are going to ignore it.
*
* The default value is "0".
*/
#define SDL_HINT_BMP_SAVE_LEGACY_FORMAT "SDL_BMP_SAVE_LEGACY_FORMAT"
/**
* \brief Tell SDL not to name threads on Windows with the 0x406D1388 Exception.
* The 0x406D1388 Exception is a trick used to inform Visual Studio of a
* thread's name, but it tends to cause problems with other debuggers,
* and the .NET runtime. Note that SDL 2.0.6 and later will still use
* the (safer) SetThreadDescription API, introduced in the Windows 10
* Creators Update, if available.
*
* The variable can be set to the following values:
* "0" - SDL will raise the 0x406D1388 Exception to name threads.
* This is the default behavior of SDL <= 2.0.4.
* "1" - SDL will not raise this exception, and threads will be unnamed. (default)
* This is necessary with .NET languages or debuggers that aren't Visual Studio.
*/
#define SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING "SDL_WINDOWS_DISABLE_THREAD_NAMING"
/**
* \brief Tell SDL which Dispmanx layer to use on a Raspberry PI
*
* Also known as Z-order. The variable can take a negative or positive value.
* The default is 10000.
*/
#define SDL_HINT_RPI_VIDEO_LAYER "SDL_RPI_VIDEO_LAYER"
/**
* \brief A variable controlling what driver to use for OpenGL ES contexts.
*
* On some platforms, currently Windows and X11, OpenGL drivers may support
* creating contexts with an OpenGL ES profile. By default SDL uses these
* profiles, when available, otherwise it attempts to load an OpenGL ES
* library, e.g. that provided by the ANGLE project. This variable controls
* whether SDL follows this default behaviour or will always load an
* OpenGL ES library.
*
* Circumstances where this is useful include
* - Testing an app with a particular OpenGL ES implementation, e.g ANGLE,
* or emulator, e.g. those from ARM, Imagination or Qualcomm.
* - Resolving OpenGL ES function addresses at link time by linking with
* the OpenGL ES library instead of querying them at run time with
* SDL_GL_GetProcAddress().
*
* Caution: for an application to work with the default behaviour across
* different OpenGL drivers it must query the OpenGL ES function
* addresses at run time using SDL_GL_GetProcAddress().
*
* This variable is ignored on most platforms because OpenGL ES is native
* or not supported.
*
* This variable can be set to the following values:
* "0" - Use ES profile of OpenGL, if available. (Default when not set.)
* "1" - Load OpenGL ES library using the default library names.
*
*/
#define SDL_HINT_OPENGL_ES_DRIVER "SDL_OPENGL_ES_DRIVER"
/**
* \brief A variable controlling speed/quality tradeoff of audio resampling.
*
* If available, SDL can use libsamplerate ( http://www.mega-nerd.com/SRC/ )
* to handle audio resampling. There are different resampling modes available
* that produce different levels of quality, using more CPU.
*
* If this hint isn't specified to a valid setting, or libsamplerate isn't
* available, SDL will use the default, internal resampling algorithm.
*
* Note that this is currently only applicable to resampling audio that is
* being written to a device for playback or audio being read from a device
* for capture. SDL_AudioCVT always uses the default resampler (although this
* might change for SDL 2.1).
*
* This hint is currently only checked at audio subsystem initialization.
*
* This variable can be set to the following values:
*
* "0" or "default" - Use SDL's internal resampling (Default when not set - low quality, fast)
* "1" or "fast" - Use fast, slightly higher quality resampling, if available
* "2" or "medium" - Use medium quality resampling, if available
* "3" or "best" - Use high quality resampling, if available
*/
#define SDL_HINT_AUDIO_RESAMPLING_MODE "SDL_AUDIO_RESAMPLING_MODE"
/**
* \brief A variable controlling the audio category on iOS and Mac OS X
*
* This variable can be set to the following values:
*
* "ambient" - Use the AVAudioSessionCategoryAmbient audio category, will be muted by the phone mute switch (default)
* "playback" - Use the AVAudioSessionCategoryPlayback category
*
* For more information, see Apple's documentation:
* https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategoriesandModes/AudioSessionCategoriesandModes.html
*/
#define SDL_HINT_AUDIO_CATEGORY "SDL_AUDIO_CATEGORY"
/** /**
* \brief An enumeration of hint priorities * \brief An enumeration of hint priorities
*/ */
@ -669,6 +906,18 @@ extern DECLSPEC SDL_bool SDLCALL SDL_SetHint(const char *name,
*/ */
extern DECLSPEC const char * SDLCALL SDL_GetHint(const char *name); extern DECLSPEC const char * SDLCALL SDL_GetHint(const char *name);
/**
* \brief Get a hint
*
* \return The boolean value of a hint variable.
*/
extern DECLSPEC SDL_bool SDLCALL SDL_GetHintBoolean(const char *name, SDL_bool default_value);
/**
* \brief type definition of the hint callback function.
*/
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 * \brief Add a function to watch a particular hint
* *
@ -676,7 +925,6 @@ extern DECLSPEC const char * SDLCALL SDL_GetHint(const char *name);
* \param callback The function to call when the hint value changes * \param callback The function to call when the hint value changes
* \param userdata A pointer to pass to the callback function * \param userdata A pointer to pass to the callback function
*/ */
typedef void (*SDL_HintCallback)(void *userdata, const char *name, const char *oldValue, const char *newValue);
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);
@ -706,6 +954,6 @@ extern DECLSPEC void SDLCALL SDL_ClearHints(void);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_hints_h */ #endif /* SDL_hints_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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
@ -24,7 +24,7 @@
* *
* Include file for SDL joystick event handling * Include file for SDL joystick event handling
* *
* The term "device_index" identifies currently plugged in joystick devices between 0 and SDL_NumJoysticks, with the exact joystick * The term "device_index" identifies currently plugged in joystick devices between 0 and SDL_NumJoysticks(), with the exact joystick
* behind a device_index changing as joysticks are plugged and unplugged. * behind a device_index changing as joysticks are plugged and unplugged.
* *
* 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
@ -36,8 +36,8 @@
* *
*/ */
#ifndef _SDL_joystick_h #ifndef SDL_joystick_h_
#define _SDL_joystick_h #define SDL_joystick_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#include "SDL_error.h" #include "SDL_error.h"
@ -60,7 +60,9 @@ extern "C" {
* SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS
*/ */
/* The joystick structure used to identify an SDL joystick */ /**
* The joystick structure used to identify an SDL joystick
*/
struct _SDL_Joystick; struct _SDL_Joystick;
typedef struct _SDL_Joystick SDL_Joystick; typedef struct _SDL_Joystick SDL_Joystick;
@ -69,8 +71,29 @@ typedef struct {
Uint8 data[16]; Uint8 data[16];
} SDL_JoystickGUID; } SDL_JoystickGUID;
/**
* This is a unique ID for a joystick for the time it is connected to the system,
* and is never reused for the lifetime of the application. If the joystick is
* disconnected and reconnected, it will get a new ID.
*
* The ID value starts at 0 and increments from there. The value -1 is an invalid ID.
*/
typedef Sint32 SDL_JoystickID; typedef Sint32 SDL_JoystickID;
typedef enum
{
SDL_JOYSTICK_TYPE_UNKNOWN,
SDL_JOYSTICK_TYPE_GAMECONTROLLER,
SDL_JOYSTICK_TYPE_WHEEL,
SDL_JOYSTICK_TYPE_ARCADE_STICK,
SDL_JOYSTICK_TYPE_FLIGHT_STICK,
SDL_JOYSTICK_TYPE_DANCE_PAD,
SDL_JOYSTICK_TYPE_GUITAR,
SDL_JOYSTICK_TYPE_DRUM_KIT,
SDL_JOYSTICK_TYPE_ARCADE_PAD,
SDL_JOYSTICK_TYPE_THROTTLE
} SDL_JoystickType;
typedef enum typedef enum
{ {
SDL_JOYSTICK_POWER_UNKNOWN = -1, SDL_JOYSTICK_POWER_UNKNOWN = -1,
@ -83,6 +106,20 @@ typedef enum
} SDL_JoystickPowerLevel; } SDL_JoystickPowerLevel;
/* Function prototypes */ /* Function prototypes */
/**
* Locking 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_LockJoysticks(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 right now
*/ */
@ -95,6 +132,46 @@ extern DECLSPEC int SDLCALL SDL_NumJoysticks(void);
*/ */
extern DECLSPEC const char *SDLCALL SDL_JoystickNameForIndex(int device_index); extern DECLSPEC const char *SDLCALL SDL_JoystickNameForIndex(int device_index);
/**
* Return the GUID for the joystick at this index
* This can be called before any joysticks are opened.
*/
extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetDeviceGUID(int device_index);
/**
* Get the USB vendor ID of a joystick, if available.
* This can be called before any joysticks are opened.
* If the vendor ID isn't available this function returns 0.
*/
extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceVendor(int device_index);
/**
* Get the USB product ID of a joystick, if available.
* This can be called before any joysticks are opened.
* If the product ID isn't available this function returns 0.
*/
extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceProduct(int device_index);
/**
* Get the product version of a joystick, if available.
* This can be called before any joysticks are opened.
* If the product version isn't available this function returns 0.
*/
extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceProductVersion(int device_index);
/**
* Get the type of a joystick, if available.
* This can be called before any joysticks are opened.
*/
extern DECLSPEC SDL_JoystickType SDLCALL SDL_JoystickGetDeviceType(int device_index);
/**
* Get the instance ID of a joystick.
* This can be called before any joysticks are opened.
* If the index is out of range, this function will return -1.
*/
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. * The index passed as an argument refers to the N'th joystick on the system.
@ -117,16 +194,34 @@ extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickFromInstanceID(SDL_JoystickID
*/ */
extern DECLSPEC const char *SDLCALL SDL_JoystickName(SDL_Joystick * joystick); extern DECLSPEC const char *SDLCALL SDL_JoystickName(SDL_Joystick * joystick);
/**
* Return the GUID for the joystick at this index
*/
extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetDeviceGUID(int device_index);
/** /**
* Return the GUID for this opened joystick * Return the GUID for this opened joystick
*/ */
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.
* If the vendor ID isn't available this function returns 0.
*/
extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetVendor(SDL_Joystick * joystick);
/**
* Get the USB product ID of an opened joystick, if available.
* If the product ID isn't available this function returns 0.
*/
extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetProduct(SDL_Joystick * joystick);
/**
* Get the product version of an opened joystick, if available.
* If the product version isn't available this function returns 0.
*/
extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetProductVersion(SDL_Joystick * joystick);
/**
* Get the type of an opened 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 * Return a string representation for this guid. pszGUID must point to at least 33 bytes
* (32 for the string plus a NULL terminator). * (32 for the string plus a NULL terminator).
@ -134,7 +229,7 @@ extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUID(SDL_Joystick * joys
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 formatted guid * Convert a string into a joystick guid
*/ */
extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUIDFromString(const char *pchGUID); extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUIDFromString(const char *pchGUID);
@ -190,6 +285,8 @@ extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void);
*/ */
extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state); extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state);
#define SDL_JOYSTICK_AXIS_MAX 32767
#define SDL_JOYSTICK_AXIS_MIN -32768
/** /**
* Get the current state of an axis control on a joystick. * Get the current state of an axis control on a joystick.
* *
@ -200,6 +297,18 @@ extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state);
extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick * joystick, extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick * joystick,
int axis); int axis);
/**
* Get the initial state of an axis control on a joystick.
*
* The state is a value ranging from -32768 to 32767.
*
* The axis indices start at index 0.
*
* \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,
int axis, Sint16 *state);
/** /**
* \name Hat positions * \name Hat positions
*/ */
@ -268,6 +377,6 @@ extern DECLSPEC SDL_JoystickPowerLevel SDLCALL SDL_JoystickCurrentPowerLevel(SDL
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_joystick_h */ #endif /* SDL_joystick_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +25,8 @@
* Include file for SDL keyboard event handling * Include file for SDL keyboard event handling
*/ */
#ifndef _SDL_keyboard_h #ifndef SDL_keyboard_h_
#define _SDL_keyboard_h #define SDL_keyboard_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#include "SDL_error.h" #include "SDL_error.h"
@ -136,7 +136,7 @@ extern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromName(const char *name);
* copy it. If the key doesn't have a name, this function returns an * copy it. If the key doesn't have a name, this function returns an
* empty string (""). * empty string ("").
* *
* \sa SDL_Key * \sa SDL_Keycode
*/ */
extern DECLSPEC const char *SDLCALL SDL_GetKeyName(SDL_Keycode key); extern DECLSPEC const char *SDLCALL SDL_GetKeyName(SDL_Keycode key);
@ -212,6 +212,6 @@ extern DECLSPEC SDL_bool SDLCALL SDL_IsScreenKeyboardShown(SDL_Window *window);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_keyboard_h */ #endif /* SDL_keyboard_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +25,8 @@
* Defines constants which identify keyboard keys and modifiers. * Defines constants which identify keyboard keys and modifiers.
*/ */
#ifndef _SDL_keycode_h #ifndef SDL_keycode_h_
#define _SDL_keycode_h #define SDL_keycode_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#include "SDL_scancode.h" #include "SDL_scancode.h"
@ -38,6 +38,9 @@
* layout of the keyboard. These values include Unicode values representing * layout of the keyboard. These values include Unicode values representing
* the unmodified character that would be generated by pressing the key, or * the unmodified character that would be generated by pressing the key, or
* an SDLK_* constant for those keys that do not generate characters. * an SDLK_* constant for those keys that do not generate characters.
*
* A special exception is the number keys at the top of the keyboard which
* always map to SDLK_0...SDLK_9, regardless of layout.
*/ */
typedef Sint32 SDL_Keycode; typedef Sint32 SDL_Keycode;
@ -308,7 +311,12 @@ enum
SDLK_KBDILLUMDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMDOWN), SDLK_KBDILLUMDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMDOWN),
SDLK_KBDILLUMUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMUP), SDLK_KBDILLUMUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMUP),
SDLK_EJECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EJECT), SDLK_EJECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EJECT),
SDLK_SLEEP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP) SDLK_SLEEP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP),
SDLK_APP1 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APP1),
SDLK_APP2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APP2),
SDLK_AUDIOREWIND = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOREWIND),
SDLK_AUDIOFASTFORWARD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOFASTFORWARD)
}; };
/** /**
@ -336,6 +344,6 @@ typedef enum
#define KMOD_ALT (KMOD_LALT|KMOD_RALT) #define KMOD_ALT (KMOD_LALT|KMOD_RALT)
#define KMOD_GUI (KMOD_LGUI|KMOD_RGUI) #define KMOD_GUI (KMOD_LGUI|KMOD_RGUI)
#endif /* _SDL_keycode_h */ #endif /* SDL_keycode_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +38,8 @@
* the results you expect. :) * the results you expect. :)
*/ */
#ifndef _SDL_loadso_h #ifndef SDL_loadso_h_
#define _SDL_loadso_h #define SDL_loadso_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#include "SDL_error.h" #include "SDL_error.h"
@ -76,6 +76,6 @@ extern DECLSPEC void SDLCALL SDL_UnloadObject(void *handle);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_loadso_h */ #endif /* SDL_loadso_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +34,8 @@
* Others: standard error output (stderr) * Others: standard error output (stderr)
*/ */
#ifndef _SDL_log_h #ifndef SDL_log_h_
#define _SDL_log_h #define SDL_log_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
@ -186,7 +186,7 @@ extern DECLSPEC void SDLCALL SDL_LogMessageV(int category,
/** /**
* \brief The prototype for the log output function * \brief The prototype for the log output function
*/ */
typedef void (*SDL_LogOutputFunction)(void *userdata, int category, SDL_LogPriority priority, const char *message); typedef void (SDLCALL *SDL_LogOutputFunction)(void *userdata, int category, SDL_LogPriority priority, const char *message);
/** /**
* \brief Get the current log output function. * \brief Get the current log output function.
@ -206,6 +206,6 @@ extern DECLSPEC void SDLCALL SDL_LogSetOutputFunction(SDL_LogOutputFunction call
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_log_h */ #endif /* SDL_log_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +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.
*/ */
#ifndef _SDL_main_h #ifndef SDL_main_h_
#define _SDL_main_h #define SDL_main_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
@ -63,7 +63,7 @@
/* On Android SDL provides a Java class in SDLActivity.java that is the /* On Android SDL provides a Java class in SDLActivity.java that is the
main activity entry point. main activity entry point.
See README-android.txt for more details on extending that class. See README-android.md for more details on extending that class.
*/ */
#define SDL_MAIN_NEEDED #define SDL_MAIN_NEEDED
@ -107,7 +107,7 @@
/** /**
* The prototype for the application's main() function * The prototype for the application's main() function
*/ */
extern C_LINKAGE int SDL_main(int argc, char *argv[]); extern C_LINKAGE DECLSPEC int SDL_main(int argc, char *argv[]);
#include "begin_code.h" #include "begin_code.h"
@ -156,6 +156,6 @@ extern DECLSPEC int SDLCALL SDL_WinRTRunApp(int (*mainFunction)(int, char **), v
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_main_h */ #endif /* SDL_main_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +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.
*/ */
#ifndef _SDL_messagebox_h #ifndef SDL_messagebox_h_
#define _SDL_messagebox_h #define SDL_messagebox_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#include "SDL_video.h" /* For SDL_Window */ #include "SDL_video.h" /* For SDL_Window */
@ -139,6 +139,6 @@ extern DECLSPEC int SDLCALL SDL_ShowSimpleMessageBox(Uint32 flags, const char *t
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_messagebox_h */ #endif /* SDL_messagebox_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +25,8 @@
* Include file for SDL mouse event handling. * Include file for SDL mouse event handling.
*/ */
#ifndef _SDL_mouse_h #ifndef SDL_mouse_h_
#define _SDL_mouse_h #define SDL_mouse_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#include "SDL_error.h" #include "SDL_error.h"
@ -38,10 +38,10 @@
extern "C" { extern "C" {
#endif #endif
typedef struct SDL_Cursor SDL_Cursor; /* Implementation dependent */ typedef struct SDL_Cursor SDL_Cursor; /**< Implementation dependent */
/** /**
* \brief Cursor types for SDL_CreateSystemCursor. * \brief Cursor types for SDL_CreateSystemCursor().
*/ */
typedef enum typedef enum
{ {
@ -254,9 +254,11 @@ extern DECLSPEC SDL_Cursor *SDLCALL SDL_GetCursor(void);
extern DECLSPEC SDL_Cursor *SDLCALL SDL_GetDefaultCursor(void); extern DECLSPEC SDL_Cursor *SDLCALL SDL_GetDefaultCursor(void);
/** /**
* \brief Frees a cursor created with SDL_CreateCursor(). * \brief Frees a cursor created with SDL_CreateCursor() or similar functions.
* *
* \sa SDL_CreateCursor() * \sa SDL_CreateCursor()
* \sa SDL_CreateColorCursor()
* \sa SDL_CreateSystemCursor()
*/ */
extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor * cursor); extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor * cursor);
@ -295,6 +297,6 @@ extern DECLSPEC int SDLCALL SDL_ShowCursor(int toggle);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_mouse_h */ #endif /* SDL_mouse_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +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.
*/ */
#ifndef _SDL_mutex_h #ifndef SDL_mutex_h_
#define _SDL_mutex_h #define SDL_mutex_h_
/** /**
* \file SDL_mutex.h * \file SDL_mutex.h
@ -246,6 +246,6 @@ extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond * cond,
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_mutex_h */ #endif /* SDL_mutex_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +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.
*/ */
#ifndef _SDLname_h_ #ifndef SDLname_h_
#define _SDLname_h_ #define SDLname_h_
#if defined(__STDC__) || defined(__cplusplus) #if defined(__STDC__) || defined(__cplusplus)
#define NeedFunctionPrototypes 1 #define NeedFunctionPrototypes 1
@ -28,6 +28,6 @@
#define SDL_NAME(X) SDL_##X #define SDL_NAME(X) SDL_##X
#endif /* _SDLname_h_ */ #endif /* SDLname_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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
@ -32,8 +32,8 @@
* version included in SDL_opengl.h. * version included in SDL_opengl.h.
*/ */
#ifndef _SDL_opengl_h #ifndef SDL_opengl_h_
#define _SDL_opengl_h #define SDL_opengl_h_
#include "SDL_config.h" #include "SDL_config.h"
@ -97,6 +97,13 @@
#elif defined(__CYGWIN__) && defined(USE_OPENGL32) /* use native windows opengl32 */ #elif defined(__CYGWIN__) && defined(USE_OPENGL32) /* use native windows opengl32 */
# define GLAPI extern # define GLAPI extern
# define GLAPIENTRY __stdcall # define GLAPIENTRY __stdcall
#elif defined(__OS2__) || defined(__EMX__) /* native os/2 opengl */
# define GLAPI extern
# define GLAPIENTRY _System
# define APIENTRY _System
# if defined(__GNUC__) && !defined(_System)
# define _System
# endif
#elif (defined(__GNUC__) && __GNUC__ >= 4) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) #elif (defined(__GNUC__) && __GNUC__ >= 4) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
# define GLAPI __attribute__((visibility("default"))) # define GLAPI __attribute__((visibility("default")))
# define GLAPIENTRY # define GLAPIENTRY
@ -2171,6 +2178,6 @@ typedef void (APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum t
#endif /* !__IPHONEOS__ */ #endif /* !__IPHONEOS__ */
#endif /* _SDL_opengl_h */ #endif /* SDL_opengl_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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
@ -24,6 +24,7 @@
* *
* This is a simple file to encapsulate the OpenGL ES 1.X API headers. * This is a simple file to encapsulate the OpenGL ES 1.X API headers.
*/ */
#include "SDL_config.h"
#ifdef __IPHONEOS__ #ifdef __IPHONEOS__
#include <OpenGLES/ES1/gl.h> #include <OpenGLES/ES1/gl.h>

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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
@ -24,6 +24,8 @@
* *
* This is a simple file to encapsulate the OpenGL ES 2.0 API headers. * This is a simple file to encapsulate the OpenGL ES 2.0 API headers.
*/ */
#include "SDL_config.h"
#ifndef _MSC_VER #ifndef _MSC_VER
#ifdef __IPHONEOS__ #ifdef __IPHONEOS__

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,10 +25,11 @@
* Header for the enumerated pixel format definitions. * Header for the enumerated pixel format definitions.
*/ */
#ifndef _SDL_pixels_h #ifndef SDL_pixels_h_
#define _SDL_pixels_h #define SDL_pixels_h_
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#include "SDL_endian.h"
#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++ */
@ -260,6 +261,19 @@ enum
SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB, SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB,
SDL_PACKEDLAYOUT_2101010, 32, 4), SDL_PACKEDLAYOUT_2101010, 32, 4),
/* Aliases for RGBA byte arrays of color data, for the current platform */
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
SDL_PIXELFORMAT_RGBA32 = SDL_PIXELFORMAT_RGBA8888,
SDL_PIXELFORMAT_ARGB32 = SDL_PIXELFORMAT_ARGB8888,
SDL_PIXELFORMAT_BGRA32 = SDL_PIXELFORMAT_BGRA8888,
SDL_PIXELFORMAT_ABGR32 = SDL_PIXELFORMAT_ABGR8888,
#else
SDL_PIXELFORMAT_RGBA32 = SDL_PIXELFORMAT_ABGR8888,
SDL_PIXELFORMAT_ARGB32 = SDL_PIXELFORMAT_BGRA8888,
SDL_PIXELFORMAT_BGRA32 = SDL_PIXELFORMAT_ARGB8888,
SDL_PIXELFORMAT_ABGR32 = SDL_PIXELFORMAT_RGBA8888,
#endif
SDL_PIXELFORMAT_YV12 = /**< Planar mode: Y + V + U (3 planes) */ SDL_PIXELFORMAT_YV12 = /**< Planar mode: Y + V + U (3 planes) */
SDL_DEFINE_PIXELFOURCC('Y', 'V', '1', '2'), SDL_DEFINE_PIXELFOURCC('Y', 'V', '1', '2'),
SDL_PIXELFORMAT_IYUV = /**< Planar mode: Y + U + V (3 planes) */ SDL_PIXELFORMAT_IYUV = /**< Planar mode: Y + U + V (3 planes) */
@ -449,6 +463,6 @@ extern DECLSPEC void SDLCALL SDL_CalculateGammaRamp(float gamma, Uint16 * ramp);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_pixels_h */ #endif /* SDL_pixels_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,6 +1,6 @@
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2017 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,8 +25,8 @@
* Try to get a standard set of platform defines. * Try to get a standard set of platform defines.
*/ */
#ifndef _SDL_platform_h #ifndef SDL_platform_h_
#define _SDL_platform_h #define SDL_platform_h_
#if defined(_AIX) #if defined(_AIX)
#undef __AIX__ #undef __AIX__
@ -70,18 +70,22 @@
/* lets us know what version of Mac OS X we're compiling on */ /* lets us know what version of Mac OS X we're compiling on */
#include "AvailabilityMacros.h" #include "AvailabilityMacros.h"
#include "TargetConditionals.h" #include "TargetConditionals.h"
#if TARGET_OS_TV
#undef __TVOS__
#define __TVOS__ 1
#endif
#if TARGET_OS_IPHONE #if TARGET_OS_IPHONE
/* if compiling for iPhone */ /* if compiling for iOS */
#undef __IPHONEOS__ #undef __IPHONEOS__
#define __IPHONEOS__ 1 #define __IPHONEOS__ 1
#undef __MACOSX__ #undef __MACOSX__
#else #else
/* if not compiling for iPhone */ /* if not compiling for iOS */
#undef __MACOSX__ #undef __MACOSX__
#define __MACOSX__ 1 #define __MACOSX__ 1
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1050 #if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
# error SDL for Mac OS X only supports deploying on 10.5 and above. # error SDL for Mac OS X only supports deploying on 10.6 and above.
#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < 1050 */ #endif /* MAC_OS_X_VERSION_MIN_REQUIRED < 1060 */
#endif /* TARGET_OS_IPHONE */ #endif /* TARGET_OS_IPHONE */
#endif /* defined(__APPLE__) */ #endif /* defined(__APPLE__) */
@ -93,7 +97,7 @@
#undef __OPENBSD__ #undef __OPENBSD__
#define __OPENBSD__ 1 #define __OPENBSD__ 1
#endif #endif
#if defined(__OS2__) #if defined(__OS2__) || defined(__EMX__)
#undef __OS2__ #undef __OS2__
#define __OS2__ 1 #define __OS2__ 1
#endif #endif
@ -116,21 +120,29 @@
#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) #if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__)
/* Try to find out if we're compiling for WinRT or non-WinRT */ /* Try to find out if we're compiling for WinRT or non-WinRT */
/* If _USING_V110_SDK71_ is defined it means we are using the v110_xp or v120_xp toolset. */ #if defined(_MSC_VER) && defined(__has_include)
#if (defined(_MSC_VER) && (_MSC_VER >= 1700) && !_USING_V110_SDK71_) /* _MSC_VER==1700 for MSVC 2012 */ #define HAVE_WINAPIFAMILY_H __has_include(<winapifamily.h>)
/* If _USING_V110_SDK71_ is defined it means we are using the Windows XP toolset. */
#elif defined(_MSC_VER) && (_MSC_VER >= 1700 && !_USING_V110_SDK71_) /* _MSC_VER == 1700 for Visual Studio 2012 */
#define HAVE_WINAPIFAMILY_H 1
#else
#define HAVE_WINAPIFAMILY_H 0
#endif
#if HAVE_WINAPIFAMILY_H
#include <winapifamily.h> #include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #define WINAPI_FAMILY_WINRT (!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP))
#undef __WINDOWS__ #else
#define __WINDOWS__ 1 #define WINAPI_FAMILY_WINRT 0
/* See if we're compiling for WinRT: */ #endif /* HAVE_WINAPIFAMILY_H */
#elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
#if WINAPI_FAMILY_WINRT
#undef __WINRT__ #undef __WINRT__
#define __WINRT__ 1 #define __WINRT__ 1
#endif
#else #else
#undef __WINDOWS__ #undef __WINDOWS__
#define __WINDOWS__ 1 #define __WINDOWS__ 1
#endif /* _MSC_VER < 1700 */ #endif
#endif /* defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) */ #endif /* defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) */
#if defined(__WINDOWS__) #if defined(__WINDOWS__)
@ -176,6 +188,6 @@ extern DECLSPEC const char * SDLCALL SDL_GetPlatform (void);
#endif #endif
#include "close_code.h" #include "close_code.h"
#endif /* _SDL_platform_h */ #endif /* SDL_platform_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

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