Compare commits
156
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d9fd3ce83c | ||
|
|
7fa9f1559c | ||
|
|
b2ec286e35 | ||
|
|
05eb08053d | ||
|
|
c2ebe1024b | ||
|
|
1a722ef500 | ||
|
|
6303197b20 | ||
|
|
6c0a114efb | ||
|
|
e5ccc80aba | ||
|
|
00096baf18 | ||
|
|
1dbe85efd1 | ||
|
|
52bffcbcd5 | ||
|
|
89433c2339 | ||
|
|
b0fd3fad53 | ||
|
|
31dfc10c3b | ||
|
|
66399e4211 | ||
|
|
45075eec86 | ||
|
|
9b2c70c9c8 | ||
|
|
ac23faf0a6 | ||
|
|
221d6ea8a8 | ||
|
|
01eb305493 | ||
|
|
15ead9a40d | ||
|
|
7ebfaa0ea2 | ||
|
|
5f4ddebf76 | ||
|
|
0f8858cf2d | ||
|
|
98abc15769 | ||
|
|
746d74b140 | ||
|
|
7d9595b14f | ||
|
|
63d259edf0 | ||
|
|
fcd0c9843e | ||
|
|
74b3959e04 | ||
|
|
a5df48514e | ||
|
|
78d5fbf398 | ||
|
|
5d66429cc3 | ||
|
|
2ca041d294 | ||
|
|
b3f19b14d7 | ||
|
|
a85cf62c12 | ||
|
|
5be746acbc | ||
|
|
2abefb1c16 | ||
|
|
6fc17b0e2b | ||
|
|
1f7ec57d3b | ||
|
|
36eb4845b5 | ||
|
|
d5ba5bb05f | ||
|
|
cc016b0046 | ||
|
|
8c3fd5aec2 | ||
|
|
24d145f4b6 | ||
|
|
145ad48c0e | ||
|
|
fd495bb57c | ||
|
|
d58fa94ee9 | ||
|
|
d691010686 | ||
|
|
b93a8a86ab | ||
|
|
536f625bde | ||
|
|
1e18dc594e | ||
|
|
cc4973ea45 | ||
|
|
8114bd9108 | ||
|
|
495fca1517 | ||
|
|
7d80e20883 | ||
|
|
f3847c157a | ||
|
|
b576e29d9b | ||
|
|
c7ad8e5431 | ||
|
|
9c8ee3a154 | ||
|
|
d710e0be27 | ||
|
|
b8d1f852db | ||
|
|
e9ab663c43 | ||
|
|
c8d1de1a9b | ||
|
|
bf8c9cd6bf | ||
|
|
8a5ba43d00 | ||
|
|
c25a49c406 | ||
|
|
d46fdfa3ee | ||
|
|
787d339282 | ||
|
|
874f6feab4 | ||
|
|
1df4dce78f | ||
|
|
cc58a09c09 | ||
|
|
ae72cd57b5 | ||
|
|
8f858d7908 | ||
|
|
5bfdb6e02f | ||
|
|
739d3ec189 | ||
|
|
2319b2635b | ||
|
|
bda161d22b | ||
|
|
dbfd47e77d | ||
|
|
dbb6cd02aa | ||
|
|
841263c9d6 | ||
|
|
2ccb311cb7 | ||
|
|
e0a345702d | ||
|
|
9fba36511f | ||
|
|
45fb778fe5 | ||
|
|
031912c4b6 | ||
|
|
348cc05b4f | ||
|
|
e2e87a536c | ||
|
|
66d5ad19f0 | ||
|
|
94e945ccff | ||
|
|
3f93f56b6e | ||
|
|
ed5ef8fed4 | ||
|
|
39781eef09 | ||
|
|
3436124804 | ||
|
|
9267a9032e | ||
|
|
02be870c54 | ||
|
|
84ad531689 | ||
|
|
e73a81b28a | ||
|
|
133ad1915c | ||
|
|
5733f42c7c | ||
|
|
dda971833e | ||
|
|
38a5aed974 | ||
|
|
3845fd3c49 | ||
|
|
0d62ce6070 | ||
|
|
301f227879 | ||
|
|
2ca4c0233a | ||
|
|
44903d8aee | ||
|
|
e3f90c6068 | ||
|
|
8cdc2b3eec | ||
|
|
b4d8765426 | ||
|
|
e6f044ddda | ||
|
|
2eb73e2419 | ||
|
|
fb57ba763d | ||
|
|
63a98d0da2 | ||
|
|
78f11e05ff | ||
|
|
ac4f5dcadd | ||
|
|
ff4fd93f4c | ||
|
|
52a14998a8 | ||
|
|
14b0b0e6c8 | ||
|
|
cb4b41ddf7 | ||
|
|
5a2d165b7b | ||
|
|
11022c23b2 | ||
|
|
b7c93a2d77 | ||
|
|
078e817ceb | ||
|
|
aba2be820c | ||
|
|
0dbeec449f | ||
|
|
3f46546f79 | ||
|
|
a614d8f8f7 | ||
|
|
bb3997d81d | ||
|
|
035121040f | ||
|
|
f2d016e353 | ||
|
|
b858242823 | ||
|
|
46927b1362 | ||
|
|
3bee5cf538 | ||
|
|
03dcee1731 | ||
|
|
fdcc1d59b9 | ||
|
|
2633540746 | ||
|
|
116a5344ff | ||
|
|
f3436bc103 | ||
|
|
5e21571374 | ||
|
|
699f8697fe | ||
|
|
0352301e1a | ||
|
|
4761467b2e | ||
|
|
cd662ceb54 | ||
|
|
7207f5155b | ||
|
|
5d9013beb9 | ||
|
|
4af1f6ed0c | ||
|
|
446fb3028e | ||
|
|
ba170daf84 | ||
|
|
7fa2ddb0de | ||
|
|
9aca2a4339 | ||
|
|
491fba1d06 | ||
|
|
c27f3ead7c | ||
|
|
1429e525fb | ||
|
|
de6963ea99 |
No files matched your search
@@ -1,4 +1,4 @@
|
|||||||
cmake_minimum_required(VERSION 3.0)
|
cmake_minimum_required(VERSION 3.0...3.5)
|
||||||
project(ci_utils C CXX)
|
project(ci_utils C CXX)
|
||||||
|
|
||||||
set(txt "CC=${CMAKE_C_COMPILER}
|
set(txt "CC=${CMAKE_C_COMPILER}
|
||||||
|
|||||||
@@ -1,19 +1,23 @@
|
|||||||
name: Build (VM Actions)
|
name: Build (C/P Actions)
|
||||||
|
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
freebsd:
|
freebsd:
|
||||||
runs-on: macos-12
|
runs-on: ubuntu-latest
|
||||||
name: FreeBSD
|
name: FreeBSD
|
||||||
|
timeout-minutes: 30
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Build
|
- name: Build
|
||||||
uses: vmactions/freebsd-vm@v0
|
uses: cross-platform-actions/action@v0.19.1
|
||||||
with:
|
with:
|
||||||
usesh: true
|
operating_system: freebsd
|
||||||
prepare: |
|
version: '13.2'
|
||||||
pkg install -y \
|
shell: bash
|
||||||
|
run: |
|
||||||
|
sudo pkg update
|
||||||
|
sudo pkg install -y \
|
||||||
gmake \
|
gmake \
|
||||||
pkgconf \
|
pkgconf \
|
||||||
libXcursor \
|
libXcursor \
|
||||||
@@ -33,17 +37,15 @@ jobs:
|
|||||||
libinotify \
|
libinotify \
|
||||||
alsa-lib \
|
alsa-lib \
|
||||||
jackit \
|
jackit \
|
||||||
nas \
|
|
||||||
pipewire \
|
pipewire \
|
||||||
pulseaudio \
|
pulseaudio \
|
||||||
sndio \
|
sndio \
|
||||||
dbus \
|
dbus \
|
||||||
zh-fcitx \
|
zh-fcitx \
|
||||||
ibus \
|
ibus \
|
||||||
libsamplerate \
|
|
||||||
libudev-devd
|
libudev-devd
|
||||||
|
|
||||||
run: |
|
|
||||||
mkdir build_autotools
|
mkdir build_autotools
|
||||||
(cd build_autotools && CFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib" ../configure)
|
export CPPFLAGS="-I/usr/local/include"
|
||||||
|
export LDFLAGS="-L/usr/local/lib"
|
||||||
|
(cd build_autotools && ../configure --disable-static)
|
||||||
gmake -C build_autotools -j`sysctl -n hw.ncpu` V=1
|
gmake -C build_autotools -j`sysctl -n hw.ncpu` V=1
|
||||||
@@ -7,9 +7,9 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: mymindstorm/setup-emsdk@v10
|
- uses: mymindstorm/setup-emsdk@v12
|
||||||
with:
|
with:
|
||||||
version: 2.0.32
|
version: 3.1.35
|
||||||
- name: Install ninja
|
- name: Install ninja
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get -y update
|
sudo apt-get -y update
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ jobs:
|
|||||||
if: runner.os == 'macOS'
|
if: runner.os == 'macOS'
|
||||||
run: |
|
run: |
|
||||||
brew install \
|
brew install \
|
||||||
|
autoconf \
|
||||||
ninja \
|
ninja \
|
||||||
pkg-config
|
pkg-config
|
||||||
|
|
||||||
@@ -104,10 +105,10 @@ jobs:
|
|||||||
- name: Run build-time tests (CMake)
|
- name: Run build-time tests (CMake)
|
||||||
if: "! matrix.platform.autotools"
|
if: "! matrix.platform.autotools"
|
||||||
run: |
|
run: |
|
||||||
set -eu
|
|
||||||
${{ matrix.platform.source_cmd }}
|
${{ matrix.platform.source_cmd }}
|
||||||
|
set -eu
|
||||||
export SDL_TESTS_QUICK=1
|
export SDL_TESTS_QUICK=1
|
||||||
ctest -VV --test-dir build/
|
ctest -VV --test-dir build/ -j2
|
||||||
if test "${{ runner.os }}" = "Linux"; then
|
if test "${{ runner.os }}" = "Linux"; then
|
||||||
# This should show us the SDL_REVISION
|
# This should show us the SDL_REVISION
|
||||||
strings build/libSDL2-2.0.so.0 | grep SDL-
|
strings build/libSDL2-2.0.so.0 | grep SDL-
|
||||||
@@ -122,8 +123,8 @@ jobs:
|
|||||||
- name: Configure (Autotools)
|
- name: Configure (Autotools)
|
||||||
if: matrix.platform.autotools
|
if: matrix.platform.autotools
|
||||||
run: |
|
run: |
|
||||||
set -eu
|
|
||||||
${{ matrix.platform.source_cmd }}
|
${{ matrix.platform.source_cmd }}
|
||||||
|
set -eu
|
||||||
rm -fr build-autotools
|
rm -fr build-autotools
|
||||||
mkdir build-autotools
|
mkdir build-autotools
|
||||||
./autogen.sh
|
./autogen.sh
|
||||||
@@ -154,8 +155,8 @@ jobs:
|
|||||||
- name: Build (Autotools)
|
- name: Build (Autotools)
|
||||||
if: matrix.platform.autotools
|
if: matrix.platform.autotools
|
||||||
run: |
|
run: |
|
||||||
set -eu
|
|
||||||
${{ matrix.platform.source_cmd }}
|
${{ matrix.platform.source_cmd }}
|
||||||
|
set -eu
|
||||||
parallel="$(getconf _NPROCESSORS_ONLN)"
|
parallel="$(getconf _NPROCESSORS_ONLN)"
|
||||||
make -j"${parallel}" -C build-autotools V=1
|
make -j"${parallel}" -C build-autotools V=1
|
||||||
if test "${{ runner.os }}" != "macOS" ; then
|
if test "${{ runner.os }}" != "macOS" ; then
|
||||||
@@ -164,8 +165,8 @@ jobs:
|
|||||||
- name: Run build-time tests (Autotools)
|
- name: Run build-time tests (Autotools)
|
||||||
if: ${{ matrix.platform.autotools && (runner.os != 'macOS') }}
|
if: ${{ matrix.platform.autotools && (runner.os != 'macOS') }}
|
||||||
run: |
|
run: |
|
||||||
set -eu
|
|
||||||
${{ matrix.platform.source_cmd }}
|
${{ matrix.platform.source_cmd }}
|
||||||
|
set -eu
|
||||||
curdir="$(pwd)"
|
curdir="$(pwd)"
|
||||||
parallel="$(getconf _NPROCESSORS_ONLN)"
|
parallel="$(getconf _NPROCESSORS_ONLN)"
|
||||||
export SDL_TESTS_QUICK=1
|
export SDL_TESTS_QUICK=1
|
||||||
@@ -177,8 +178,8 @@ jobs:
|
|||||||
- name: Install (Autotools)
|
- name: Install (Autotools)
|
||||||
if: matrix.platform.autotools
|
if: matrix.platform.autotools
|
||||||
run: |
|
run: |
|
||||||
set -eu
|
|
||||||
${{ matrix.platform.source_cmd }}
|
${{ matrix.platform.source_cmd }}
|
||||||
|
set -eu
|
||||||
curdir="$(pwd)"
|
curdir="$(pwd)"
|
||||||
parallel="$(getconf _NPROCESSORS_ONLN)"
|
parallel="$(getconf _NPROCESSORS_ONLN)"
|
||||||
make -j"${parallel}" -C build-autotools install V=1
|
make -j"${parallel}" -C build-autotools install V=1
|
||||||
@@ -219,8 +220,8 @@ jobs:
|
|||||||
- name: Run installed-tests (Autotools)
|
- name: Run installed-tests (Autotools)
|
||||||
if: "runner.os == 'Linux' && matrix.platform.autotools"
|
if: "runner.os == 'Linux' && matrix.platform.autotools"
|
||||||
run: |
|
run: |
|
||||||
set -eu
|
|
||||||
${{ matrix.platform.source_cmd }}
|
${{ matrix.platform.source_cmd }}
|
||||||
|
set -eu
|
||||||
parallel="$(getconf _NPROCESSORS_ONLN)"
|
parallel="$(getconf _NPROCESSORS_ONLN)"
|
||||||
sudo make -j"${parallel}" -C build-autotools install
|
sudo make -j"${parallel}" -C build-autotools install
|
||||||
sudo make -j"${parallel}" -C build-autotools/test install
|
sudo make -j"${parallel}" -C build-autotools/test install
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ jobs:
|
|||||||
os.makedirs(builddir)
|
os.makedirs(builddir)
|
||||||
with open(f"{ builddir }/CMakeLists.txt", "w") as f:
|
with open(f"{ builddir }/CMakeLists.txt", "w") as f:
|
||||||
f.write(textwrap.dedent(f"""\
|
f.write(textwrap.dedent(f"""\
|
||||||
cmake_minimum_required(VERSION 3.0)
|
cmake_minimum_required(VERSION 3.0...3.5)
|
||||||
project(sdl_user)
|
project(sdl_user)
|
||||||
add_subdirectory("{ srcdir }" SDL)
|
add_subdirectory("{ srcdir }" SDL)
|
||||||
"""))
|
"""))
|
||||||
@@ -53,7 +53,7 @@ jobs:
|
|||||||
if: "! contains(matrix.platform.name, 'ARM')"
|
if: "! contains(matrix.platform.name, 'ARM')"
|
||||||
run: |
|
run: |
|
||||||
$env:SDL_TESTS_QUICK=1
|
$env:SDL_TESTS_QUICK=1
|
||||||
ctest -VV --test-dir build/ -C Release
|
ctest -VV --test-dir build/ -C Release -j2
|
||||||
- name: Install (CMake)
|
- name: Install (CMake)
|
||||||
run: |
|
run: |
|
||||||
echo "SDL2_DIR=$Env:GITHUB_WORKSPACE/prefix" >> $Env:GITHUB_ENV
|
echo "SDL2_DIR=$Env:GITHUB_WORKSPACE/prefix" >> $Env:GITHUB_ENV
|
||||||
|
|||||||
+45
-13
@@ -2,6 +2,9 @@ if(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
|
|||||||
message(FATAL_ERROR "Prevented in-tree build. Please create a build directory outside of the SDL source code and run \"cmake -S ${CMAKE_SOURCE_DIR} -B .\" from there")
|
message(FATAL_ERROR "Prevented in-tree build. Please create a build directory outside of the SDL source code and run \"cmake -S ${CMAKE_SOURCE_DIR} -B .\" from there")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# MSVC runtime library flags are selected by an abstraction.
|
||||||
|
set(CMAKE_POLICY_DEFAULT_CMP0091 NEW)
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.0.0...3.5)
|
cmake_minimum_required(VERSION 3.0.0...3.5)
|
||||||
project(SDL2 C CXX)
|
project(SDL2 C CXX)
|
||||||
|
|
||||||
@@ -84,7 +87,7 @@ endif()
|
|||||||
# See docs/release_checklist.md
|
# See docs/release_checklist.md
|
||||||
set(SDL_MAJOR_VERSION 2)
|
set(SDL_MAJOR_VERSION 2)
|
||||||
set(SDL_MINOR_VERSION 28)
|
set(SDL_MINOR_VERSION 28)
|
||||||
set(SDL_MICRO_VERSION 0)
|
set(SDL_MICRO_VERSION 5)
|
||||||
set(SDL_VERSION "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}.${SDL_MICRO_VERSION}")
|
set(SDL_VERSION "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}.${SDL_MICRO_VERSION}")
|
||||||
|
|
||||||
# Set defaults preventing destination file conflicts
|
# Set defaults preventing destination file conflicts
|
||||||
@@ -224,11 +227,13 @@ elseif(MSVC_VERSION GREATER 1400) # VisualStudio 8.0+
|
|||||||
elseif(CMAKE_C_COMPILER_ID MATCHES "^Intel$")
|
elseif(CMAKE_C_COMPILER_ID MATCHES "^Intel$")
|
||||||
set(OPT_DEF_ASM TRUE)
|
set(OPT_DEF_ASM TRUE)
|
||||||
set(USE_INTELCC TRUE)
|
set(USE_INTELCC TRUE)
|
||||||
|
elseif(CMAKE_C_COMPILER_ID MATCHES "QCC")
|
||||||
|
set(USE_QCC TRUE)
|
||||||
else()
|
else()
|
||||||
set(OPT_DEF_ASM FALSE)
|
set(OPT_DEF_ASM FALSE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(USE_GCC OR USE_CLANG OR USE_INTELCC)
|
if(USE_GCC OR USE_CLANG OR USE_INTELCC OR USE_QCC)
|
||||||
set(OPT_DEF_GCC_ATOMICS ON)
|
set(OPT_DEF_GCC_ATOMICS ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -253,6 +258,9 @@ endif()
|
|||||||
if(MSVC)
|
if(MSVC)
|
||||||
option(SDL_FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
|
option(SDL_FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
|
||||||
if(SDL_FORCE_STATIC_VCRT)
|
if(SDL_FORCE_STATIC_VCRT)
|
||||||
|
if(NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)
|
||||||
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
||||||
|
endif()
|
||||||
foreach(flag_var
|
foreach(flag_var
|
||||||
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
||||||
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
|
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
|
||||||
@@ -563,7 +571,7 @@ if(NOT SDL_FOREGROUNDING_SIGNAL STREQUAL "OFF")
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Compiler option evaluation
|
# Compiler option evaluation
|
||||||
if(USE_GCC OR USE_CLANG OR USE_INTELCC)
|
if(USE_GCC OR USE_CLANG OR USE_INTELCC OR USE_QCC)
|
||||||
# Check for -Wall first, so later things can override pieces of it.
|
# Check for -Wall first, so later things can override pieces of it.
|
||||||
# Note: clang-cl treats -Wall as -Weverything (which is very loud),
|
# Note: clang-cl treats -Wall as -Weverything (which is very loud),
|
||||||
# /W3 as -Wall, and /W4 as -Wall -Wextra. So: /W3 is enough.
|
# /W3 as -Wall, and /W4 as -Wall -Wextra. So: /W3 is enough.
|
||||||
@@ -620,11 +628,6 @@ if(USE_GCC OR USE_CLANG OR USE_INTELCC)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CMAKE_REQUIRED_FLAGS "-mpreferred-stack-boundary=2")
|
|
||||||
check_c_source_compiles("int x = 0; int main(int argc, char **argv) { return 0; }"
|
|
||||||
HAVE_GCC_PREFERRED_STACK_BOUNDARY)
|
|
||||||
set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
|
|
||||||
|
|
||||||
set(CMAKE_REQUIRED_FLAGS "-fvisibility=hidden -Werror")
|
set(CMAKE_REQUIRED_FLAGS "-fvisibility=hidden -Werror")
|
||||||
check_c_source_compiles("
|
check_c_source_compiles("
|
||||||
#if !defined(__GNUC__) || __GNUC__ < 4
|
#if !defined(__GNUC__) || __GNUC__ < 4
|
||||||
@@ -1427,6 +1430,12 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
|
|||||||
file(GLOB AIX_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/paudio/*.c)
|
file(GLOB AIX_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/paudio/*.c)
|
||||||
list(APPEND SOURCE_FILES ${AIX_AUDIO_SOURCES})
|
list(APPEND SOURCE_FILES ${AIX_AUDIO_SOURCES})
|
||||||
set(HAVE_SDL_AUDIO TRUE)
|
set(HAVE_SDL_AUDIO TRUE)
|
||||||
|
elseif(QNX)
|
||||||
|
set(SDL_AUDIO_DRIVER_QSA 1)
|
||||||
|
file(GLOB QSA_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/qsa/*.c)
|
||||||
|
list(APPEND SOURCE_FILES ${QSA_AUDIO_SOURCES})
|
||||||
|
list(APPEND EXTRA_LIBS asound)
|
||||||
|
set(HAVE_SDL_AUDIO TRUE)
|
||||||
endif()
|
endif()
|
||||||
CheckOSS()
|
CheckOSS()
|
||||||
CheckALSA()
|
CheckALSA()
|
||||||
@@ -1458,6 +1467,7 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
|
|||||||
set(SDL_VIDEO_VULKAN 1)
|
set(SDL_VIDEO_VULKAN 1)
|
||||||
set(HAVE_VULKAN TRUE)
|
set(HAVE_VULKAN TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
CheckQNXScreen()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
@@ -1708,6 +1718,13 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
|
|||||||
set(HAVE_RPATH TRUE)
|
set(HAVE_RPATH TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(QNX)
|
||||||
|
# QNX's *printf() family generates a SIGSEGV if NULL is passed for a string
|
||||||
|
# specifier (on purpose), but SDL expects "(null)". Use the built-in
|
||||||
|
# implementation.
|
||||||
|
set(HAVE_VSNPRINTF 0)
|
||||||
|
set(USE_POSIX_SPAWN 1)
|
||||||
|
endif()
|
||||||
elseif(WINDOWS)
|
elseif(WINDOWS)
|
||||||
find_program(WINDRES windres)
|
find_program(WINDRES windres)
|
||||||
|
|
||||||
@@ -1766,7 +1783,7 @@ elseif(WINDOWS)
|
|||||||
check_include_file(ddraw.h HAVE_DDRAW_H)
|
check_include_file(ddraw.h HAVE_DDRAW_H)
|
||||||
check_include_file(dsound.h HAVE_DSOUND_H)
|
check_include_file(dsound.h HAVE_DSOUND_H)
|
||||||
check_include_file(dinput.h HAVE_DINPUT_H)
|
check_include_file(dinput.h HAVE_DINPUT_H)
|
||||||
if(WINDOWS_STORE OR CMAKE_GENERATOR_PLATFORM STREQUAL "ARM")
|
if(WINDOWS_STORE OR SDL_CPU_ARM32)
|
||||||
set(HAVE_DINPUT_H 0)
|
set(HAVE_DINPUT_H 0)
|
||||||
endif()
|
endif()
|
||||||
check_include_file(dxgi.h HAVE_DXGI_H)
|
check_include_file(dxgi.h HAVE_DXGI_H)
|
||||||
@@ -1926,7 +1943,7 @@ elseif(WINDOWS)
|
|||||||
|
|
||||||
# Libraries for Win32 native and MinGW
|
# Libraries for Win32 native and MinGW
|
||||||
if(NOT WINDOWS_STORE)
|
if(NOT WINDOWS_STORE)
|
||||||
list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32)
|
list(APPEND EXTRA_LIBS kernel32 user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(WINDOWS_STORE)
|
if(WINDOWS_STORE)
|
||||||
@@ -3066,9 +3083,17 @@ else()
|
|||||||
set(sdl_static_libname "SDL2")
|
set(sdl_static_libname "SDL2")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(prefix ${CMAKE_INSTALL_PREFIX})
|
# CMAKE_PREFIX_PATH and CMAKE_INSTALL_FULL_BINDIR can be a non-absolute path
|
||||||
|
# when a master-project does e.g. `set(CMAKE_INSTALL_PREFIX "libs/SDL2" CACHE PATH "prefix" FORCE)`.
|
||||||
|
if(NOT IS_ABSOLUTE "${CMAKE_INSTALL_PREFIX}")
|
||||||
|
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_PREFIX}")
|
||||||
|
endif()
|
||||||
|
if(NOT IS_ABSOLUTE "${CMAKE_INSTALL_FULL_BINDIR}")
|
||||||
|
set(CMAKE_INSTALL_FULL_BINDIR "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_FULL_BINDIR}")
|
||||||
|
endif()
|
||||||
file(RELATIVE_PATH bin_prefix_relpath "${CMAKE_INSTALL_FULL_BINDIR}" "${CMAKE_INSTALL_PREFIX}")
|
file(RELATIVE_PATH bin_prefix_relpath "${CMAKE_INSTALL_FULL_BINDIR}" "${CMAKE_INSTALL_PREFIX}")
|
||||||
|
|
||||||
|
set(prefix ${CMAKE_INSTALL_PREFIX})
|
||||||
set(exec_prefix "\${prefix}")
|
set(exec_prefix "\${prefix}")
|
||||||
set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
|
set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
|
||||||
set(bindir "\${exec_prefix}/${CMAKE_INSTALL_BINDIR}")
|
set(bindir "\${exec_prefix}/${CMAKE_INSTALL_BINDIR}")
|
||||||
@@ -3187,7 +3212,7 @@ if (SDL_ASAN)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(SDL_CCACHE AND NOT CMAKE_VERSION VERSION_LESS 3.4)
|
if(SDL_CCACHE AND NOT CMAKE_VERSION VERSION_LESS 3.4)
|
||||||
cmake_minimum_required(VERSION 3.4)
|
cmake_minimum_required(VERSION 3.4...3.5)
|
||||||
find_program(CCACHE_BINARY ccache)
|
find_program(CCACHE_BINARY ccache)
|
||||||
if(CCACHE_BINARY)
|
if(CCACHE_BINARY)
|
||||||
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_BINARY})
|
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_BINARY})
|
||||||
@@ -3312,6 +3337,12 @@ if(ANDROID)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
|
cmake_push_check_state(RESET)
|
||||||
|
check_c_compiler_flag(-fobjc-arc COMPILER_SUPPORTS_FOBJC_ARC)
|
||||||
|
cmake_pop_check_state()
|
||||||
|
if(NOT COMPILER_SUPPORTS_FOBJC_ARC)
|
||||||
|
message(FATAL_ERROR "Compiler does not support -fobjc-arc: this is required on Apple platforms")
|
||||||
|
endif()
|
||||||
target_compile_options(sdl-build-options INTERFACE "-fobjc-arc")
|
target_compile_options(sdl-build-options INTERFACE "-fobjc-arc")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -3334,6 +3365,7 @@ if(SDL_SHARED)
|
|||||||
# alias target for in-tree builds
|
# alias target for in-tree builds
|
||||||
add_library(SDL2::SDL2 ALIAS SDL2)
|
add_library(SDL2::SDL2 ALIAS SDL2)
|
||||||
set_target_properties(SDL2 PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
|
set_target_properties(SDL2 PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
|
||||||
|
set_target_properties(SDL2 PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS FALSE)
|
||||||
if(NOT SDL_LIBC)
|
if(NOT SDL_LIBC)
|
||||||
if(SDL_CPU_X86)
|
if(SDL_CPU_X86)
|
||||||
# FIXME: should be added for all architectures (missing symbols for ARM)
|
# FIXME: should be added for all architectures (missing symbols for ARM)
|
||||||
@@ -3368,7 +3400,7 @@ if(SDL_SHARED)
|
|||||||
OUTPUT_NAME "SDL2")
|
OUTPUT_NAME "SDL2")
|
||||||
endif()
|
endif()
|
||||||
# Note: The clang toolset for Visual Studio does not support /NODEFAULTLIB.
|
# Note: The clang toolset for Visual Studio does not support /NODEFAULTLIB.
|
||||||
if(MSVC AND NOT SDL_LIBC AND NOT MSVC_CLANG AND NOT CMAKE_GENERATOR_PLATFORM STREQUAL "ARM")
|
if(MSVC AND NOT SDL_LIBC AND NOT MSVC_CLANG AND NOT SDL_CPU_ARM32)
|
||||||
# Don't try to link with the default set of libraries.
|
# Don't try to link with the default set of libraries.
|
||||||
if(NOT WINDOWS_STORE)
|
if(NOT WINDOWS_STORE)
|
||||||
set_property(TARGET SDL2 APPEND_STRING PROPERTY LINK_FLAGS " /NODEFAULTLIB")
|
set_property(TARGET SDL2 APPEND_STRING PROPERTY LINK_FLAGS " /NODEFAULTLIB")
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@
|
|||||||
LIBNAME = SDL2
|
LIBNAME = SDL2
|
||||||
MAJOR_VERSION = 2
|
MAJOR_VERSION = 2
|
||||||
MINOR_VERSION = 28
|
MINOR_VERSION = 28
|
||||||
MICRO_VERSION = 0
|
MICRO_VERSION = 5
|
||||||
VERSION = $(MAJOR_VERSION).$(MINOR_VERSION).$(MICRO_VERSION)
|
VERSION = $(MAJOR_VERSION).$(MINOR_VERSION).$(MICRO_VERSION)
|
||||||
DESCRIPTION = Simple DirectMedia Layer 2
|
DESCRIPTION = Simple DirectMedia Layer 2
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
LIBNAME = SDL2
|
LIBNAME = SDL2
|
||||||
MAJOR_VERSION = 2
|
MAJOR_VERSION = 2
|
||||||
MINOR_VERSION = 28
|
MINOR_VERSION = 28
|
||||||
MICRO_VERSION = 0
|
MICRO_VERSION = 5
|
||||||
VERSION = $(MAJOR_VERSION).$(MINOR_VERSION).$(MICRO_VERSION)
|
VERSION = $(MAJOR_VERSION).$(MINOR_VERSION).$(MICRO_VERSION)
|
||||||
|
|
||||||
LIBHOME = .
|
LIBHOME = .
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# SDL2 CMake configuration file:
|
# SDL2 CMake configuration file:
|
||||||
# This file is meant to be placed in a cmake subfolder of SDL2-devel-2.x.y-VC
|
# This file is meant to be placed in a cmake subfolder of SDL2-devel-2.x.y-VC
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.0)
|
cmake_minimum_required(VERSION 3.0...3.5)
|
||||||
|
|
||||||
include(FeatureSummary)
|
include(FeatureSummary)
|
||||||
set_package_properties(SDL2 PROPERTIES
|
set_package_properties(SDL2 PROPERTIES
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
|
|
||||||
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.28.2:
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
General:
|
||||||
|
* Added the hint SDL_HINT_JOYSTICK_WGI to control whether to use Windows.Gaming.Input for controllers
|
||||||
|
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
2.28.0:
|
2.28.0:
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -19,10 +19,10 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>FMWK</string>
|
<string>FMWK</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>2.28.0</string>
|
<string>2.28.5</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>SDLX</string>
|
<string>SDLX</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>2.28.0</string>
|
<string>2.28.5</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
@@ -9529,7 +9529,7 @@
|
|||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
DEPLOYMENT_POSTPROCESSING = YES;
|
DEPLOYMENT_POSTPROCESSING = YES;
|
||||||
DYLIB_COMPATIBILITY_VERSION = 2801.0.0;
|
DYLIB_COMPATIBILITY_VERSION = 2801.0.0;
|
||||||
DYLIB_CURRENT_VERSION = 2801.0.0;
|
DYLIB_CURRENT_VERSION = 2801.5.0;
|
||||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
GCC_ALTIVEC_EXTENSIONS = YES;
|
GCC_ALTIVEC_EXTENSIONS = YES;
|
||||||
@@ -9570,7 +9570,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CLANG_LINK_OBJC_RUNTIME = NO;
|
CLANG_LINK_OBJC_RUNTIME = NO;
|
||||||
MARKETING_VERSION = 2.28.0;
|
MARKETING_VERSION = 2.28.5;
|
||||||
OTHER_LDFLAGS = "-liconv";
|
OTHER_LDFLAGS = "-liconv";
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
@@ -9614,7 +9614,7 @@
|
|||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
DYLIB_COMPATIBILITY_VERSION = 2801.0.0;
|
DYLIB_COMPATIBILITY_VERSION = 2801.0.0;
|
||||||
DYLIB_CURRENT_VERSION = 2801.0.0;
|
DYLIB_CURRENT_VERSION = 2801.5.0;
|
||||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
ENABLE_TESTABILITY = YES;
|
ENABLE_TESTABILITY = YES;
|
||||||
@@ -9656,7 +9656,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CLANG_LINK_OBJC_RUNTIME = NO;
|
CLANG_LINK_OBJC_RUNTIME = NO;
|
||||||
MARKETING_VERSION = 2.28.0;
|
MARKETING_VERSION = 2.28.5;
|
||||||
OTHER_LDFLAGS = "-liconv";
|
OTHER_LDFLAGS = "-liconv";
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
@@ -9863,7 +9863,7 @@
|
|||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
DYLIB_COMPATIBILITY_VERSION = 2801.0.0;
|
DYLIB_COMPATIBILITY_VERSION = 2801.0.0;
|
||||||
DYLIB_CURRENT_VERSION = 2801.0.0;
|
DYLIB_CURRENT_VERSION = 2801.5.0;
|
||||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
@@ -9915,7 +9915,7 @@
|
|||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
DYLIB_COMPATIBILITY_VERSION = 2801.0.0;
|
DYLIB_COMPATIBILITY_VERSION = 2801.0.0;
|
||||||
DYLIB_CURRENT_VERSION = 2801.0.0;
|
DYLIB_CURRENT_VERSION = 2801.5.0;
|
||||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Title SDL 2.28.0
|
Title SDL 2.28.5
|
||||||
Version 1
|
Version 1
|
||||||
Description SDL Library for Mac OS X (http://www.libsdl.org)
|
Description SDL Library for Mac OS X (http://www.libsdl.org)
|
||||||
DefaultLocation /Library/Frameworks
|
DefaultLocation /Library/Frameworks
|
||||||
|
|||||||
@@ -8,22 +8,22 @@ else {
|
|||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 31
|
if (buildAsApplication) {
|
||||||
|
namespace "org.libsdl.app"
|
||||||
|
}
|
||||||
|
compileSdkVersion 34
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
if (buildAsApplication) {
|
minSdkVersion 19
|
||||||
applicationId "org.libsdl.app"
|
targetSdkVersion 34
|
||||||
}
|
|
||||||
minSdkVersion 16
|
|
||||||
targetSdkVersion 31
|
|
||||||
versionCode 1
|
versionCode 1
|
||||||
versionName "1.0"
|
versionName "1.0"
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
ndkBuild {
|
ndkBuild {
|
||||||
arguments "APP_PLATFORM=android-16"
|
arguments "APP_PLATFORM=android-19"
|
||||||
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
||||||
}
|
}
|
||||||
// cmake {
|
// cmake {
|
||||||
// arguments "-DANDROID_APP_PLATFORM=android-16", "-DANDROID_STL=c++_static"
|
// arguments "-DANDROID_APP_PLATFORM=android-19", "-DANDROID_STL=c++_static"
|
||||||
// // abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
// // abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
||||||
// abiFilters 'arm64-v8a'
|
// abiFilters 'arm64-v8a'
|
||||||
// }
|
// }
|
||||||
@@ -53,10 +53,10 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
lintOptions {
|
lint {
|
||||||
abortOnError false
|
abortOnError false
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buildAsLibrary) {
|
if (buildAsLibrary) {
|
||||||
libraryVariants.all { variant ->
|
libraryVariants.all { variant ->
|
||||||
variant.outputs.each { output ->
|
variant.outputs.each { output ->
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
com.gamemaker.game
|
com.gamemaker.game
|
||||||
-->
|
-->
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="org.libsdl.app"
|
|
||||||
android:versionCode="1"
|
android:versionCode="1"
|
||||||
android:versionName="1.0"
|
android:versionName="1.0"
|
||||||
android:installLocation="auto">
|
android:installLocation="auto">
|
||||||
|
|||||||
@@ -273,6 +273,7 @@ public class HIDDeviceManager {
|
|||||||
final int XB1_IFACE_SUBCLASS = 71;
|
final int XB1_IFACE_SUBCLASS = 71;
|
||||||
final int XB1_IFACE_PROTOCOL = 208;
|
final int XB1_IFACE_PROTOCOL = 208;
|
||||||
final int[] SUPPORTED_VENDORS = {
|
final int[] SUPPORTED_VENDORS = {
|
||||||
|
0x03f0, // HP
|
||||||
0x044f, // Thrustmaster
|
0x044f, // Thrustmaster
|
||||||
0x045e, // Microsoft
|
0x045e, // Microsoft
|
||||||
0x0738, // Mad Catz
|
0x0738, // Mad Catz
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
|||||||
private static final String TAG = "SDL";
|
private static final String TAG = "SDL";
|
||||||
private static final int SDL_MAJOR_VERSION = 2;
|
private static final int SDL_MAJOR_VERSION = 2;
|
||||||
private static final int SDL_MINOR_VERSION = 28;
|
private static final int SDL_MINOR_VERSION = 28;
|
||||||
private static final int SDL_MICRO_VERSION = 0;
|
private static final int SDL_MICRO_VERSION = 5;
|
||||||
/*
|
/*
|
||||||
// Display InputType.SOURCE/CLASS of events and devices
|
// Display InputType.SOURCE/CLASS of events and devices
|
||||||
//
|
//
|
||||||
@@ -1345,23 +1345,6 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((source & InputDevice.SOURCE_KEYBOARD) == InputDevice.SOURCE_KEYBOARD) {
|
|
||||||
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
|
||||||
if (isTextInputEvent(event)) {
|
|
||||||
if (ic != null) {
|
|
||||||
ic.commitText(String.valueOf((char) event.getUnicodeChar()), 1);
|
|
||||||
} else {
|
|
||||||
SDLInputConnection.nativeCommitText(String.valueOf((char) event.getUnicodeChar()), 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
onNativeKeyDown(keyCode);
|
|
||||||
return true;
|
|
||||||
} else if (event.getAction() == KeyEvent.ACTION_UP) {
|
|
||||||
onNativeKeyUp(keyCode);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((source & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) {
|
if ((source & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) {
|
||||||
// on some devices key events are sent for mouse BUTTON_BACK/FORWARD presses
|
// on some devices key events are sent for mouse BUTTON_BACK/FORWARD presses
|
||||||
// they are ignored here because sending them as mouse input to SDL is messy
|
// they are ignored here because sending them as mouse input to SDL is messy
|
||||||
@@ -1376,6 +1359,21 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||||
|
if (isTextInputEvent(event)) {
|
||||||
|
if (ic != null) {
|
||||||
|
ic.commitText(String.valueOf((char) event.getUnicodeChar()), 1);
|
||||||
|
} else {
|
||||||
|
SDLInputConnection.nativeCommitText(String.valueOf((char) event.getUnicodeChar()), 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onNativeKeyDown(keyCode);
|
||||||
|
return true;
|
||||||
|
} else if (event.getAction() == KeyEvent.ACTION_UP) {
|
||||||
|
onNativeKeyUp(keyCode);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ buildscript {
|
|||||||
google()
|
google()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:7.0.3'
|
classpath 'com.android.tools.build:gradle:8.1.1'
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#Thu Nov 11 18:20:34 PST 2021
|
#Thu Nov 11 18:20:34 PST 2021
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
Vendored
+52
-13
@@ -1,10 +1,10 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Attempt to guess a canonical system name.
|
# Attempt to guess a canonical system name.
|
||||||
# Copyright 1992-2022 Free Software Foundation, Inc.
|
# Copyright 1992-2023 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# shellcheck disable=SC2006,SC2268 # see below for rationale
|
# shellcheck disable=SC2006,SC2268 # see below for rationale
|
||||||
|
|
||||||
timestamp='2022-05-25'
|
timestamp='2023-08-22'
|
||||||
|
|
||||||
# This file is free software; you can redistribute it and/or modify it
|
# This file is free software; you can redistribute it and/or modify it
|
||||||
# under the terms of the GNU General Public License as published by
|
# under the terms of the GNU General Public License as published by
|
||||||
@@ -47,7 +47,7 @@ me=`echo "$0" | sed -e 's,.*/,,'`
|
|||||||
usage="\
|
usage="\
|
||||||
Usage: $0 [OPTION]
|
Usage: $0 [OPTION]
|
||||||
|
|
||||||
Output the configuration name of the system \`$me' is run on.
|
Output the configuration name of the system '$me' is run on.
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
-h, --help print this help, then exit
|
-h, --help print this help, then exit
|
||||||
@@ -60,13 +60,13 @@ version="\
|
|||||||
GNU config.guess ($timestamp)
|
GNU config.guess ($timestamp)
|
||||||
|
|
||||||
Originally written by Per Bothner.
|
Originally written by Per Bothner.
|
||||||
Copyright 1992-2022 Free Software Foundation, Inc.
|
Copyright 1992-2023 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This is free software; see the source for copying conditions. There is NO
|
This is free software; see the source for copying conditions. There is NO
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||||
|
|
||||||
help="
|
help="
|
||||||
Try \`$me --help' for more information."
|
Try '$me --help' for more information."
|
||||||
|
|
||||||
# Parse command line
|
# Parse command line
|
||||||
while test $# -gt 0 ; do
|
while test $# -gt 0 ; do
|
||||||
@@ -102,8 +102,8 @@ GUESS=
|
|||||||
# temporary files to be created and, as you can see below, it is a
|
# temporary files to be created and, as you can see below, it is a
|
||||||
# headache to deal with in a portable fashion.
|
# headache to deal with in a portable fashion.
|
||||||
|
|
||||||
# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
|
# Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still
|
||||||
# use `HOST_CC' if defined, but it is deprecated.
|
# use 'HOST_CC' if defined, but it is deprecated.
|
||||||
|
|
||||||
# Portable tmp directory creation inspired by the Autoconf team.
|
# Portable tmp directory creation inspired by the Autoconf team.
|
||||||
|
|
||||||
@@ -155,6 +155,9 @@ Linux|GNU|GNU/*)
|
|||||||
|
|
||||||
set_cc_for_build
|
set_cc_for_build
|
||||||
cat <<-EOF > "$dummy.c"
|
cat <<-EOF > "$dummy.c"
|
||||||
|
#if defined(__ANDROID__)
|
||||||
|
LIBC=android
|
||||||
|
#else
|
||||||
#include <features.h>
|
#include <features.h>
|
||||||
#if defined(__UCLIBC__)
|
#if defined(__UCLIBC__)
|
||||||
LIBC=uclibc
|
LIBC=uclibc
|
||||||
@@ -169,6 +172,7 @@ Linux|GNU|GNU/*)
|
|||||||
LIBC=musl
|
LIBC=musl
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
EOF
|
EOF
|
||||||
cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
|
cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
|
||||||
eval "$cc_set_libc"
|
eval "$cc_set_libc"
|
||||||
@@ -459,7 +463,7 @@ case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
|
|||||||
UNAME_RELEASE=`uname -v`
|
UNAME_RELEASE=`uname -v`
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
# Japanese Language versions have a version number like `4.1.3-JL'.
|
# Japanese Language versions have a version number like '4.1.3-JL'.
|
||||||
SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
|
SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
|
||||||
GUESS=sparc-sun-sunos$SUN_REL
|
GUESS=sparc-sun-sunos$SUN_REL
|
||||||
;;
|
;;
|
||||||
@@ -904,7 +908,7 @@ EOF
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
*:FreeBSD:*:*)
|
*:FreeBSD:*:*)
|
||||||
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
UNAME_PROCESSOR=`uname -p`
|
||||||
case $UNAME_PROCESSOR in
|
case $UNAME_PROCESSOR in
|
||||||
amd64)
|
amd64)
|
||||||
UNAME_PROCESSOR=x86_64 ;;
|
UNAME_PROCESSOR=x86_64 ;;
|
||||||
@@ -966,11 +970,37 @@ EOF
|
|||||||
GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
|
GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
|
||||||
GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
|
GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
|
||||||
;;
|
;;
|
||||||
|
x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*)
|
||||||
|
GUESS="$UNAME_MACHINE-pc-managarm-mlibc"
|
||||||
|
;;
|
||||||
|
*:[Mm]anagarm:*:*)
|
||||||
|
GUESS="$UNAME_MACHINE-unknown-managarm-mlibc"
|
||||||
|
;;
|
||||||
*:Minix:*:*)
|
*:Minix:*:*)
|
||||||
GUESS=$UNAME_MACHINE-unknown-minix
|
GUESS=$UNAME_MACHINE-unknown-minix
|
||||||
;;
|
;;
|
||||||
aarch64:Linux:*:*)
|
aarch64:Linux:*:*)
|
||||||
GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
|
set_cc_for_build
|
||||||
|
CPU=$UNAME_MACHINE
|
||||||
|
LIBCABI=$LIBC
|
||||||
|
if test "$CC_FOR_BUILD" != no_compiler_found; then
|
||||||
|
ABI=64
|
||||||
|
sed 's/^ //' << EOF > "$dummy.c"
|
||||||
|
#ifdef __ARM_EABI__
|
||||||
|
#ifdef __ARM_PCS_VFP
|
||||||
|
ABI=eabihf
|
||||||
|
#else
|
||||||
|
ABI=eabi
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
EOF
|
||||||
|
cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`
|
||||||
|
eval "$cc_set_abi"
|
||||||
|
case $ABI in
|
||||||
|
eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
GUESS=$CPU-unknown-linux-$LIBCABI
|
||||||
;;
|
;;
|
||||||
aarch64_be:Linux:*:*)
|
aarch64_be:Linux:*:*)
|
||||||
UNAME_MACHINE=aarch64_be
|
UNAME_MACHINE=aarch64_be
|
||||||
@@ -1036,7 +1066,16 @@ EOF
|
|||||||
k1om:Linux:*:*)
|
k1om:Linux:*:*)
|
||||||
GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
|
GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
|
||||||
;;
|
;;
|
||||||
loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
|
kvx:Linux:*:*)
|
||||||
|
GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
|
||||||
|
;;
|
||||||
|
kvx:cos:*:*)
|
||||||
|
GUESS=$UNAME_MACHINE-unknown-cos
|
||||||
|
;;
|
||||||
|
kvx:mbr:*:*)
|
||||||
|
GUESS=$UNAME_MACHINE-unknown-mbr
|
||||||
|
;;
|
||||||
|
loongarch32:Linux:*:* | loongarch64:Linux:*:*)
|
||||||
GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
|
GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
|
||||||
;;
|
;;
|
||||||
m32r*:Linux:*:*)
|
m32r*:Linux:*:*)
|
||||||
@@ -1191,7 +1230,7 @@ EOF
|
|||||||
GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
|
GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
|
||||||
;;
|
;;
|
||||||
i*86:OS/2:*:*)
|
i*86:OS/2:*:*)
|
||||||
# If we were able to find `uname', then EMX Unix compatibility
|
# If we were able to find 'uname', then EMX Unix compatibility
|
||||||
# is probably installed.
|
# is probably installed.
|
||||||
GUESS=$UNAME_MACHINE-pc-os2-emx
|
GUESS=$UNAME_MACHINE-pc-os2-emx
|
||||||
;;
|
;;
|
||||||
@@ -1332,7 +1371,7 @@ EOF
|
|||||||
GUESS=ns32k-sni-sysv
|
GUESS=ns32k-sni-sysv
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
|
PENTIUM:*:4.0*:*) # Unisys 'ClearPath HMP IX 4000' SVR4/MP effort
|
||||||
# says <Richard.M.Bartel@ccMail.Census.GOV>
|
# says <Richard.M.Bartel@ccMail.Census.GOV>
|
||||||
GUESS=i586-unisys-sysv4
|
GUESS=i586-unisys-sysv4
|
||||||
;;
|
;;
|
||||||
|
|||||||
Vendored
+146
-76
@@ -1,10 +1,10 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Configuration validation subroutine script.
|
# Configuration validation subroutine script.
|
||||||
# Copyright 1992-2022 Free Software Foundation, Inc.
|
# Copyright 1992-2023 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# shellcheck disable=SC2006,SC2268 # see below for rationale
|
# shellcheck disable=SC2006,SC2268 # see below for rationale
|
||||||
|
|
||||||
timestamp='2022-01-03'
|
timestamp='2023-09-19'
|
||||||
|
|
||||||
# This file is free software; you can redistribute it and/or modify it
|
# This file is free software; you can redistribute it and/or modify it
|
||||||
# under the terms of the GNU General Public License as published by
|
# under the terms of the GNU General Public License as published by
|
||||||
@@ -76,13 +76,13 @@ Report bugs and patches to <config-patches@gnu.org>."
|
|||||||
version="\
|
version="\
|
||||||
GNU config.sub ($timestamp)
|
GNU config.sub ($timestamp)
|
||||||
|
|
||||||
Copyright 1992-2022 Free Software Foundation, Inc.
|
Copyright 1992-2023 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This is free software; see the source for copying conditions. There is NO
|
This is free software; see the source for copying conditions. There is NO
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||||
|
|
||||||
help="
|
help="
|
||||||
Try \`$me --help' for more information."
|
Try '$me --help' for more information."
|
||||||
|
|
||||||
# Parse command line
|
# Parse command line
|
||||||
while test $# -gt 0 ; do
|
while test $# -gt 0 ; do
|
||||||
@@ -130,7 +130,7 @@ IFS=$saved_IFS
|
|||||||
# Separate into logical components for further validation
|
# Separate into logical components for further validation
|
||||||
case $1 in
|
case $1 in
|
||||||
*-*-*-*-*)
|
*-*-*-*-*)
|
||||||
echo Invalid configuration \`"$1"\': more than four components >&2
|
echo "Invalid configuration '$1': more than four components" >&2
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
*-*-*-*)
|
*-*-*-*)
|
||||||
@@ -145,7 +145,8 @@ case $1 in
|
|||||||
nto-qnx* | linux-* | uclinux-uclibc* \
|
nto-qnx* | linux-* | uclinux-uclibc* \
|
||||||
| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
|
| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
|
||||||
| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
|
| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
|
||||||
| storm-chaos* | os2-emx* | rtmk-nova*)
|
| storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \
|
||||||
|
| windows-* )
|
||||||
basic_machine=$field1
|
basic_machine=$field1
|
||||||
basic_os=$maybe_os
|
basic_os=$maybe_os
|
||||||
;;
|
;;
|
||||||
@@ -943,7 +944,7 @@ $basic_machine
|
|||||||
EOF
|
EOF
|
||||||
IFS=$saved_IFS
|
IFS=$saved_IFS
|
||||||
;;
|
;;
|
||||||
# We use `pc' rather than `unknown'
|
# We use 'pc' rather than 'unknown'
|
||||||
# because (1) that's what they normally are, and
|
# because (1) that's what they normally are, and
|
||||||
# (2) the word "unknown" tends to confuse beginning users.
|
# (2) the word "unknown" tends to confuse beginning users.
|
||||||
i*86 | x86_64)
|
i*86 | x86_64)
|
||||||
@@ -1180,7 +1181,7 @@ case $cpu-$vendor in
|
|||||||
case $cpu in
|
case $cpu in
|
||||||
1750a | 580 \
|
1750a | 580 \
|
||||||
| a29k \
|
| a29k \
|
||||||
| aarch64 | aarch64_be \
|
| aarch64 | aarch64_be | aarch64c | arm64ec \
|
||||||
| abacus \
|
| abacus \
|
||||||
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
|
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
|
||||||
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
|
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
|
||||||
@@ -1199,45 +1200,23 @@ case $cpu-$vendor in
|
|||||||
| d10v | d30v | dlx | dsp16xx \
|
| d10v | d30v | dlx | dsp16xx \
|
||||||
| e2k | elxsi | epiphany \
|
| e2k | elxsi | epiphany \
|
||||||
| f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
|
| f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
|
||||||
|
| javascript \
|
||||||
| h8300 | h8500 \
|
| h8300 | h8500 \
|
||||||
| hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
| hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
||||||
| hexagon \
|
| hexagon \
|
||||||
| i370 | i*86 | i860 | i960 | ia16 | ia64 \
|
| i370 | i*86 | i860 | i960 | ia16 | ia64 \
|
||||||
| ip2k | iq2000 \
|
| ip2k | iq2000 \
|
||||||
| k1om \
|
| k1om \
|
||||||
|
| kvx \
|
||||||
| le32 | le64 \
|
| le32 | le64 \
|
||||||
| lm32 \
|
| lm32 \
|
||||||
| loongarch32 | loongarch64 | loongarchx32 \
|
| loongarch32 | loongarch64 \
|
||||||
| m32c | m32r | m32rle \
|
| m32c | m32r | m32rle \
|
||||||
| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
|
| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
|
||||||
| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
|
| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
|
||||||
| m88110 | m88k | maxq | mb | mcore | mep | metag \
|
| m88110 | m88k | maxq | mb | mcore | mep | metag \
|
||||||
| microblaze | microblazeel \
|
| microblaze | microblazeel \
|
||||||
| mips | mipsbe | mipseb | mipsel | mipsle \
|
| mips* \
|
||||||
| mips16 \
|
|
||||||
| mips64 | mips64eb | mips64el \
|
|
||||||
| mips64octeon | mips64octeonel \
|
|
||||||
| mips64orion | mips64orionel \
|
|
||||||
| mips64r5900 | mips64r5900el \
|
|
||||||
| mips64vr | mips64vrel \
|
|
||||||
| mips64vr4100 | mips64vr4100el \
|
|
||||||
| mips64vr4300 | mips64vr4300el \
|
|
||||||
| mips64vr5000 | mips64vr5000el \
|
|
||||||
| mips64vr5900 | mips64vr5900el \
|
|
||||||
| mipsisa32 | mipsisa32el \
|
|
||||||
| mipsisa32r2 | mipsisa32r2el \
|
|
||||||
| mipsisa32r3 | mipsisa32r3el \
|
|
||||||
| mipsisa32r5 | mipsisa32r5el \
|
|
||||||
| mipsisa32r6 | mipsisa32r6el \
|
|
||||||
| mipsisa64 | mipsisa64el \
|
|
||||||
| mipsisa64r2 | mipsisa64r2el \
|
|
||||||
| mipsisa64r3 | mipsisa64r3el \
|
|
||||||
| mipsisa64r5 | mipsisa64r5el \
|
|
||||||
| mipsisa64r6 | mipsisa64r6el \
|
|
||||||
| mipsisa64sb1 | mipsisa64sb1el \
|
|
||||||
| mipsisa64sr71k | mipsisa64sr71kel \
|
|
||||||
| mipsr5900 | mipsr5900el \
|
|
||||||
| mipstx39 | mipstx39el \
|
|
||||||
| mmix \
|
| mmix \
|
||||||
| mn10200 | mn10300 \
|
| mn10200 | mn10300 \
|
||||||
| moxie \
|
| moxie \
|
||||||
@@ -1285,7 +1264,7 @@ case $cpu-$vendor in
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
|
echo "Invalid configuration '$1': machine '$cpu-$vendor' not recognized" 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -1306,11 +1285,12 @@ esac
|
|||||||
|
|
||||||
# Decode manufacturer-specific aliases for certain operating systems.
|
# Decode manufacturer-specific aliases for certain operating systems.
|
||||||
|
|
||||||
if test x$basic_os != x
|
if test x"$basic_os" != x
|
||||||
then
|
then
|
||||||
|
|
||||||
# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
|
# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
|
||||||
# set os.
|
# set os.
|
||||||
|
obj=
|
||||||
case $basic_os in
|
case $basic_os in
|
||||||
gnu/linux*)
|
gnu/linux*)
|
||||||
kernel=linux
|
kernel=linux
|
||||||
@@ -1341,6 +1321,10 @@ EOF
|
|||||||
kernel=linux
|
kernel=linux
|
||||||
os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
|
os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
|
||||||
;;
|
;;
|
||||||
|
managarm*)
|
||||||
|
kernel=managarm
|
||||||
|
os=`echo "$basic_os" | sed -e 's|managarm|mlibc|'`
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
kernel=
|
kernel=
|
||||||
os=$basic_os
|
os=$basic_os
|
||||||
@@ -1506,10 +1490,16 @@ case $os in
|
|||||||
os=eabi
|
os=eabi
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
os=elf
|
os=
|
||||||
|
obj=elf
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
|
aout* | coff* | elf* | pe*)
|
||||||
|
# These are machine code file formats, not OSes
|
||||||
|
obj=$os
|
||||||
|
os=
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
# No normalization, but not necessarily accepted, that comes below.
|
# No normalization, but not necessarily accepted, that comes below.
|
||||||
;;
|
;;
|
||||||
@@ -1528,12 +1518,15 @@ else
|
|||||||
# system, and we'll never get to this point.
|
# system, and we'll never get to this point.
|
||||||
|
|
||||||
kernel=
|
kernel=
|
||||||
|
obj=
|
||||||
case $cpu-$vendor in
|
case $cpu-$vendor in
|
||||||
score-*)
|
score-*)
|
||||||
os=elf
|
os=
|
||||||
|
obj=elf
|
||||||
;;
|
;;
|
||||||
spu-*)
|
spu-*)
|
||||||
os=elf
|
os=
|
||||||
|
obj=elf
|
||||||
;;
|
;;
|
||||||
*-acorn)
|
*-acorn)
|
||||||
os=riscix1.2
|
os=riscix1.2
|
||||||
@@ -1543,28 +1536,35 @@ case $cpu-$vendor in
|
|||||||
os=gnu
|
os=gnu
|
||||||
;;
|
;;
|
||||||
arm*-semi)
|
arm*-semi)
|
||||||
os=aout
|
os=
|
||||||
|
obj=aout
|
||||||
;;
|
;;
|
||||||
c4x-* | tic4x-*)
|
c4x-* | tic4x-*)
|
||||||
os=coff
|
os=
|
||||||
|
obj=coff
|
||||||
;;
|
;;
|
||||||
c8051-*)
|
c8051-*)
|
||||||
os=elf
|
os=
|
||||||
|
obj=elf
|
||||||
;;
|
;;
|
||||||
clipper-intergraph)
|
clipper-intergraph)
|
||||||
os=clix
|
os=clix
|
||||||
;;
|
;;
|
||||||
hexagon-*)
|
hexagon-*)
|
||||||
os=elf
|
os=
|
||||||
|
obj=elf
|
||||||
;;
|
;;
|
||||||
tic54x-*)
|
tic54x-*)
|
||||||
os=coff
|
os=
|
||||||
|
obj=coff
|
||||||
;;
|
;;
|
||||||
tic55x-*)
|
tic55x-*)
|
||||||
os=coff
|
os=
|
||||||
|
obj=coff
|
||||||
;;
|
;;
|
||||||
tic6x-*)
|
tic6x-*)
|
||||||
os=coff
|
os=
|
||||||
|
obj=coff
|
||||||
;;
|
;;
|
||||||
# This must come before the *-dec entry.
|
# This must come before the *-dec entry.
|
||||||
pdp10-*)
|
pdp10-*)
|
||||||
@@ -1586,19 +1586,24 @@ case $cpu-$vendor in
|
|||||||
os=sunos3
|
os=sunos3
|
||||||
;;
|
;;
|
||||||
m68*-cisco)
|
m68*-cisco)
|
||||||
os=aout
|
os=
|
||||||
|
obj=aout
|
||||||
;;
|
;;
|
||||||
mep-*)
|
mep-*)
|
||||||
os=elf
|
os=
|
||||||
|
obj=elf
|
||||||
;;
|
;;
|
||||||
mips*-cisco)
|
mips*-cisco)
|
||||||
os=elf
|
os=
|
||||||
|
obj=elf
|
||||||
;;
|
;;
|
||||||
mips*-*)
|
mips*-*)
|
||||||
os=elf
|
os=
|
||||||
|
obj=elf
|
||||||
;;
|
;;
|
||||||
or32-*)
|
or32-*)
|
||||||
os=coff
|
os=
|
||||||
|
obj=coff
|
||||||
;;
|
;;
|
||||||
*-tti) # must be before sparc entry or we get the wrong os.
|
*-tti) # must be before sparc entry or we get the wrong os.
|
||||||
os=sysv3
|
os=sysv3
|
||||||
@@ -1607,7 +1612,8 @@ case $cpu-$vendor in
|
|||||||
os=sunos4.1.1
|
os=sunos4.1.1
|
||||||
;;
|
;;
|
||||||
pru-*)
|
pru-*)
|
||||||
os=elf
|
os=
|
||||||
|
obj=elf
|
||||||
;;
|
;;
|
||||||
*-be)
|
*-be)
|
||||||
os=beos
|
os=beos
|
||||||
@@ -1688,10 +1694,12 @@ case $cpu-$vendor in
|
|||||||
os=uxpv
|
os=uxpv
|
||||||
;;
|
;;
|
||||||
*-rom68k)
|
*-rom68k)
|
||||||
os=coff
|
os=
|
||||||
|
obj=coff
|
||||||
;;
|
;;
|
||||||
*-*bug)
|
*-*bug)
|
||||||
os=coff
|
os=
|
||||||
|
obj=coff
|
||||||
;;
|
;;
|
||||||
*-apple)
|
*-apple)
|
||||||
os=macos
|
os=macos
|
||||||
@@ -1709,7 +1717,8 @@ esac
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Now, validate our (potentially fixed-up) OS.
|
# Now, validate our (potentially fixed-up) individual pieces (OS, OBJ).
|
||||||
|
|
||||||
case $os in
|
case $os in
|
||||||
# Sometimes we do "kernel-libc", so those need to count as OSes.
|
# Sometimes we do "kernel-libc", so those need to count as OSes.
|
||||||
musl* | newlib* | relibc* | uclibc*)
|
musl* | newlib* | relibc* | uclibc*)
|
||||||
@@ -1720,6 +1729,9 @@ case $os in
|
|||||||
# VxWorks passes extra cpu info in the 4th filed.
|
# VxWorks passes extra cpu info in the 4th filed.
|
||||||
simlinux | simwindows | spe)
|
simlinux | simwindows | spe)
|
||||||
;;
|
;;
|
||||||
|
# See `case $cpu-$os` validation below
|
||||||
|
ghcjs)
|
||||||
|
;;
|
||||||
# Now accept the basic system types.
|
# Now accept the basic system types.
|
||||||
# The portable systems comes first.
|
# The portable systems comes first.
|
||||||
# Each alternative MUST end in a * to match a version number.
|
# Each alternative MUST end in a * to match a version number.
|
||||||
@@ -1728,7 +1740,7 @@ case $os in
|
|||||||
| hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
|
| hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
|
||||||
| sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
|
| sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
|
||||||
| hiux* | abug | nacl* | netware* | windows* \
|
| hiux* | abug | nacl* | netware* | windows* \
|
||||||
| os9* | macos* | osx* | ios* \
|
| os9* | macos* | osx* | ios* | tvos* | watchos* \
|
||||||
| mpw* | magic* | mmixware* | mon960* | lnews* \
|
| mpw* | magic* | mmixware* | mon960* | lnews* \
|
||||||
| amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
|
| amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
|
||||||
| aos* | aros* | cloudabi* | sortix* | twizzler* \
|
| aos* | aros* | cloudabi* | sortix* | twizzler* \
|
||||||
@@ -1737,11 +1749,11 @@ case $os in
|
|||||||
| mirbsd* | netbsd* | dicos* | openedition* | ose* \
|
| mirbsd* | netbsd* | dicos* | openedition* | ose* \
|
||||||
| bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
|
| bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
|
||||||
| ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
|
| ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
|
||||||
| bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
|
| bosx* | nextstep* | cxux* | oabi* \
|
||||||
| ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
|
| ptx* | ecoff* | winnt* | domain* | vsta* \
|
||||||
| udi* | lites* | ieee* | go32* | aux* | hcos* \
|
| udi* | lites* | ieee* | go32* | aux* | hcos* \
|
||||||
| chorusrdb* | cegcc* | glidix* | serenity* \
|
| chorusrdb* | cegcc* | glidix* | serenity* \
|
||||||
| cygwin* | msys* | pe* | moss* | proelf* | rtems* \
|
| cygwin* | msys* | moss* | proelf* | rtems* \
|
||||||
| midipix* | mingw32* | mingw64* | mint* \
|
| midipix* | mingw32* | mingw64* | mint* \
|
||||||
| uxpv* | beos* | mpeix* | udk* | moxiebox* \
|
| uxpv* | beos* | mpeix* | udk* | moxiebox* \
|
||||||
| interix* | uwin* | mks* | rhapsody* | darwin* \
|
| interix* | uwin* | mks* | rhapsody* | darwin* \
|
||||||
@@ -1754,7 +1766,7 @@ case $os in
|
|||||||
| onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
|
| onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
|
||||||
| midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
|
| midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
|
||||||
| nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
|
| nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
|
||||||
| fiwix* )
|
| fiwix* | mlibc* | cos* | mbr* )
|
||||||
;;
|
;;
|
||||||
# This one is extra strict with allowed versions
|
# This one is extra strict with allowed versions
|
||||||
sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
|
sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
|
||||||
@@ -1762,41 +1774,99 @@ case $os in
|
|||||||
;;
|
;;
|
||||||
none)
|
none)
|
||||||
;;
|
;;
|
||||||
|
kernel* | msvc* )
|
||||||
|
# Restricted further below
|
||||||
|
;;
|
||||||
|
'')
|
||||||
|
if test x"$obj" = x
|
||||||
|
then
|
||||||
|
echo "Invalid configuration '$1': Blank OS only allowed with explicit machine code file format" 1>&2
|
||||||
|
fi
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
|
echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case $obj in
|
||||||
|
aout* | coff* | elf* | pe*)
|
||||||
|
;;
|
||||||
|
'')
|
||||||
|
# empty is fine
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Here we handle the constraint that a (synthetic) cpu and os are
|
||||||
|
# valid only in combination with each other and nowhere else.
|
||||||
|
case $cpu-$os in
|
||||||
|
# The "javascript-unknown-ghcjs" triple is used by GHC; we
|
||||||
|
# accept it here in order to tolerate that, but reject any
|
||||||
|
# variations.
|
||||||
|
javascript-ghcjs)
|
||||||
|
;;
|
||||||
|
javascript-* | *-ghcjs)
|
||||||
|
echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# As a final step for OS-related things, validate the OS-kernel combination
|
# As a final step for OS-related things, validate the OS-kernel combination
|
||||||
# (given a valid OS), if there is a kernel.
|
# (given a valid OS), if there is a kernel.
|
||||||
case $kernel-$os in
|
case $kernel-$os-$obj in
|
||||||
linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
|
linux-gnu*- | linux-dietlibc*- | linux-android*- | linux-newlib*- \
|
||||||
| linux-musl* | linux-relibc* | linux-uclibc* )
|
| linux-musl*- | linux-relibc*- | linux-uclibc*- | linux-mlibc*- )
|
||||||
;;
|
;;
|
||||||
uclinux-uclibc* )
|
uclinux-uclibc*- )
|
||||||
;;
|
;;
|
||||||
-dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* )
|
managarm-mlibc*- | managarm-kernel*- )
|
||||||
|
;;
|
||||||
|
windows*-msvc*-)
|
||||||
|
;;
|
||||||
|
-dietlibc*- | -newlib*- | -musl*- | -relibc*- | -uclibc*- | -mlibc*- )
|
||||||
# These are just libc implementations, not actual OSes, and thus
|
# These are just libc implementations, not actual OSes, and thus
|
||||||
# require a kernel.
|
# require a kernel.
|
||||||
echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
|
echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
kfreebsd*-gnu* | kopensolaris*-gnu*)
|
-kernel*- )
|
||||||
|
echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2
|
||||||
|
exit 1
|
||||||
;;
|
;;
|
||||||
vxworks-simlinux | vxworks-simwindows | vxworks-spe)
|
*-kernel*- )
|
||||||
|
echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2
|
||||||
|
exit 1
|
||||||
;;
|
;;
|
||||||
nto-qnx*)
|
*-msvc*- )
|
||||||
|
echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2
|
||||||
|
exit 1
|
||||||
;;
|
;;
|
||||||
os2-emx)
|
kfreebsd*-gnu*- | kopensolaris*-gnu*-)
|
||||||
;;
|
;;
|
||||||
*-eabi* | *-gnueabi*)
|
vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-)
|
||||||
;;
|
;;
|
||||||
-*)
|
nto-qnx*-)
|
||||||
|
;;
|
||||||
|
os2-emx-)
|
||||||
|
;;
|
||||||
|
*-eabi*- | *-gnueabi*-)
|
||||||
|
;;
|
||||||
|
none--*)
|
||||||
|
# None (no kernel, i.e. freestanding / bare metal),
|
||||||
|
# can be paired with an machine code file format
|
||||||
|
;;
|
||||||
|
-*-)
|
||||||
# Blank kernel with real OS is always fine.
|
# Blank kernel with real OS is always fine.
|
||||||
;;
|
;;
|
||||||
*-*)
|
--*)
|
||||||
echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
|
# Blank kernel and OS with real machine code file format is always fine.
|
||||||
|
;;
|
||||||
|
*-*-*)
|
||||||
|
echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -1879,7 +1949,7 @@ case $vendor in
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
echo "$cpu-$vendor-${kernel:+$kernel-}$os"
|
echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}"
|
||||||
exit
|
exit
|
||||||
|
|
||||||
# Local variables:
|
# Local variables:
|
||||||
|
|||||||
@@ -905,6 +905,22 @@ macro(CheckOpenGLES)
|
|||||||
endif()
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
|
# Requires:
|
||||||
|
# - EGL
|
||||||
|
macro(CheckQNXScreen)
|
||||||
|
if(QNX AND HAVE_OPENGL_EGL)
|
||||||
|
check_c_source_compiles("
|
||||||
|
#include <screen/screen.h>
|
||||||
|
int main (int argc, char** argv) { return 0; }" HAVE_QNX_SCREEN)
|
||||||
|
if(HAVE_QNX_SCREEN)
|
||||||
|
set(SDL_VIDEO_DRIVER_QNX 1)
|
||||||
|
file(GLOB QNX_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/qnx/*.c)
|
||||||
|
list(APPEND SOURCE_FILES ${QNX_VIDEO_SOURCES})
|
||||||
|
list(APPEND EXTRA_LIBS screen EGL)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
# Requires:
|
# Requires:
|
||||||
# - nada
|
# - nada
|
||||||
# Optional:
|
# Optional:
|
||||||
@@ -955,6 +971,8 @@ macro(CheckPTHREAD)
|
|||||||
elseif(EMSCRIPTEN)
|
elseif(EMSCRIPTEN)
|
||||||
set(PTHREAD_CFLAGS "-D_REENTRANT -pthread")
|
set(PTHREAD_CFLAGS "-D_REENTRANT -pthread")
|
||||||
set(PTHREAD_LDFLAGS "-pthread")
|
set(PTHREAD_LDFLAGS "-pthread")
|
||||||
|
elseif(QNX)
|
||||||
|
# pthread support is baked in
|
||||||
else()
|
else()
|
||||||
set(PTHREAD_CFLAGS "-D_REENTRANT")
|
set(PTHREAD_CFLAGS "-D_REENTRANT")
|
||||||
set(PTHREAD_LDFLAGS "-lpthread")
|
set(PTHREAD_LDFLAGS "-lpthread")
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ macro(SDL_DetectCMakePlatform)
|
|||||||
set(SDL_CMAKE_PLATFORM AIX)
|
set(SDL_CMAKE_PLATFORM AIX)
|
||||||
elseif(CMAKE_SYSTEM_NAME MATCHES "Minix.*")
|
elseif(CMAKE_SYSTEM_NAME MATCHES "Minix.*")
|
||||||
set(SDL_CMAKE_PLATFORM MINIX)
|
set(SDL_CMAKE_PLATFORM MINIX)
|
||||||
|
elseif(CMAKE_SYSTEM_NAME MATCHES "QNX")
|
||||||
|
set(SDL_CMAKE_PLATFORM QNX)
|
||||||
endif()
|
endif()
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
if(CMAKE_SYSTEM_NAME MATCHES ".*Darwin.*")
|
if(CMAKE_SYSTEM_NAME MATCHES ".*Darwin.*")
|
||||||
@@ -48,6 +50,8 @@ macro(SDL_DetectCMakePlatform)
|
|||||||
set(SDL_CMAKE_PLATFORM HAIKU)
|
set(SDL_CMAKE_PLATFORM HAIKU)
|
||||||
elseif(NINTENDO_3DS)
|
elseif(NINTENDO_3DS)
|
||||||
set(SDL_CMAKE_PLATFORM N3DS)
|
set(SDL_CMAKE_PLATFORM N3DS)
|
||||||
|
elseif(OS2)
|
||||||
|
set(SDL_CMAKE_PLATFORM OS2)
|
||||||
endif()
|
endif()
|
||||||
if(SDL_CMAKE_PLATFORM)
|
if(SDL_CMAKE_PLATFORM)
|
||||||
set(${SDL_CMAKE_PLATFORM} TRUE)
|
set(${SDL_CMAKE_PLATFORM} TRUE)
|
||||||
|
|||||||
@@ -3507,7 +3507,7 @@ orig_CFLAGS="$CFLAGS"
|
|||||||
# See docs/release_checklist.md
|
# See docs/release_checklist.md
|
||||||
SDL_MAJOR_VERSION=2
|
SDL_MAJOR_VERSION=2
|
||||||
SDL_MINOR_VERSION=28
|
SDL_MINOR_VERSION=28
|
||||||
SDL_MICRO_VERSION=0
|
SDL_MICRO_VERSION=5
|
||||||
SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION
|
SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION
|
||||||
|
|
||||||
SDL_BINARY_AGE=`expr $SDL_MINOR_VERSION \* 100 + $SDL_MICRO_VERSION`
|
SDL_BINARY_AGE=`expr $SDL_MINOR_VERSION \* 100 + $SDL_MICRO_VERSION`
|
||||||
@@ -23026,41 +23026,6 @@ printf "%s\n" "$have_gcc_no_strict_aliasing" >&6; }
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckStackBoundary()
|
|
||||||
{
|
|
||||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GCC -mpreferred-stack-boundary option" >&5
|
|
||||||
printf %s "checking for GCC -mpreferred-stack-boundary option... " >&6; }
|
|
||||||
have_gcc_preferred_stack_boundary=no
|
|
||||||
|
|
||||||
save_CFLAGS="$CFLAGS"
|
|
||||||
CFLAGS="$save_CFLAGS -mpreferred-stack-boundary=2"
|
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
||||||
/* end confdefs.h. */
|
|
||||||
|
|
||||||
int x = 0;
|
|
||||||
|
|
||||||
int
|
|
||||||
main (void)
|
|
||||||
{
|
|
||||||
|
|
||||||
;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
_ACEOF
|
|
||||||
if ac_fn_c_try_compile "$LINENO"
|
|
||||||
then :
|
|
||||||
have_gcc_preferred_stack_boundary=yes
|
|
||||||
fi
|
|
||||||
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
|
|
||||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_gcc_preferred_stack_boundary" >&5
|
|
||||||
printf "%s\n" "$have_gcc_preferred_stack_boundary" >&6; }
|
|
||||||
CFLAGS="$save_CFLAGS"
|
|
||||||
|
|
||||||
if test x$have_gcc_preferred_stack_boundary = xyes; then
|
|
||||||
EXTRA_CFLAGS="$EXTRA_CFLAGS -mpreferred-stack-boundary=2"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
CheckWerror()
|
CheckWerror()
|
||||||
{
|
{
|
||||||
# Check whether --enable-werror was given.
|
# Check whether --enable-werror was given.
|
||||||
@@ -27474,9 +27439,6 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
|
|||||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_wince" >&5
|
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_wince" >&5
|
||||||
printf "%s\n" "$have_wince" >&6; }
|
printf "%s\n" "$have_wince" >&6; }
|
||||||
|
|
||||||
# This fixes Windows stack alignment with newer GCC
|
|
||||||
CheckStackBoundary
|
|
||||||
|
|
||||||
# headers needed elsewhere
|
# headers needed elsewhere
|
||||||
ac_fn_c_check_header_compile "$LINENO" "tpcshrd.h" "ac_cv_header_tpcshrd_h" "$ac_includes_default"
|
ac_fn_c_check_header_compile "$LINENO" "tpcshrd.h" "ac_cv_header_tpcshrd_h" "$ac_includes_default"
|
||||||
if test "x$ac_cv_header_tpcshrd_h" = xyes
|
if test "x$ac_cv_header_tpcshrd_h" = xyes
|
||||||
@@ -28285,7 +28247,7 @@ fi
|
|||||||
enable_hidapi_libusb=yes
|
enable_hidapi_libusb=yes
|
||||||
require_hidapi_libusb=yes
|
require_hidapi_libusb=yes
|
||||||
;;
|
;;
|
||||||
*-*-os2* )
|
*-*-os2* )
|
||||||
enable_hidapi_libusb=yes
|
enable_hidapi_libusb=yes
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -29678,7 +29640,7 @@ printf "%s\n" "#define SDL_VIDEO_DRIVER_OS2 1" >>confdefs.h
|
|||||||
|
|
||||||
SOURCES="$SOURCES $srcdir/src/video/os2/*.c"
|
SOURCES="$SOURCES $srcdir/src/video/os2/*.c"
|
||||||
have_video=yes
|
have_video=yes
|
||||||
SUMMARY_video="${SUMMARY_video} os/2"
|
SUMMARY_video="${SUMMARY_video} OS/2"
|
||||||
fi
|
fi
|
||||||
# Set up files for the audio library
|
# Set up files for the audio library
|
||||||
if test x$enable_audio = xyes; then
|
if test x$enable_audio = xyes; then
|
||||||
@@ -29687,7 +29649,7 @@ printf "%s\n" "#define SDL_AUDIO_DRIVER_OS2 1" >>confdefs.h
|
|||||||
|
|
||||||
SOURCES="$SOURCES $srcdir/src/audio/os2/*.c"
|
SOURCES="$SOURCES $srcdir/src/audio/os2/*.c"
|
||||||
have_audio=yes
|
have_audio=yes
|
||||||
SUMMARY_audio="${SUMMARY_audio} os/2"
|
SUMMARY_audio="${SUMMARY_audio} OS/2"
|
||||||
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lmmpm2"
|
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lmmpm2"
|
||||||
fi
|
fi
|
||||||
# Set up files for the thread library
|
# Set up files for the thread library
|
||||||
|
|||||||
+4
-27
@@ -13,7 +13,7 @@ dnl Set various version strings - taken gratefully from the GTk sources
|
|||||||
# See docs/release_checklist.md
|
# See docs/release_checklist.md
|
||||||
SDL_MAJOR_VERSION=2
|
SDL_MAJOR_VERSION=2
|
||||||
SDL_MINOR_VERSION=28
|
SDL_MINOR_VERSION=28
|
||||||
SDL_MICRO_VERSION=0
|
SDL_MICRO_VERSION=5
|
||||||
SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION
|
SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION
|
||||||
|
|
||||||
SDL_BINARY_AGE=`expr $SDL_MINOR_VERSION \* 100 + $SDL_MICRO_VERSION`
|
SDL_BINARY_AGE=`expr $SDL_MINOR_VERSION \* 100 + $SDL_MICRO_VERSION`
|
||||||
@@ -1558,26 +1558,6 @@ CheckNoStrictAliasing()
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
dnl See if GCC's -mpreferred-stack-boundary is supported.
|
|
||||||
dnl Reference: http://bugzilla.libsdl.org/show_bug.cgi?id=1296
|
|
||||||
CheckStackBoundary()
|
|
||||||
{
|
|
||||||
AC_MSG_CHECKING(for GCC -mpreferred-stack-boundary option)
|
|
||||||
have_gcc_preferred_stack_boundary=no
|
|
||||||
|
|
||||||
save_CFLAGS="$CFLAGS"
|
|
||||||
CFLAGS="$save_CFLAGS -mpreferred-stack-boundary=2"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
|
||||||
int x = 0;
|
|
||||||
]],[])], [have_gcc_preferred_stack_boundary=yes],[])
|
|
||||||
AC_MSG_RESULT($have_gcc_preferred_stack_boundary)
|
|
||||||
CFLAGS="$save_CFLAGS"
|
|
||||||
|
|
||||||
if test x$have_gcc_preferred_stack_boundary = xyes; then
|
|
||||||
EXTRA_CFLAGS="$EXTRA_CFLAGS -mpreferred-stack-boundary=2"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
dnl See if GCC's -Werror is supported.
|
dnl See if GCC's -Werror is supported.
|
||||||
CheckWerror()
|
CheckWerror()
|
||||||
{
|
{
|
||||||
@@ -3306,9 +3286,6 @@ CheckWINDOWS()
|
|||||||
],[])
|
],[])
|
||||||
AC_MSG_RESULT($have_wince)
|
AC_MSG_RESULT($have_wince)
|
||||||
|
|
||||||
# This fixes Windows stack alignment with newer GCC
|
|
||||||
CheckStackBoundary
|
|
||||||
|
|
||||||
# headers needed elsewhere
|
# headers needed elsewhere
|
||||||
AC_CHECK_HEADER(tpcshrd.h,have_tpcshrd_h=yes)
|
AC_CHECK_HEADER(tpcshrd.h,have_tpcshrd_h=yes)
|
||||||
if test x$have_tpcshrd_h = xyes; then
|
if test x$have_tpcshrd_h = xyes; then
|
||||||
@@ -3637,7 +3614,7 @@ CheckHIDAPI()
|
|||||||
enable_hidapi_libusb=yes
|
enable_hidapi_libusb=yes
|
||||||
require_hidapi_libusb=yes
|
require_hidapi_libusb=yes
|
||||||
;;
|
;;
|
||||||
*-*-os2* )
|
*-*-os2* )
|
||||||
enable_hidapi_libusb=yes
|
enable_hidapi_libusb=yes
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -4648,14 +4625,14 @@ dnl BeOS support removed after SDL 2.0.1. Haiku still works. --ryan.
|
|||||||
AC_DEFINE(SDL_VIDEO_DRIVER_OS2, 1, [ ])
|
AC_DEFINE(SDL_VIDEO_DRIVER_OS2, 1, [ ])
|
||||||
SOURCES="$SOURCES $srcdir/src/video/os2/*.c"
|
SOURCES="$SOURCES $srcdir/src/video/os2/*.c"
|
||||||
have_video=yes
|
have_video=yes
|
||||||
SUMMARY_video="${SUMMARY_video} os/2"
|
SUMMARY_video="${SUMMARY_video} OS/2"
|
||||||
fi
|
fi
|
||||||
# Set up files for the audio library
|
# Set up files for the audio library
|
||||||
if test x$enable_audio = xyes; then
|
if test x$enable_audio = xyes; then
|
||||||
AC_DEFINE(SDL_AUDIO_DRIVER_OS2, 1, [ ])
|
AC_DEFINE(SDL_AUDIO_DRIVER_OS2, 1, [ ])
|
||||||
SOURCES="$SOURCES $srcdir/src/audio/os2/*.c"
|
SOURCES="$SOURCES $srcdir/src/audio/os2/*.c"
|
||||||
have_audio=yes
|
have_audio=yes
|
||||||
SUMMARY_audio="${SUMMARY_audio} os/2"
|
SUMMARY_audio="${SUMMARY_audio} OS/2"
|
||||||
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lmmpm2"
|
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lmmpm2"
|
||||||
fi
|
fi
|
||||||
# Set up files for the thread library
|
# Set up files for the thread library
|
||||||
|
|||||||
@@ -13,13 +13,13 @@ supported, but you can use the "android-project-ant" directory as a template.
|
|||||||
Requirements
|
Requirements
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
||||||
Android SDK (version 31 or later)
|
Android SDK (version 34 or later)
|
||||||
https://developer.android.com/sdk/index.html
|
https://developer.android.com/sdk/index.html
|
||||||
|
|
||||||
Android NDK r15c or later
|
Android NDK r15c or later
|
||||||
https://developer.android.com/tools/sdk/ndk/index.html
|
https://developer.android.com/tools/sdk/ndk/index.html
|
||||||
|
|
||||||
Minimum API level supported by SDL: 16 (Android 4.1)
|
Minimum API level supported by SDL: 19 (Android 4.4)
|
||||||
|
|
||||||
|
|
||||||
How the port works
|
How the port works
|
||||||
@@ -431,13 +431,13 @@ The Tegra Graphics Debugger is available from NVidia here:
|
|||||||
https://developer.nvidia.com/tegra-graphics-debugger
|
https://developer.nvidia.com/tegra-graphics-debugger
|
||||||
|
|
||||||
|
|
||||||
Why is API level 16 the minimum required?
|
Why is API level 19 the minimum required?
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
||||||
The latest NDK toolchain doesn't support targeting earlier than API level 16.
|
The latest NDK toolchain doesn't support targeting earlier than API level 19.
|
||||||
As of this writing, according to https://developer.android.com/about/dashboards/index.html
|
As of this writing, according to https://www.composables.com/tools/distribution-chart
|
||||||
about 99% of the Android devices accessing Google Play support API level 16 or
|
about 99.7% of the Android devices accessing Google Play support API level 19 or
|
||||||
higher (January 2018).
|
higher (August 2023).
|
||||||
|
|
||||||
|
|
||||||
A note regarding the use of the "dirty rectangles" rendering technique
|
A note regarding the use of the "dirty rectangles" rendering technique
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ SDL can be included in your project in 2 major ways:
|
|||||||
The following CMake script supports both, depending on the value of `MYGAME_VENDORED`.
|
The following CMake script supports both, depending on the value of `MYGAME_VENDORED`.
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
cmake_minimum_required(VERSION 3.0)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
project(mygame)
|
project(mygame)
|
||||||
|
|
||||||
# Create an option to switch between a system sdl library and a vendored sdl library
|
# Create an option to switch between a system sdl library and a vendored sdl library
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ for some Javascript code to steal for this approach.
|
|||||||
|
|
||||||
## Building SDL/emscripten
|
## Building SDL/emscripten
|
||||||
|
|
||||||
SDL currently requires at least Emscripten 2.0.32 to build. Newer versions
|
SDL currently requires at least Emscripten 3.1.35 to build. Newer versions
|
||||||
are likely to work, as well.
|
are likely to work, as well.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@ Simple DirectMedia Layer 2 for OS/2 & eComStation
|
|||||||
SDL port for OS/2, authored by Andrey Vasilkin <digi@os2.snc.ru>, 2016
|
SDL port for OS/2, authored by Andrey Vasilkin <digi@os2.snc.ru>, 2016
|
||||||
|
|
||||||
|
|
||||||
OpenGL and audio capture not supported by this port.
|
OpenGL not supported by this port.
|
||||||
|
|
||||||
Additional optional environment variables:
|
Additional optional environment variables:
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ assert can have unique static variables associated with it.
|
|||||||
#define SDL_TriggerBreakpoint() __builtin_debugtrap()
|
#define SDL_TriggerBreakpoint() __builtin_debugtrap()
|
||||||
#elif ( (!defined(__NACL__)) && ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))) )
|
#elif ( (!defined(__NACL__)) && ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))) )
|
||||||
#define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" )
|
#define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" )
|
||||||
|
#elif (defined(__GNUC__) || defined(__clang__)) && defined(__riscv)
|
||||||
|
#define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "ebreak\n\t" )
|
||||||
#elif ( defined(__APPLE__) && (defined(__arm64__) || defined(__aarch64__)) ) /* this might work on other ARM targets, but this is a known quantity... */
|
#elif ( defined(__APPLE__) && (defined(__arm64__) || defined(__aarch64__)) ) /* this might work on other ARM targets, but this is a known quantity... */
|
||||||
#define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "brk #22\n\t" )
|
#define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "brk #22\n\t" )
|
||||||
#elif defined(__APPLE__) && defined(__arm__)
|
#elif defined(__APPLE__) && defined(__arm__)
|
||||||
|
|||||||
@@ -240,7 +240,7 @@ typedef void (*SDL_KernelMemoryBarrierFunc)();
|
|||||||
/* "REP NOP" is PAUSE, coded for tools that don't know it by that name. */
|
/* "REP NOP" is PAUSE, coded for tools that don't know it by that name. */
|
||||||
#if (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))
|
#if (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))
|
||||||
#define SDL_CPUPauseInstruction() __asm__ __volatile__("pause\n") /* Some assemblers can't do REP NOP, so go with PAUSE. */
|
#define SDL_CPUPauseInstruction() __asm__ __volatile__("pause\n") /* Some assemblers can't do REP NOP, so go with PAUSE. */
|
||||||
#elif (defined(__arm__) && __ARM_ARCH >= 7) || defined(__aarch64__)
|
#elif (defined(__arm__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7) || defined(__aarch64__)
|
||||||
#define SDL_CPUPauseInstruction() __asm__ __volatile__("yield" ::: "memory")
|
#define SDL_CPUPauseInstruction() __asm__ __volatile__("yield" ::: "memory")
|
||||||
#elif (defined(__powerpc__) || defined(__powerpc64__))
|
#elif (defined(__powerpc__) || defined(__powerpc64__))
|
||||||
#define SDL_CPUPauseInstruction() __asm__ __volatile__("or 27,27,27");
|
#define SDL_CPUPauseInstruction() __asm__ __volatile__("or 27,27,27");
|
||||||
|
|||||||
@@ -262,6 +262,8 @@
|
|||||||
#cmakedefine HAVE_XINPUT_GAMEPAD_EX @HAVE_XINPUT_GAMEPAD_EX@
|
#cmakedefine HAVE_XINPUT_GAMEPAD_EX @HAVE_XINPUT_GAMEPAD_EX@
|
||||||
#cmakedefine HAVE_XINPUT_STATE_EX @HAVE_XINPUT_STATE_EX@
|
#cmakedefine HAVE_XINPUT_STATE_EX @HAVE_XINPUT_STATE_EX@
|
||||||
|
|
||||||
|
#cmakedefine USE_POSIX_SPAWN @USE_POSIX_SPAWN@
|
||||||
|
|
||||||
/* SDL internal assertion support */
|
/* SDL internal assertion support */
|
||||||
#if @SDL_DEFAULT_ASSERT_LEVEL_CONFIGURED@
|
#if @SDL_DEFAULT_ASSERT_LEVEL_CONFIGURED@
|
||||||
#cmakedefine SDL_DEFAULT_ASSERT_LEVEL @SDL_DEFAULT_ASSERT_LEVEL@
|
#cmakedefine SDL_DEFAULT_ASSERT_LEVEL @SDL_DEFAULT_ASSERT_LEVEL@
|
||||||
|
|||||||
@@ -965,6 +965,24 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED "SDL_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED"
|
#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED "SDL_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable controlling whether IOKit should be used for controller handling.
|
||||||
|
*
|
||||||
|
* This variable can be set to the following values:
|
||||||
|
* "0" - IOKit is not used
|
||||||
|
* "1" - IOKit is used (the default)
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_IOKIT "SDL_JOYSTICK_IOKIT"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable controlling whether GCController should be used for controller handling.
|
||||||
|
*
|
||||||
|
* This variable can be set to the following values:
|
||||||
|
* "0" - GCController is not used
|
||||||
|
* "1" - GCController is used (the default)
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_MFI "SDL_JOYSTICK_MFI"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief A variable controlling whether the RAWINPUT joystick drivers should be used for better handling XInput-capable devices.
|
* \brief A variable controlling whether the RAWINPUT joystick drivers should be used for better handling XInput-capable devices.
|
||||||
*
|
*
|
||||||
@@ -1007,6 +1025,15 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define SDL_HINT_JOYSTICK_THREAD "SDL_JOYSTICK_THREAD"
|
#define SDL_HINT_JOYSTICK_THREAD "SDL_JOYSTICK_THREAD"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief A variable controlling whether Windows.Gaming.Input should be used for controller handling.
|
||||||
|
*
|
||||||
|
* This variable can be set to the following values:
|
||||||
|
* "0" - WGI is not used
|
||||||
|
* "1" - WGI is used (the default)
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_WGI "SDL_JOYSTICK_WGI"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Determines whether SDL enforces that DRM master is required in order
|
* \brief Determines whether SDL enforces that DRM master is required in order
|
||||||
* to initialize the KMSDRM video backend.
|
* to initialize the KMSDRM video backend.
|
||||||
@@ -1465,6 +1492,17 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define SDL_HINT_RENDER_VSYNC "SDL_RENDER_VSYNC"
|
#define SDL_HINT_RENDER_VSYNC "SDL_RENDER_VSYNC"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief A variable controlling whether the Metal render driver select low power device over default one
|
||||||
|
*
|
||||||
|
* This variable can be set to the following values:
|
||||||
|
* "0" - Use the prefered OS device
|
||||||
|
* "1" - Select a low power one
|
||||||
|
*
|
||||||
|
* By default the prefered OS device is used.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE "SDL_RENDER_METAL_PREFER_LOW_POWER_DEVICE"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief A variable controlling if VSYNC is automatically disable if doesn't reach the enough FPS
|
* \brief A variable controlling if VSYNC is automatically disable if doesn't reach the enough FPS
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1890,7 +1890,7 @@ extern DECLSPEC void *SDLCALL SDL_RenderGetMetalLayer(SDL_Renderer * renderer);
|
|||||||
* Note that as of SDL 2.0.18, this will return NULL if Metal refuses to give
|
* Note that as of SDL 2.0.18, this will return NULL if Metal refuses to give
|
||||||
* SDL a drawable to render to, which might happen if the window is
|
* SDL a drawable to render to, which might happen if the window is
|
||||||
* hidden/minimized/offscreen. This doesn't apply to command encoders for
|
* hidden/minimized/offscreen. This doesn't apply to command encoders for
|
||||||
* render targets, just the window's backbacker. Check your return values!
|
* render targets, just the window's backbuffer. Check your return values!
|
||||||
*
|
*
|
||||||
* \param renderer The renderer to query
|
* \param renderer The renderer to query
|
||||||
* \returns an `id<MTLRenderCommandEncoder>` on success, or NULL if the
|
* \returns an `id<MTLRenderCommandEncoder>` on success, or NULL if the
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ typedef struct SDL_version
|
|||||||
*/
|
*/
|
||||||
#define SDL_MAJOR_VERSION 2
|
#define SDL_MAJOR_VERSION 2
|
||||||
#define SDL_MINOR_VERSION 28
|
#define SDL_MINOR_VERSION 28
|
||||||
#define SDL_PATCHLEVEL 0
|
#define SDL_PATCHLEVEL 5
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Macro to determine SDL version program was compiled against.
|
* Macro to determine SDL version program was compiled against.
|
||||||
|
|||||||
@@ -631,9 +631,9 @@ SDL_bool SDL_IsTablet(void)
|
|||||||
#if defined(__WIN32__)
|
#if defined(__WIN32__)
|
||||||
|
|
||||||
#if (!defined(HAVE_LIBC) || defined(__WATCOMC__)) && !defined(SDL_STATIC_LIB)
|
#if (!defined(HAVE_LIBC) || defined(__WATCOMC__)) && !defined(SDL_STATIC_LIB)
|
||||||
/* Need to include DllMain() on Watcom C for some reason.. */
|
/* FIXME: Still need to include DllMain() on Watcom C ? */
|
||||||
|
|
||||||
BOOL APIENTRY _DllMainCRTStartup(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
|
BOOL APIENTRY MINGW32_FORCEALIGN _DllMainCRTStartup(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
|
||||||
{
|
{
|
||||||
switch (ul_reason_for_call) {
|
switch (ul_reason_for_call) {
|
||||||
case DLL_PROCESS_ATTACH:
|
case DLL_PROCESS_ATTACH:
|
||||||
|
|||||||
+10
-2
@@ -42,7 +42,15 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__EMSCRIPTEN__)
|
#if defined(__EMSCRIPTEN__)
|
||||||
#include <emscripten.h>
|
#include <emscripten.h>
|
||||||
|
/* older Emscriptens don't have this, but we need to for wasm64 compatibility. */
|
||||||
|
#ifndef MAIN_THREAD_EM_ASM_PTR
|
||||||
|
#ifdef __wasm64__
|
||||||
|
#error You need to upgrade your Emscripten compiler to support wasm64
|
||||||
|
#else
|
||||||
|
#define MAIN_THREAD_EM_ASM_PTR MAIN_THREAD_EM_ASM_INT
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The size of the stack buffer to use for rendering assert messages. */
|
/* The size of the stack buffer to use for rendering assert messages. */
|
||||||
@@ -251,7 +259,7 @@ static SDL_assert_state SDLCALL SDL_PromptAssertion(const SDL_assert_data *data,
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
SDL_bool okay = SDL_TRUE;
|
SDL_bool okay = SDL_TRUE;
|
||||||
/* *INDENT-OFF* */ /* clang-format off */
|
/* *INDENT-OFF* */ /* clang-format off */
|
||||||
char *buf = (char *) EM_ASM_INT({
|
char *buf = (char *) MAIN_THREAD_EM_ASM_PTR({
|
||||||
var str =
|
var str =
|
||||||
UTF8ToString($0) + '\n\n' +
|
UTF8ToString($0) + '\n\n' +
|
||||||
'Abort/Retry/Ignore/AlwaysIgnore? [ariA] :';
|
'Abort/Retry/Ignore/AlwaysIgnore? [ariA] :';
|
||||||
|
|||||||
@@ -300,12 +300,12 @@ static void ARTS_Deinitialize(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static SDL_bool ARTS_Init(SDL_AudioDriverImpl * impl)
|
static SDL_bool ARTS_Init(SDL_AudioDriverImpl *impl)
|
||||||
{
|
{
|
||||||
if (LoadARTSLibrary() < 0) {
|
if (LoadARTSLibrary() < 0) {
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
} else {
|
} else {
|
||||||
if (SDL_NAME(arts_init) () != NULL) {
|
if (SDL_NAME(arts_init) () != 0) {
|
||||||
UnloadARTSLibrary();
|
UnloadARTSLibrary();
|
||||||
SDL_SetError("ARTS: arts_init failed (no audio server?)");
|
SDL_SetError("ARTS: arts_init failed (no audio server?)");
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
|
|||||||
@@ -197,6 +197,8 @@ static void EMSCRIPTENAUDIO_CloseDevice(_THIS)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EM_JS_DEPS(sdlaudio, "$autoResumeAudioContext,$dynCall");
|
||||||
|
|
||||||
static int EMSCRIPTENAUDIO_OpenDevice(_THIS, const char *devname)
|
static int EMSCRIPTENAUDIO_OpenDevice(_THIS, const char *devname)
|
||||||
{
|
{
|
||||||
SDL_AudioFormat test_format;
|
SDL_AudioFormat test_format;
|
||||||
|
|||||||
+221
-70
@@ -30,17 +30,12 @@
|
|||||||
#include "../SDL_audio_c.h"
|
#include "../SDL_audio_c.h"
|
||||||
#include "SDL_os2audio.h"
|
#include "SDL_os2audio.h"
|
||||||
|
|
||||||
/*
|
static PMCI_MIX_BUFFER _getNextBuffer(SDL_PrivateAudioData *pAData, PMCI_MIX_BUFFER pBuffer)
|
||||||
void lockIncr(volatile int *piVal);
|
{
|
||||||
#pragma aux lockIncr = \
|
PMCI_MIX_BUFFER pFirstBuffer = &pAData->aMixBuffers[0];
|
||||||
"lock add [eax], 1 "\
|
PMCI_MIX_BUFFER pLastBuffer = &pAData->aMixBuffers[pAData->cMixBuffers -1];
|
||||||
parm [eax];
|
return (pBuffer == pLastBuffer ? pFirstBuffer : pBuffer+1);
|
||||||
|
}
|
||||||
void lockDecr(volatile int *piVal);
|
|
||||||
#pragma aux lockDecr = \
|
|
||||||
"lock sub [eax], 1 "\
|
|
||||||
parm [eax];
|
|
||||||
*/
|
|
||||||
|
|
||||||
static ULONG _getEnvULong(const char *name, ULONG ulMax, ULONG ulDefault)
|
static ULONG _getEnvULong(const char *name, ULONG ulMax, ULONG ulDefault)
|
||||||
{
|
{
|
||||||
@@ -64,7 +59,7 @@ static int _MCIError(const char *func, ULONG ulResult)
|
|||||||
|
|
||||||
static void _mixIOError(const char *function, ULONG ulRC)
|
static void _mixIOError(const char *function, ULONG ulRC)
|
||||||
{
|
{
|
||||||
debug_os2("%s() - failed, rc = 0x%X (%s)",
|
debug_os2("%s() - failed, rc = 0x%lX (%s)",
|
||||||
function, ulRC,
|
function, ulRC,
|
||||||
(ulRC == MCIERR_INVALID_MODE) ? "Mixer mode does not match request" :
|
(ulRC == MCIERR_INVALID_MODE) ? "Mixer mode does not match request" :
|
||||||
(ulRC == MCIERR_INVALID_BUFFER) ? "Caller sent an invalid buffer" : "unknown");
|
(ulRC == MCIERR_INVALID_BUFFER) ? "Caller sent an invalid buffer" : "unknown");
|
||||||
@@ -73,18 +68,33 @@ static void _mixIOError(const char *function, ULONG ulRC)
|
|||||||
static LONG APIENTRY cbAudioWriteEvent(ULONG ulStatus, PMCI_MIX_BUFFER pBuffer,
|
static LONG APIENTRY cbAudioWriteEvent(ULONG ulStatus, PMCI_MIX_BUFFER pBuffer,
|
||||||
ULONG ulFlags)
|
ULONG ulFlags)
|
||||||
{
|
{
|
||||||
SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)pBuffer->ulUserParm;
|
SDL_AudioDevice *_this = (SDL_AudioDevice *)pBuffer->ulUserParm;
|
||||||
|
SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)_this->hidden;
|
||||||
ULONG ulRC;
|
ULONG ulRC;
|
||||||
|
|
||||||
|
debug_os2("cbAudioWriteEvent: ulStatus = %lu, pBuffer = %p, ulFlags = %#lX",ulStatus,pBuffer,ulFlags);
|
||||||
|
|
||||||
|
if (pAData->ulState == 2)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (ulFlags != MIX_WRITE_COMPLETE) {
|
if (ulFlags != MIX_WRITE_COMPLETE) {
|
||||||
debug_os2("flags = 0x%X", ulFlags);
|
debug_os2("flags = 0x%lX", ulFlags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pAData->pDrainBuffer = pBuffer;
|
||||||
|
ulRC = pAData->stMCIMixSetup.pmixWrite(pAData->stMCIMixSetup.ulMixHandle,
|
||||||
|
pAData->pDrainBuffer, 1);
|
||||||
|
if (ulRC != MCIERR_SUCCESS) {
|
||||||
|
_mixIOError("pmixWrite", ulRC);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*lockDecr((int *)&pAData->ulQueuedBuf);*/
|
|
||||||
ulRC = DosPostEventSem(pAData->hevBuf);
|
ulRC = DosPostEventSem(pAData->hevBuf);
|
||||||
if (ulRC != NO_ERROR && ulRC != ERROR_ALREADY_POSTED) {
|
if (ulRC != NO_ERROR && ulRC != ERROR_ALREADY_POSTED) {
|
||||||
debug_os2("DosPostEventSem(), rc = %u", ulRC);
|
debug_os2("DosPostEventSem(), rc = %lu", ulRC);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1; /* return value doesn't seem to matter. */
|
return 1; /* return value doesn't seem to matter. */
|
||||||
@@ -93,19 +103,36 @@ static LONG APIENTRY cbAudioWriteEvent(ULONG ulStatus, PMCI_MIX_BUFFER pBuffer,
|
|||||||
static LONG APIENTRY cbAudioReadEvent(ULONG ulStatus, PMCI_MIX_BUFFER pBuffer,
|
static LONG APIENTRY cbAudioReadEvent(ULONG ulStatus, PMCI_MIX_BUFFER pBuffer,
|
||||||
ULONG ulFlags)
|
ULONG ulFlags)
|
||||||
{
|
{
|
||||||
SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)pBuffer->ulUserParm;
|
SDL_AudioDevice *_this = (SDL_AudioDevice *)pBuffer->ulUserParm;
|
||||||
|
SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)_this->hidden;
|
||||||
ULONG ulRC;
|
ULONG ulRC;
|
||||||
|
|
||||||
if (ulFlags != MIX_READ_COMPLETE) {
|
debug_os2("cbAudioReadEvent: ulStatus = %lu, pBuffer = %p, ulFlags = %#lX",ulStatus,pBuffer,ulFlags);
|
||||||
debug_os2("flags = 0x%X", ulFlags);
|
|
||||||
|
if (pAData->ulState == 2)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pAData->stMCIMixSetup.pmixRead(pAData->stMCIMixSetup.ulMixHandle, pBuffer, 1);
|
if (ulFlags != MIX_READ_COMPLETE) {
|
||||||
|
debug_os2("flags = 0x%lX", ulFlags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pAData->pFillBuffer = pBuffer;
|
||||||
|
if (pAData->pFillBuffer == pAData->aMixBuffers)
|
||||||
|
{
|
||||||
|
ulRC = pAData->stMCIMixSetup.pmixRead(pAData->stMCIMixSetup.ulMixHandle,
|
||||||
|
pAData->pFillBuffer, pAData->cMixBuffers);
|
||||||
|
if (ulRC != MCIERR_SUCCESS) {
|
||||||
|
_mixIOError("pmixRead", ulRC);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ulRC = DosPostEventSem(pAData->hevBuf);
|
ulRC = DosPostEventSem(pAData->hevBuf);
|
||||||
if (ulRC != NO_ERROR && ulRC != ERROR_ALREADY_POSTED) {
|
if (ulRC != NO_ERROR && ulRC != ERROR_ALREADY_POSTED) {
|
||||||
debug_os2("DosPostEventSem(), rc = %u", ulRC);
|
debug_os2("DosPostEventSem(), rc = %lu", ulRC);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@@ -120,31 +147,36 @@ static void OS2_DetectDevices(void)
|
|||||||
MCI_SYSINFO_LOGDEVICE stLogDevice;
|
MCI_SYSINFO_LOGDEVICE stLogDevice;
|
||||||
MCI_SYSINFO_PARMS stSysInfoParams;
|
MCI_SYSINFO_PARMS stSysInfoParams;
|
||||||
ULONG ulRC;
|
ULONG ulRC;
|
||||||
ULONG ulHandle = 0;
|
ULONG ulNumber;
|
||||||
|
MCI_GETDEVCAPS_PARMS stDevCapsParams;
|
||||||
|
MCI_OPEN_PARMS stMCIOpen;
|
||||||
|
MCI_GENERIC_PARMS stMCIGenericParams;
|
||||||
|
|
||||||
|
SDL_memset(&stMCISysInfo, 0, sizeof(stMCISysInfo));
|
||||||
acBuf[0] = '\0';
|
acBuf[0] = '\0';
|
||||||
stMCISysInfo.pszReturn = acBuf;
|
stMCISysInfo.pszReturn = acBuf;
|
||||||
stMCISysInfo.ulRetSize = sizeof(acBuf);
|
stMCISysInfo.ulRetSize = sizeof(acBuf);
|
||||||
stMCISysInfo.usDeviceType = MCI_DEVTYPE_AUDIO_AMPMIX;
|
stMCISysInfo.usDeviceType = MCI_DEVTYPE_AUDIO_AMPMIX;
|
||||||
ulRC = mciSendCommand(0, MCI_SYSINFO, MCI_WAIT | MCI_SYSINFO_QUANTITY,
|
ulRC = mciSendCommand(0, MCI_SYSINFO, MCI_WAIT | MCI_SYSINFO_QUANTITY,
|
||||||
&stMCISysInfo, 0);
|
&stMCISysInfo, 0);
|
||||||
if (ulRC != NO_ERROR) {
|
if (LOUSHORT(ulRC) != MCIERR_SUCCESS) {
|
||||||
debug_os2("MCI_SYSINFO, MCI_SYSINFO_QUANTITY - failed, rc = 0x%X", ulRC);
|
debug_os2("MCI_SYSINFO, MCI_SYSINFO_QUANTITY - failed, rc = 0x%hX", LOUSHORT(ulRC));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ulDevicesNum = SDL_strtoul(stMCISysInfo.pszReturn, NULL, 10);
|
ulDevicesNum = SDL_strtoul(stMCISysInfo.pszReturn, NULL, 10);
|
||||||
|
|
||||||
for (stSysInfoParams.ulNumber = 0; stSysInfoParams.ulNumber < ulDevicesNum;
|
for (ulNumber = 1; ulNumber <= ulDevicesNum;
|
||||||
stSysInfoParams.ulNumber++) {
|
ulNumber++) {
|
||||||
/* Get device install name. */
|
/* Get device install name. */
|
||||||
|
stSysInfoParams.ulNumber = ulNumber;
|
||||||
stSysInfoParams.pszReturn = acBuf;
|
stSysInfoParams.pszReturn = acBuf;
|
||||||
stSysInfoParams.ulRetSize = sizeof(acBuf);
|
stSysInfoParams.ulRetSize = sizeof(acBuf);
|
||||||
stSysInfoParams.usDeviceType = MCI_DEVTYPE_AUDIO_AMPMIX;
|
stSysInfoParams.usDeviceType = MCI_DEVTYPE_AUDIO_AMPMIX;
|
||||||
ulRC = mciSendCommand(0, MCI_SYSINFO, MCI_WAIT | MCI_SYSINFO_INSTALLNAME,
|
ulRC = mciSendCommand(0, MCI_SYSINFO, MCI_WAIT | MCI_SYSINFO_INSTALLNAME,
|
||||||
&stSysInfoParams, 0);
|
&stSysInfoParams, 0);
|
||||||
if (ulRC != NO_ERROR) {
|
if (LOUSHORT(ulRC) != MCIERR_SUCCESS) {
|
||||||
debug_os2("MCI_SYSINFO, MCI_SYSINFO_INSTALLNAME - failed, rc = 0x%X", ulRC);
|
debug_os2("MCI_SYSINFO, MCI_SYSINFO_INSTALLNAME - failed, rc = 0x%hX", LOUSHORT(ulRC));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,15 +186,45 @@ static void OS2_DetectDevices(void)
|
|||||||
SDL_strlcpy(stLogDevice.szInstallName, stSysInfoParams.pszReturn, MAX_DEVICE_NAME);
|
SDL_strlcpy(stLogDevice.szInstallName, stSysInfoParams.pszReturn, MAX_DEVICE_NAME);
|
||||||
ulRC = mciSendCommand(0, MCI_SYSINFO, MCI_WAIT | MCI_SYSINFO_ITEM,
|
ulRC = mciSendCommand(0, MCI_SYSINFO, MCI_WAIT | MCI_SYSINFO_ITEM,
|
||||||
&stSysInfoParams, 0);
|
&stSysInfoParams, 0);
|
||||||
if (ulRC != NO_ERROR) {
|
if (LOUSHORT(ulRC) != MCIERR_SUCCESS) {
|
||||||
debug_os2("MCI_SYSINFO, MCI_SYSINFO_ITEM - failed, rc = 0x%X", ulRC);
|
debug_os2("MCI_SYSINFO, MCI_SYSINFO_ITEM - failed, rc = 0x%hX", LOUSHORT(ulRC));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ulHandle++;
|
SDL_AddAudioDevice(0, stLogDevice.szProductInfo, NULL, (void *)ulNumber);
|
||||||
SDL_AddAudioDevice(0, stLogDevice.szProductInfo, NULL, (void *)(ulHandle));
|
|
||||||
ulHandle++;
|
/* Open audio device for querying its capabilities */
|
||||||
SDL_AddAudioDevice(1, stLogDevice.szProductInfo, NULL, (void *)(ulHandle));
|
/* at this point we HAVE TO OPEN the waveaudio device and not the ampmix device */
|
||||||
|
/* because only the waveaudio device (tied to the ampmix device) supports querying for playback/record capability */
|
||||||
|
SDL_memset(&stMCIOpen, 0, sizeof(stMCIOpen));
|
||||||
|
stMCIOpen.pszDeviceType = (PSZ)MAKEULONG(MCI_DEVTYPE_WAVEFORM_AUDIO,LOUSHORT(ulNumber));
|
||||||
|
ulRC = mciSendCommand(0, MCI_OPEN,MCI_WAIT | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE,&stMCIOpen, 0);
|
||||||
|
if (LOUSHORT(ulRC) != MCIERR_SUCCESS) {
|
||||||
|
debug_os2("MCI_OPEN (getDevCaps) - failed");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check for recording capability */
|
||||||
|
SDL_memset(&stDevCapsParams, 0, sizeof(stDevCapsParams));
|
||||||
|
stDevCapsParams.ulItem = MCI_GETDEVCAPS_CAN_RECORD;
|
||||||
|
ulRC = mciSendCommand(stMCIOpen.usDeviceID, MCI_GETDEVCAPS, MCI_WAIT | MCI_GETDEVCAPS_ITEM,
|
||||||
|
&stDevCapsParams, 0);
|
||||||
|
if (LOUSHORT(ulRC) != MCIERR_SUCCESS) {
|
||||||
|
debug_os2("MCI_GETDEVCAPS, MCI_GETDEVCAPS_ITEM - failed, rc = 0x%hX", LOUSHORT(ulRC));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (stDevCapsParams.ulReturn) {
|
||||||
|
SDL_AddAudioDevice(1, stLogDevice.szProductInfo, NULL, (void *)(ulNumber | 0x80000000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* close the audio device, we are done querying its capabilities */
|
||||||
|
SDL_memset(&stMCIGenericParams, 0, sizeof(stMCIGenericParams));
|
||||||
|
ulRC = mciSendCommand(stMCIOpen.usDeviceID, MCI_CLOSE, MCI_WAIT,
|
||||||
|
&stMCIGenericParams, 0);
|
||||||
|
if (LOUSHORT(ulRC) != MCIERR_SUCCESS) {
|
||||||
|
debug_os2("MCI_CLOSE (getDevCaps) - failed");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,52 +233,145 @@ static void OS2_WaitDevice(_THIS)
|
|||||||
SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)_this->hidden;
|
SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)_this->hidden;
|
||||||
ULONG ulRC;
|
ULONG ulRC;
|
||||||
|
|
||||||
|
debug_os2("Enter");
|
||||||
|
|
||||||
/* Wait for an audio chunk to finish */
|
/* Wait for an audio chunk to finish */
|
||||||
ulRC = DosWaitEventSem(pAData->hevBuf, 5000);
|
ulRC = DosWaitEventSem(pAData->hevBuf, 5000);
|
||||||
if (ulRC != NO_ERROR) {
|
if (ulRC != NO_ERROR) {
|
||||||
debug_os2("DosWaitEventSem(), rc = %u", ulRC);
|
debug_os2("DosWaitEventSem(), rc = %lu", ulRC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Uint8 *OS2_GetDeviceBuf(_THIS)
|
static Uint8 *OS2_GetDeviceBuf(_THIS)
|
||||||
{
|
{
|
||||||
SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)_this->hidden;
|
SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)_this->hidden;
|
||||||
return (Uint8 *) pAData->aMixBuffers[pAData->ulNextBuf].pBuffer;
|
|
||||||
|
debug_os2("Enter");
|
||||||
|
|
||||||
|
return (Uint8 *) pAData->pFillBuffer->pBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void OS2_PlayDevice(_THIS)
|
static void OS2_PlayDevice(_THIS)
|
||||||
{
|
{
|
||||||
SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)_this->hidden;
|
SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)_this->hidden;
|
||||||
ULONG ulRC;
|
ULONG ulRC;
|
||||||
PMCI_MIX_BUFFER pMixBuffer = &pAData->aMixBuffers[pAData->ulNextBuf];
|
PMCI_MIX_BUFFER pMixBuffer = NULL;
|
||||||
|
|
||||||
/* Queue it up */
|
debug_os2("Enter");
|
||||||
/*lockIncr((int *)&pAData->ulQueuedBuf);*/
|
|
||||||
ulRC = pAData->stMCIMixSetup.pmixWrite(pAData->stMCIMixSetup.ulMixHandle,
|
pMixBuffer = pAData->pDrainBuffer;
|
||||||
pMixBuffer, 1);
|
pAData->pFillBuffer = _getNextBuffer(pAData, pAData->pFillBuffer);
|
||||||
if (ulRC != MCIERR_SUCCESS) {
|
if (!pAData->ulState && pAData->pFillBuffer != pMixBuffer)
|
||||||
_mixIOError("pmixWrite", ulRC);
|
{
|
||||||
} else {
|
/*
|
||||||
pAData->ulNextBuf = (pAData->ulNextBuf + 1) % pAData->cMixBuffers;
|
* this buffer was filled but we have not yet filled all buffers
|
||||||
|
* so just signal event sem so that OS2_WaitDevice does not need
|
||||||
|
* to block
|
||||||
|
*/
|
||||||
|
ulRC = DosPostEventSem(pAData->hevBuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pAData->ulState && (pAData->pFillBuffer == pMixBuffer) )
|
||||||
|
{
|
||||||
|
debug_os2("!hasStarted");
|
||||||
|
pAData->ulState = 1;
|
||||||
|
|
||||||
|
/* Write buffers to kick off the amp mixer */
|
||||||
|
ulRC = pAData->stMCIMixSetup.pmixWrite(pAData->stMCIMixSetup.ulMixHandle,
|
||||||
|
pMixBuffer, pAData->cMixBuffers);
|
||||||
|
|
||||||
|
if (ulRC != MCIERR_SUCCESS) {
|
||||||
|
_mixIOError("pmixWrite", ulRC);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int OS2_CaptureFromDevice(_THIS,void *buffer,int buflen)
|
||||||
|
{
|
||||||
|
SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)_this->hidden;
|
||||||
|
ULONG ulRC;
|
||||||
|
PMCI_MIX_BUFFER pMixBuffer = NULL;
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
|
if (!pAData->ulState)
|
||||||
|
{
|
||||||
|
pAData->ulState = 1;
|
||||||
|
ulRC = pAData->stMCIMixSetup.pmixRead(pAData->stMCIMixSetup.ulMixHandle,
|
||||||
|
pAData->aMixBuffers, pAData->cMixBuffers);
|
||||||
|
if (ulRC != MCIERR_SUCCESS) {
|
||||||
|
_mixIOError("pmixRead", ulRC);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wait for an audio chunk to finish */
|
||||||
|
ulRC = DosWaitEventSem(pAData->hevBuf, 5000);
|
||||||
|
if (ulRC != NO_ERROR)
|
||||||
|
{
|
||||||
|
debug_os2("DosWaitEventSem(), rc = %lu", ulRC);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pMixBuffer = pAData->pDrainBuffer;
|
||||||
|
len = SDL_min((int)pMixBuffer->ulBufferLength, buflen);
|
||||||
|
SDL_memcpy(buffer,pMixBuffer->pBuffer, len);
|
||||||
|
pAData->pDrainBuffer = _getNextBuffer(pAData, pMixBuffer);
|
||||||
|
|
||||||
|
debug_os2("buflen = %u, ulBufferLength = %lu",buflen,pMixBuffer->ulBufferLength);
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void OS2_FlushCapture(_THIS)
|
||||||
|
{
|
||||||
|
SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)_this->hidden;
|
||||||
|
ULONG ulIdx;
|
||||||
|
|
||||||
|
debug_os2("Enter");
|
||||||
|
|
||||||
|
/* Fill all device buffers with data */
|
||||||
|
for (ulIdx = 0; ulIdx < pAData->cMixBuffers; ulIdx++) {
|
||||||
|
pAData->aMixBuffers[ulIdx].ulFlags = 0;
|
||||||
|
pAData->aMixBuffers[ulIdx].ulBufferLength = _this->spec.size;
|
||||||
|
pAData->aMixBuffers[ulIdx].ulUserParm = (ULONG)_this;
|
||||||
|
|
||||||
|
SDL_memset(((PMCI_MIX_BUFFER)pAData->aMixBuffers)[ulIdx].pBuffer,
|
||||||
|
_this->spec.silence, _this->spec.size);
|
||||||
|
}
|
||||||
|
pAData->pFillBuffer = pAData->aMixBuffers;
|
||||||
|
pAData->pDrainBuffer = pAData->aMixBuffers;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void OS2_CloseDevice(_THIS)
|
static void OS2_CloseDevice(_THIS)
|
||||||
{
|
{
|
||||||
SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)_this->hidden;
|
SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)_this->hidden;
|
||||||
MCI_GENERIC_PARMS sMCIGenericParms;
|
MCI_GENERIC_PARMS sMCIGenericParms;
|
||||||
ULONG ulRC;
|
ULONG ulRC;
|
||||||
|
|
||||||
|
debug_os2("Enter");
|
||||||
|
|
||||||
if (pAData == NULL)
|
if (pAData == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
pAData->ulState = 2;
|
||||||
|
|
||||||
/* Close up audio */
|
/* Close up audio */
|
||||||
if (pAData->usDeviceId != (USHORT)~0) { /* Device is open. */
|
if (pAData->usDeviceId != (USHORT)~0) { /* Device is open. */
|
||||||
|
SDL_zero(sMCIGenericParms);
|
||||||
|
|
||||||
|
ulRC = mciSendCommand(pAData->usDeviceId, MCI_STOP,
|
||||||
|
MCI_WAIT,
|
||||||
|
&sMCIGenericParms, 0);
|
||||||
|
if (LOUSHORT(ulRC) != MCIERR_SUCCESS) {
|
||||||
|
debug_os2("MCI_STOP - failed" );
|
||||||
|
}
|
||||||
|
|
||||||
if (pAData->stMCIMixSetup.ulBitsPerSample != 0) { /* Mixer was initialized. */
|
if (pAData->stMCIMixSetup.ulBitsPerSample != 0) { /* Mixer was initialized. */
|
||||||
ulRC = mciSendCommand(pAData->usDeviceId, MCI_MIXSETUP,
|
ulRC = mciSendCommand(pAData->usDeviceId, MCI_MIXSETUP,
|
||||||
MCI_WAIT | MCI_MIXSETUP_DEINIT,
|
MCI_WAIT | MCI_MIXSETUP_DEINIT,
|
||||||
&pAData->stMCIMixSetup, 0);
|
&pAData->stMCIMixSetup, 0);
|
||||||
if (ulRC != MCIERR_SUCCESS) {
|
if (LOUSHORT(ulRC) != MCIERR_SUCCESS) {
|
||||||
debug_os2("MCI_MIXSETUP, MCI_MIXSETUP_DEINIT - failed");
|
debug_os2("MCI_MIXSETUP, MCI_MIXSETUP_DEINIT - failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -230,14 +385,14 @@ static void OS2_CloseDevice(_THIS)
|
|||||||
|
|
||||||
ulRC = mciSendCommand(pAData->usDeviceId, MCI_BUFFER,
|
ulRC = mciSendCommand(pAData->usDeviceId, MCI_BUFFER,
|
||||||
MCI_WAIT | MCI_DEALLOCATE_MEMORY, &stMCIBuffer, 0);
|
MCI_WAIT | MCI_DEALLOCATE_MEMORY, &stMCIBuffer, 0);
|
||||||
if (ulRC != MCIERR_SUCCESS) {
|
if (LOUSHORT(ulRC) != MCIERR_SUCCESS) {
|
||||||
debug_os2("MCI_BUFFER, MCI_DEALLOCATE_MEMORY - failed");
|
debug_os2("MCI_BUFFER, MCI_DEALLOCATE_MEMORY - failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ulRC = mciSendCommand(pAData->usDeviceId, MCI_CLOSE, MCI_WAIT,
|
ulRC = mciSendCommand(pAData->usDeviceId, MCI_CLOSE, MCI_WAIT,
|
||||||
&sMCIGenericParms, 0);
|
&sMCIGenericParms, 0);
|
||||||
if (ulRC != MCIERR_SUCCESS) {
|
if (LOUSHORT(ulRC) != MCIERR_SUCCESS) {
|
||||||
debug_os2("MCI_CLOSE - failed");
|
debug_os2("MCI_CLOSE - failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -257,6 +412,7 @@ static int OS2_OpenDevice(_THIS, const char *devname)
|
|||||||
ULONG ulRC;
|
ULONG ulRC;
|
||||||
ULONG ulIdx;
|
ULONG ulIdx;
|
||||||
BOOL new_freq;
|
BOOL new_freq;
|
||||||
|
ULONG ulHandle = (ULONG)_this->handle;
|
||||||
SDL_bool iscapture = _this->iscapture;
|
SDL_bool iscapture = _this->iscapture;
|
||||||
|
|
||||||
new_freq = FALSE;
|
new_freq = FALSE;
|
||||||
@@ -279,20 +435,21 @@ static int OS2_OpenDevice(_THIS, const char *devname)
|
|||||||
|
|
||||||
ulRC = DosCreateEventSem(NULL, &pAData->hevBuf, DCE_AUTORESET, TRUE);
|
ulRC = DosCreateEventSem(NULL, &pAData->hevBuf, DCE_AUTORESET, TRUE);
|
||||||
if (ulRC != NO_ERROR) {
|
if (ulRC != NO_ERROR) {
|
||||||
debug_os2("DosCreateEventSem() failed, rc = %u", ulRC);
|
debug_os2("DosCreateEventSem() failed, rc = %lu", ulRC);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open audio device */
|
/* Open audio device */
|
||||||
stMCIAmpOpen.usDeviceID = (_this->handle != NULL) ? ((ULONG)_this->handle - 1) : 0;
|
stMCIAmpOpen.usDeviceID = 0;
|
||||||
stMCIAmpOpen.pszDeviceType = (PSZ)MCI_DEVTYPE_AUDIO_AMPMIX;
|
stMCIAmpOpen.pszDeviceType = (PSZ)MAKEULONG(MCI_DEVTYPE_AUDIO_AMPMIX,LOUSHORT(ulHandle));
|
||||||
ulRC = mciSendCommand(0, MCI_OPEN,
|
ulRC = mciSendCommand(0, MCI_OPEN,
|
||||||
(_getEnvULong("SDL_AUDIO_SHARE", 1, 0) != 0)?
|
(_getEnvULong("SDL_AUDIO_SHARE", 1, 0) != 0)?
|
||||||
MCI_WAIT | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE :
|
MCI_WAIT | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE :
|
||||||
MCI_WAIT | MCI_OPEN_TYPE_ID,
|
MCI_WAIT | MCI_OPEN_TYPE_ID,
|
||||||
&stMCIAmpOpen, 0);
|
&stMCIAmpOpen, 0);
|
||||||
if (ulRC != MCIERR_SUCCESS) {
|
if (LOUSHORT(ulRC) != MCIERR_SUCCESS) {
|
||||||
stMCIAmpOpen.usDeviceID = (USHORT)~0;
|
DosCloseEventSem(pAData->hevBuf);
|
||||||
|
pAData->usDeviceId = (USHORT)~0;
|
||||||
return _MCIError("MCI_OPEN", ulRC);
|
return _MCIError("MCI_OPEN", ulRC);
|
||||||
}
|
}
|
||||||
pAData->usDeviceId = stMCIAmpOpen.usDeviceID;
|
pAData->usDeviceId = stMCIAmpOpen.usDeviceID;
|
||||||
@@ -355,7 +512,7 @@ static int OS2_OpenDevice(_THIS, const char *devname)
|
|||||||
|
|
||||||
ulRC = mciSendCommand(pAData->usDeviceId, MCI_MIXSETUP,
|
ulRC = mciSendCommand(pAData->usDeviceId, MCI_MIXSETUP,
|
||||||
MCI_WAIT | MCI_MIXSETUP_INIT, &pAData->stMCIMixSetup, 0);
|
MCI_WAIT | MCI_MIXSETUP_INIT, &pAData->stMCIMixSetup, 0);
|
||||||
if (ulRC != MCIERR_SUCCESS && _this->spec.freq > 44100) {
|
if (LOUSHORT(ulRC) != MCIERR_SUCCESS && _this->spec.freq > 44100) {
|
||||||
new_freq = TRUE;
|
new_freq = TRUE;
|
||||||
pAData->stMCIMixSetup.ulSamplesPerSec = 44100;
|
pAData->stMCIMixSetup.ulSamplesPerSec = 44100;
|
||||||
_this->spec.freq = 44100;
|
_this->spec.freq = 44100;
|
||||||
@@ -363,7 +520,7 @@ static int OS2_OpenDevice(_THIS, const char *devname)
|
|||||||
MCI_WAIT | MCI_MIXSETUP_INIT, &pAData->stMCIMixSetup, 0);
|
MCI_WAIT | MCI_MIXSETUP_INIT, &pAData->stMCIMixSetup, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
debug_os2("Setup mixer [BPS: %u, Freq.: %u, Channels: %u]: %s",
|
debug_os2("Setup mixer [BPS: %lu, Freq.: %lu, Channels: %lu]: %s",
|
||||||
pAData->stMCIMixSetup.ulBitsPerSample,
|
pAData->stMCIMixSetup.ulBitsPerSample,
|
||||||
pAData->stMCIMixSetup.ulSamplesPerSec,
|
pAData->stMCIMixSetup.ulSamplesPerSec,
|
||||||
pAData->stMCIMixSetup.ulChannels,
|
pAData->stMCIMixSetup.ulChannels,
|
||||||
@@ -394,29 +551,25 @@ static int OS2_OpenDevice(_THIS, const char *devname)
|
|||||||
|
|
||||||
ulRC = mciSendCommand(pAData->usDeviceId, MCI_BUFFER,
|
ulRC = mciSendCommand(pAData->usDeviceId, MCI_BUFFER,
|
||||||
MCI_WAIT | MCI_ALLOCATE_MEMORY, &stMCIBuffer, 0);
|
MCI_WAIT | MCI_ALLOCATE_MEMORY, &stMCIBuffer, 0);
|
||||||
if (ulRC != MCIERR_SUCCESS) {
|
if (LOUSHORT(ulRC) != MCIERR_SUCCESS) {
|
||||||
return _MCIError("MCI_BUFFER", ulRC);
|
return _MCIError("MCI_BUFFER", ulRC);
|
||||||
}
|
}
|
||||||
pAData->cMixBuffers = stMCIBuffer.ulNumBuffers;
|
pAData->cMixBuffers = stMCIBuffer.ulNumBuffers;
|
||||||
_this->spec.size = stMCIBuffer.ulBufferSize;
|
_this->spec.size = stMCIBuffer.ulBufferSize;
|
||||||
|
|
||||||
|
debug_os2("%s, number of mix buffers: %lu",iscapture ? "capture": "play",pAData->cMixBuffers);
|
||||||
|
|
||||||
/* Fill all device buffers with data */
|
/* Fill all device buffers with data */
|
||||||
for (ulIdx = 0; ulIdx < stMCIBuffer.ulNumBuffers; ulIdx++) {
|
for (ulIdx = 0; ulIdx < stMCIBuffer.ulNumBuffers; ulIdx++) {
|
||||||
pAData->aMixBuffers[ulIdx].ulFlags = 0;
|
pAData->aMixBuffers[ulIdx].ulFlags = 0;
|
||||||
pAData->aMixBuffers[ulIdx].ulBufferLength = stMCIBuffer.ulBufferSize;
|
pAData->aMixBuffers[ulIdx].ulBufferLength = stMCIBuffer.ulBufferSize;
|
||||||
pAData->aMixBuffers[ulIdx].ulUserParm = (ULONG)pAData;
|
pAData->aMixBuffers[ulIdx].ulUserParm = (ULONG)_this;
|
||||||
|
|
||||||
SDL_memset(((PMCI_MIX_BUFFER)stMCIBuffer.pBufList)[ulIdx].pBuffer,
|
SDL_memset(((PMCI_MIX_BUFFER)stMCIBuffer.pBufList)[ulIdx].pBuffer,
|
||||||
_this->spec.silence, stMCIBuffer.ulBufferSize);
|
_this->spec.silence, stMCIBuffer.ulBufferSize);
|
||||||
}
|
}
|
||||||
|
pAData->pFillBuffer = pAData->aMixBuffers;
|
||||||
/* Write buffers to kick off the amp mixer */
|
pAData->pDrainBuffer = pAData->aMixBuffers;
|
||||||
ulRC = pAData->stMCIMixSetup.pmixWrite(pAData->stMCIMixSetup.ulMixHandle,
|
|
||||||
pAData->aMixBuffers, 1);
|
|
||||||
if (ulRC != MCIERR_SUCCESS) {
|
|
||||||
_mixIOError("pmixWrite", ulRC);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -431,12 +584,10 @@ static SDL_bool OS2_Init(SDL_AudioDriverImpl * impl)
|
|||||||
impl->WaitDevice = OS2_WaitDevice;
|
impl->WaitDevice = OS2_WaitDevice;
|
||||||
impl->GetDeviceBuf = OS2_GetDeviceBuf;
|
impl->GetDeviceBuf = OS2_GetDeviceBuf;
|
||||||
impl->CloseDevice = OS2_CloseDevice;
|
impl->CloseDevice = OS2_CloseDevice;
|
||||||
|
impl->CaptureFromDevice = OS2_CaptureFromDevice ;
|
||||||
/* TODO: IMPLEMENT CAPTURE SUPPORT:
|
impl->FlushCapture = OS2_FlushCapture;
|
||||||
impl->CaptureFromDevice = ;
|
|
||||||
impl->FlushCapture = ;
|
|
||||||
impl->HasCaptureSupport = SDL_TRUE;
|
impl->HasCaptureSupport = SDL_TRUE;
|
||||||
*/
|
|
||||||
return SDL_TRUE; /* this audio target is available. */
|
return SDL_TRUE; /* this audio target is available. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,10 +43,11 @@ typedef struct SDL_PrivateAudioData
|
|||||||
BYTE _pad[2];
|
BYTE _pad[2];
|
||||||
MCI_MIXSETUP_PARMS stMCIMixSetup;
|
MCI_MIXSETUP_PARMS stMCIMixSetup;
|
||||||
HEV hevBuf;
|
HEV hevBuf;
|
||||||
ULONG ulNextBuf;
|
PMCI_MIX_BUFFER pFillBuffer;
|
||||||
|
PMCI_MIX_BUFFER pDrainBuffer;
|
||||||
|
ULONG ulState;
|
||||||
ULONG cMixBuffers;
|
ULONG cMixBuffers;
|
||||||
MCI_MIX_BUFFER aMixBuffers[NUM_BUFFERS];
|
MCI_MIX_BUFFER aMixBuffers[NUM_BUFFERS];
|
||||||
/* ULONG ulQueuedBuf;*/
|
|
||||||
} SDL_PrivateAudioData;
|
} SDL_PrivateAudioData;
|
||||||
|
|
||||||
#endif /* SDL_os2mm_h_ */
|
#endif /* SDL_os2mm_h_ */
|
||||||
|
|||||||
@@ -233,6 +233,7 @@ static Uint8 *QSA_GetDeviceBuf(_THIS)
|
|||||||
static void QSA_CloseDevice(_THIS)
|
static void QSA_CloseDevice(_THIS)
|
||||||
{
|
{
|
||||||
if (this->hidden->audio_handle != NULL) {
|
if (this->hidden->audio_handle != NULL) {
|
||||||
|
#if _NTO_VERSION < 710
|
||||||
if (!this->iscapture) {
|
if (!this->iscapture) {
|
||||||
/* Finish playing available samples */
|
/* Finish playing available samples */
|
||||||
snd_pcm_plugin_flush(this->hidden->audio_handle,
|
snd_pcm_plugin_flush(this->hidden->audio_handle,
|
||||||
@@ -242,6 +243,7 @@ static void QSA_CloseDevice(_THIS)
|
|||||||
snd_pcm_plugin_flush(this->hidden->audio_handle,
|
snd_pcm_plugin_flush(this->hidden->audio_handle,
|
||||||
SND_PCM_CHANNEL_CAPTURE);
|
SND_PCM_CHANNEL_CAPTURE);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
snd_pcm_close(this->hidden->audio_handle);
|
snd_pcm_close(this->hidden->audio_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1939,12 +1939,12 @@ int Android_JNI_FileOpen(SDL_RWops *ctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (asset_manager == NULL) {
|
if (asset_manager == NULL) {
|
||||||
return -1;
|
return SDL_SetError("Couldn't create asset manager");
|
||||||
}
|
}
|
||||||
|
|
||||||
asset = AAssetManager_open(asset_manager, fileName, AASSET_MODE_UNKNOWN);
|
asset = AAssetManager_open(asset_manager, fileName, AASSET_MODE_UNKNOWN);
|
||||||
if (asset == NULL) {
|
if (asset == NULL) {
|
||||||
return -1;
|
return SDL_SetError("Couldn't open asset '%s'", fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->hidden.androidio.asset = (void *)asset;
|
ctx->hidden.androidio.asset = (void *)asset;
|
||||||
|
|||||||
@@ -401,7 +401,6 @@ void SDL_Fcitx_SetFocus(SDL_bool focused)
|
|||||||
void SDL_Fcitx_Reset(void)
|
void SDL_Fcitx_Reset(void)
|
||||||
{
|
{
|
||||||
FcitxClientICCallMethod(&fcitx_client, "Reset");
|
FcitxClientICCallMethod(&fcitx_client, "Reset");
|
||||||
FcitxClientICCallMethod(&fcitx_client, "CloseIC");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_bool SDL_Fcitx_ProcessKeyEvent(Uint32 keysym, Uint32 keycode, Uint8 state)
|
SDL_bool SDL_Fcitx_ProcessKeyEvent(Uint32 keysym, Uint32 keycode, Uint8 state)
|
||||||
|
|||||||
@@ -76,6 +76,19 @@
|
|||||||
#define WINVER _WIN32_WINNT
|
#define WINVER _WIN32_WINNT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* See https://github.com/libsdl-org/SDL/pull/7607 */
|
||||||
|
/* force_align_arg_pointer attribute requires gcc >= 4.2.x. */
|
||||||
|
#if defined(__clang__)
|
||||||
|
#define HAVE_FORCE_ALIGN_ARG_POINTER
|
||||||
|
#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
|
||||||
|
#define HAVE_FORCE_ALIGN_ARG_POINTER
|
||||||
|
#endif
|
||||||
|
#if defined(__GNUC__) && defined(__i386__) && defined(HAVE_FORCE_ALIGN_ARG_POINTER)
|
||||||
|
#define MINGW32_FORCEALIGN __attribute__((force_align_arg_pointer))
|
||||||
|
#else
|
||||||
|
#define MINGW32_FORCEALIGN
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <basetyps.h> /* for REFIID with broken mingw.org headers */
|
#include <basetyps.h> /* for REFIID with broken mingw.org headers */
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,8 @@
|
|||||||
/* Global keyboard information */
|
/* Global keyboard information */
|
||||||
|
|
||||||
#define KEYBOARD_HARDWARE 0x01
|
#define KEYBOARD_HARDWARE 0x01
|
||||||
#define KEYBOARD_AUTORELEASE 0x02
|
#define KEYBOARD_VIRTUAL 0x02
|
||||||
|
#define KEYBOARD_AUTORELEASE 0x04
|
||||||
|
|
||||||
typedef struct SDL_Keyboard SDL_Keyboard;
|
typedef struct SDL_Keyboard SDL_Keyboard;
|
||||||
|
|
||||||
@@ -47,6 +48,7 @@ struct SDL_Keyboard
|
|||||||
Uint8 keystate[SDL_NUM_SCANCODES];
|
Uint8 keystate[SDL_NUM_SCANCODES];
|
||||||
SDL_Keycode keymap[SDL_NUM_SCANCODES];
|
SDL_Keycode keymap[SDL_NUM_SCANCODES];
|
||||||
SDL_bool autorelease_pending;
|
SDL_bool autorelease_pending;
|
||||||
|
Uint32 hardware_timestamp;
|
||||||
};
|
};
|
||||||
|
|
||||||
static SDL_Keyboard SDL_keyboard;
|
static SDL_Keyboard SDL_keyboard;
|
||||||
@@ -865,7 +867,9 @@ static int SDL_SendKeyboardKeyInternal(Uint8 source, Uint8 state, SDL_Scancode s
|
|||||||
keycode = keyboard->keymap[scancode];
|
keycode = keyboard->keymap[scancode];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (source == KEYBOARD_AUTORELEASE) {
|
if (source == KEYBOARD_HARDWARE) {
|
||||||
|
keyboard->hardware_timestamp = SDL_GetTicks();
|
||||||
|
} else if (source == KEYBOARD_AUTORELEASE) {
|
||||||
keyboard->autorelease_pending = SDL_TRUE;
|
keyboard->autorelease_pending = SDL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -965,20 +969,25 @@ int SDL_SendKeyboardUnicodeKey(Uint32 ch)
|
|||||||
|
|
||||||
if (mod & KMOD_SHIFT) {
|
if (mod & KMOD_SHIFT) {
|
||||||
/* If the character uses shift, press shift down */
|
/* If the character uses shift, press shift down */
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_LSHIFT);
|
SDL_SendKeyboardKeyInternal(KEYBOARD_VIRTUAL, SDL_PRESSED, SDL_SCANCODE_LSHIFT, SDLK_UNKNOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send a keydown and keyup for the character */
|
/* Send a keydown and keyup for the character */
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED, code);
|
SDL_SendKeyboardKeyInternal(KEYBOARD_VIRTUAL, SDL_PRESSED, code, SDLK_UNKNOWN);
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, code);
|
SDL_SendKeyboardKeyInternal(KEYBOARD_VIRTUAL, SDL_RELEASED, code, SDLK_UNKNOWN);
|
||||||
|
|
||||||
if (mod & KMOD_SHIFT) {
|
if (mod & KMOD_SHIFT) {
|
||||||
/* If the character uses shift, release shift */
|
/* If the character uses shift, release shift */
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT);
|
SDL_SendKeyboardKeyInternal(KEYBOARD_VIRTUAL, SDL_RELEASED, SDL_SCANCODE_LSHIFT, SDLK_UNKNOWN);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int SDL_SendVirtualKeyboardKey(Uint8 state, SDL_Scancode scancode)
|
||||||
|
{
|
||||||
|
return SDL_SendKeyboardKeyInternal(KEYBOARD_VIRTUAL, state, scancode, SDLK_UNKNOWN);
|
||||||
|
}
|
||||||
|
|
||||||
int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
|
int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
|
||||||
{
|
{
|
||||||
return SDL_SendKeyboardKeyInternal(KEYBOARD_HARDWARE, state, scancode, SDLK_UNKNOWN);
|
return SDL_SendKeyboardKeyInternal(KEYBOARD_HARDWARE, state, scancode, SDLK_UNKNOWN);
|
||||||
@@ -1007,6 +1016,13 @@ void SDL_ReleaseAutoReleaseKeys(void)
|
|||||||
}
|
}
|
||||||
keyboard->autorelease_pending = SDL_FALSE;
|
keyboard->autorelease_pending = SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (keyboard->hardware_timestamp) {
|
||||||
|
/* Keep hardware keyboard "active" for 250 ms */
|
||||||
|
if (SDL_TICKS_PASSED(SDL_GetTicks(), keyboard->hardware_timestamp + 250)) {
|
||||||
|
keyboard->hardware_timestamp = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_bool SDL_HardwareKeyboardKeyPressed(void)
|
SDL_bool SDL_HardwareKeyboardKeyPressed(void)
|
||||||
@@ -1019,7 +1035,8 @@ SDL_bool SDL_HardwareKeyboardKeyPressed(void)
|
|||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return SDL_FALSE;
|
|
||||||
|
return keyboard->hardware_timestamp ? SDL_TRUE : SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SDL_SendKeyboardText(const char *text)
|
int SDL_SendKeyboardText(const char *text)
|
||||||
|
|||||||
@@ -52,6 +52,9 @@ extern void SDL_SetKeyboardFocus(SDL_Window *window);
|
|||||||
*/
|
*/
|
||||||
extern int SDL_SendKeyboardUnicodeKey(Uint32 ch);
|
extern int SDL_SendKeyboardUnicodeKey(Uint32 ch);
|
||||||
|
|
||||||
|
/* Send a key from a virtual key source, like an on-screen keyboard */
|
||||||
|
extern int SDL_SendVirtualKeyboardKey(Uint8 state, SDL_Scancode scancode);
|
||||||
|
|
||||||
/* Send a keyboard key event */
|
/* Send a keyboard key event */
|
||||||
extern int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode);
|
extern int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode);
|
||||||
extern int SDL_SendKeyboardKeyAutoRelease(SDL_Scancode scancode);
|
extern int SDL_SendKeyboardKeyAutoRelease(SDL_Scancode scancode);
|
||||||
|
|||||||
@@ -277,8 +277,9 @@ windows_file_write(SDL_RWops *context, const void *ptr, size_t size,
|
|||||||
|
|
||||||
/* if in append mode, we must go to the EOF before write */
|
/* if in append mode, we must go to the EOF before write */
|
||||||
if (context->hidden.windowsio.append) {
|
if (context->hidden.windowsio.append) {
|
||||||
if (SetFilePointer(context->hidden.windowsio.h, 0L, NULL, FILE_END) ==
|
LARGE_INTEGER windowsoffset;
|
||||||
INVALID_SET_FILE_POINTER) {
|
windowsoffset.QuadPart = 0;
|
||||||
|
if (!SetFilePointerEx(context->hidden.windowsio.h, windowsoffset, &windowsoffset, FILE_END)) {
|
||||||
SDL_Error(SDL_EFWRITE);
|
SDL_Error(SDL_EFWRITE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -647,7 +648,7 @@ SDL_RWops *SDL_RWFromMem(void *mem, int size)
|
|||||||
SDL_InvalidParamError("mem");
|
SDL_InvalidParamError("mem");
|
||||||
return rwops;
|
return rwops;
|
||||||
}
|
}
|
||||||
if (!size) {
|
if (size <= 0) {
|
||||||
SDL_InvalidParamError("size");
|
SDL_InvalidParamError("size");
|
||||||
return rwops;
|
return rwops;
|
||||||
}
|
}
|
||||||
@@ -674,7 +675,7 @@ SDL_RWops *SDL_RWFromConstMem(const void *mem, int size)
|
|||||||
SDL_InvalidParamError("mem");
|
SDL_InvalidParamError("mem");
|
||||||
return rwops;
|
return rwops;
|
||||||
}
|
}
|
||||||
if (!size) {
|
if (size <= 0) {
|
||||||
SDL_InvalidParamError("size");
|
SDL_InvalidParamError("size");
|
||||||
return rwops;
|
return rwops;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -711,6 +711,7 @@ static int is_xboxone(unsigned short vendor_id, const struct libusb_interface_de
|
|||||||
static const int XB1_IFACE_SUBCLASS = 71;
|
static const int XB1_IFACE_SUBCLASS = 71;
|
||||||
static const int XB1_IFACE_PROTOCOL = 208;
|
static const int XB1_IFACE_PROTOCOL = 208;
|
||||||
static const int SUPPORTED_VENDORS[] = {
|
static const int SUPPORTED_VENDORS[] = {
|
||||||
|
0x03f0, /* HP */
|
||||||
0x044f, /* Thrustmaster */
|
0x044f, /* Thrustmaster */
|
||||||
0x045e, /* Microsoft */
|
0x045e, /* Microsoft */
|
||||||
0x0738, /* Mad Catz */
|
0x0738, /* Mad Catz */
|
||||||
|
|||||||
@@ -884,9 +884,9 @@ int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data,
|
|||||||
unsigned char report = data[0];
|
unsigned char report = data[0];
|
||||||
|
|
||||||
res = ioctl(dev->device_handle, HIDIOCGFEATURE(length), data);
|
res = ioctl(dev->device_handle, HIDIOCGFEATURE(length), data);
|
||||||
if (res < 0)
|
if (res < 0) {
|
||||||
perror("ioctl (GFEATURE)");
|
/* perror("ioctl (GFEATURE)"); */
|
||||||
else if (dev->needs_ble_hack) {
|
} else if (dev->needs_ble_hack) {
|
||||||
/* Versions of BlueZ before 5.56 don't include the report in the data,
|
/* Versions of BlueZ before 5.56 don't include the report in the data,
|
||||||
* and versions of BlueZ >= 5.56 include 2 copies of the report.
|
* and versions of BlueZ >= 5.56 include 2 copies of the report.
|
||||||
* We'll fix it so that there is a single copy of the report in both cases
|
* We'll fix it so that there is a single copy of the report in both cases
|
||||||
|
|||||||
@@ -572,7 +572,9 @@ static ControllerMapping_t *SDL_CreateMappingForHIDAPIController(SDL_JoystickGUI
|
|||||||
/* GameCube driver has 12 buttons and 6 axes */
|
/* GameCube driver has 12 buttons and 6 axes */
|
||||||
SDL_strlcat(mapping_string, "a:b0,b:b1,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3,start:b8,x:b2,y:b3,", sizeof(mapping_string));
|
SDL_strlcat(mapping_string, "a:b0,b:b1,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3,start:b8,x:b2,y:b3,", sizeof(mapping_string));
|
||||||
} else if (vendor == USB_VENDOR_NINTENDO &&
|
} else if (vendor == USB_VENDOR_NINTENDO &&
|
||||||
(guid.data[15] == k_eSwitchDeviceInfoControllerType_NESLeft ||
|
(guid.data[15] == k_eSwitchDeviceInfoControllerType_HVCLeft ||
|
||||||
|
guid.data[15] == k_eSwitchDeviceInfoControllerType_HVCRight ||
|
||||||
|
guid.data[15] == k_eSwitchDeviceInfoControllerType_NESLeft ||
|
||||||
guid.data[15] == k_eSwitchDeviceInfoControllerType_NESRight ||
|
guid.data[15] == k_eSwitchDeviceInfoControllerType_NESRight ||
|
||||||
guid.data[15] == k_eSwitchDeviceInfoControllerType_SNES ||
|
guid.data[15] == k_eSwitchDeviceInfoControllerType_SNES ||
|
||||||
guid.data[15] == k_eSwitchDeviceInfoControllerType_N64 ||
|
guid.data[15] == k_eSwitchDeviceInfoControllerType_N64 ||
|
||||||
@@ -582,6 +584,12 @@ static ControllerMapping_t *SDL_CreateMappingForHIDAPIController(SDL_JoystickGUI
|
|||||||
guid.data[15] == k_eSwitchDeviceInfoControllerType_JoyConLeft ||
|
guid.data[15] == k_eSwitchDeviceInfoControllerType_JoyConLeft ||
|
||||||
guid.data[15] == k_eSwitchDeviceInfoControllerType_JoyConRight)) {
|
guid.data[15] == k_eSwitchDeviceInfoControllerType_JoyConRight)) {
|
||||||
switch (guid.data[15]) {
|
switch (guid.data[15]) {
|
||||||
|
case k_eSwitchDeviceInfoControllerType_HVCLeft:
|
||||||
|
SDL_strlcat(mapping_string, "a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,rightshoulder:b10,start:b6,", sizeof(mapping_string));
|
||||||
|
break;
|
||||||
|
case k_eSwitchDeviceInfoControllerType_HVCRight:
|
||||||
|
SDL_strlcat(mapping_string, "a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,rightshoulder:b10,", sizeof(mapping_string));
|
||||||
|
break;
|
||||||
case k_eSwitchDeviceInfoControllerType_NESLeft:
|
case k_eSwitchDeviceInfoControllerType_NESLeft:
|
||||||
case k_eSwitchDeviceInfoControllerType_NESRight:
|
case k_eSwitchDeviceInfoControllerType_NESRight:
|
||||||
SDL_strlcat(mapping_string, "a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,rightshoulder:b10,start:b6,", sizeof(mapping_string));
|
SDL_strlcat(mapping_string, "a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,rightshoulder:b10,start:b6,", sizeof(mapping_string));
|
||||||
|
|||||||
@@ -134,9 +134,7 @@ static const char *s_ControllerMappings[] = {
|
|||||||
"03000000b80500000610000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,",
|
"03000000b80500000610000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,",
|
||||||
"03000000852100000201000000000000,FF-GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
"03000000852100000201000000000000,FF-GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||||
"030000000d0f00002700000000000000,FIGHTING STICK V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
"030000000d0f00002700000000000000,FIGHTING STICK V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||||
"03000000151900004000000000000000,Flydigi Vader 2,a:b27,b:b26,back:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b23,leftstick:b17,lefttrigger:b21,leftx:a0,lefty:a1,misc1:b15,paddle1:b11,paddle2:b10,paddle3:b13,paddle4:b12,rightshoulder:b22,rightstick:b16,righttrigger:b20,rightx:a3,righty:a4,start:b18,x:b25,y:b24,", /* Bluetooth */
|
"03000000790000000600000000000000,G-Shark GS-GP702,crc:8e4f,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||||
"03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b14,paddle1:b4,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,", /* Dongle */
|
|
||||||
"03000000b40400001224000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,", /* Wired */
|
|
||||||
"030000008f0e00000d31000000000000,GAMEPAD 3 TURBO,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
"030000008f0e00000d31000000000000,GAMEPAD 3 TURBO,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||||
"03000000300f00000b01000000000000,GGE909 Recoil Pad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,",
|
"03000000300f00000b01000000000000,GGE909 Recoil Pad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,",
|
||||||
"03000000790000002201000000000000,Game Controller for PC,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
"03000000790000002201000000000000,Game Controller for PC,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||||
@@ -416,9 +414,6 @@ static const char *s_ControllerMappings[] = {
|
|||||||
"03000000a306000022f6000001030000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,",
|
"03000000a306000022f6000001030000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,",
|
||||||
"030000000d0f00008400000000010000,Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
"030000000d0f00008400000000010000,Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||||
"030000000d0f00008500000000010000,Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
"030000000d0f00008500000000010000,Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||||
"03000000151900004000000001000000,Flydigi Vader 2,a:b14,b:b15,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b0,y:b1,", /* Bluetooth */
|
|
||||||
"03000000b40400001124000001040000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,", /* Dongle */
|
|
||||||
"03000000b40400001224000003030000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,", /* Wired */
|
|
||||||
"03000000ac0500001a06000002020000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
"03000000ac0500001a06000002020000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||||
"0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
"0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||||
"03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
"03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||||
@@ -598,6 +593,7 @@ static const char *s_ControllerMappings[] = {
|
|||||||
"05000000503200000110000000000000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,",
|
"05000000503200000110000000000000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,",
|
||||||
"03000000503200000210000000000000,Atari Game Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,",
|
"03000000503200000210000000000000,Atari Game Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,",
|
||||||
"05000000503200000210000000000000,Atari Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,",
|
"05000000503200000210000000000000,Atari Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,",
|
||||||
|
"05000000503200000210000000000000128804098,Atari Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,",
|
||||||
"030000005e0400008e02000047010000,Atari Xbox 360 Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
"030000005e0400008e02000047010000,Atari Xbox 360 Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||||
"03000000c62400001b89000011010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
"03000000c62400001b89000011010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||||
"03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
"03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||||
@@ -610,9 +606,6 @@ static const char *s_ControllerMappings[] = {
|
|||||||
"050000004c050000f20d000000010000,DualSense Edge Wireless Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
"050000004c050000f20d000000010000,DualSense Edge Wireless Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||||
"030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
"030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||||
"03000000790000001100000010010000,Elecom Gamepad,crc:e86c,a:b2,b:b3,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b0,y:b1,",
|
"03000000790000001100000010010000,Elecom Gamepad,crc:e86c,a:b2,b:b3,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b0,y:b1,",
|
||||||
"03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,", /* Dongle */
|
|
||||||
"03000000b40400001224000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,", /* Wired */
|
|
||||||
"05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,", /* Bluetooth */
|
|
||||||
"0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
"0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||||
"0500000047532067616d657061640000,GS Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
"0500000047532067616d657061640000,GS Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,",
|
||||||
"03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,",
|
"03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,",
|
||||||
@@ -660,6 +653,7 @@ static const char *s_ControllerMappings[] = {
|
|||||||
"03000000300f00001001000010010000,Jess Tech Dual Analog Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,",
|
"03000000300f00001001000010010000,Jess Tech Dual Analog Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,",
|
||||||
"03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,",
|
"03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,",
|
||||||
"030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
"030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||||
|
"030000006d040000d1ca000011010000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||||
"030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
"030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||||
"030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
"030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||||
"030000006d04000016c2000011010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
"030000006d04000016c2000011010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||||
@@ -823,6 +817,7 @@ static const char *s_ControllerMappings[] = {
|
|||||||
"05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,",
|
"05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,",
|
||||||
"05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,",
|
"05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,",
|
||||||
"05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,",
|
"05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,",
|
||||||
|
"03000000de2800000512000011010000,Steam Deck,a:b3,b:b4,back:b11,dpdown:b17,dpleft:b18,dpright:b19,dpup:b16,guide:b13,leftshoulder:b7,leftstick:b14,lefttrigger:a9,leftx:a0,lefty:a1,misc1:b2,paddle1:b21,paddle2:b20,paddle3:b23,paddle4:b22,rightshoulder:b8,rightstick:b15,righttrigger:a8,rightx:a2,righty:a3,start:b12,x:b5,y:b6,",
|
||||||
"03000000de280000ff11000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
"03000000de280000ff11000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||||
"0500000011010000311400001b010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b32,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
"0500000011010000311400001b010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b32,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||||
"05000000110100001914000009010000,SteelSeries Stratus XL,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b18,leftshoulder:b6,leftstick:b13,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:+a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
"05000000110100001914000009010000,SteelSeries Stratus XL,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b18,leftshoulder:b6,leftstick:b13,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:+a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||||
@@ -855,6 +850,8 @@ static const char *s_ControllerMappings[] = {
|
|||||||
"0000000058626f782033363020576900,Xbox 360 Wireless Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,",
|
"0000000058626f782033363020576900,Xbox 360 Wireless Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,",
|
||||||
"030000005e040000a102000014010000,Xbox 360 Wireless Receiver (XBOX),a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
"030000005e040000a102000014010000,Xbox 360 Wireless Receiver (XBOX),a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||||
"0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,",
|
"0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,",
|
||||||
|
"050000005e040000e002000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||||
|
"050000005e040000fd02000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,guide:b16,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,",
|
||||||
"05000000172700004431000029010000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,",
|
"05000000172700004431000029010000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,",
|
||||||
"03000000c0160000e105000010010000,Xin-Mo Dual Arcade,crc:82d5,a:b1,b:b2,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b4,righttrigger:b5,start:b8,x:b0,y:b3,", /* Ultimate Atari Fight Stick */
|
"03000000c0160000e105000010010000,Xin-Mo Dual Arcade,crc:82d5,a:b1,b:b2,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b4,righttrigger:b5,start:b8,x:b0,y:b3,", /* Ultimate Atari Fight Stick */
|
||||||
"03000000120c0000100e000011010000,ZEROPLUS P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
"03000000120c0000100e000011010000,ZEROPLUS P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||||
@@ -906,7 +903,6 @@ static const char *s_ControllerMappings[] = {
|
|||||||
"05000000c82d000018900000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
"05000000c82d000018900000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
"05000000c82d000030320000ffff0f00,8BitDo Zero 2,a:b0,b:b1,back:b4,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
"05000000c82d000030320000ffff0f00,8BitDo Zero 2,a:b0,b:b1,back:b4,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
"05000000c82d000030320000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
"05000000c82d000030320000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
"05000000b404000011240000dfff3f00,Flydigi Vader 2,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,",
|
|
||||||
"05000000d6020000e5890000dfff3f80,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,",
|
"05000000d6020000e5890000dfff3f80,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,",
|
||||||
"0500000031366332860c44aadfff0f00,GS Gamepad,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b2,y:b3,",
|
"0500000031366332860c44aadfff0f00,GS Gamepad,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b2,y:b3,",
|
||||||
"05000000bc20000000550000ffff3f00,GameSir G3w,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,",
|
"05000000bc20000000550000ffff3f00,GameSir G3w,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,",
|
||||||
|
|||||||
@@ -221,10 +221,10 @@ static int SDL_FindFreePlayerIndex()
|
|||||||
|
|
||||||
for (player_index = 0; player_index < SDL_joystick_player_count; ++player_index) {
|
for (player_index = 0; player_index < SDL_joystick_player_count; ++player_index) {
|
||||||
if (SDL_joystick_players[player_index] == -1) {
|
if (SDL_joystick_players[player_index] == -1) {
|
||||||
return player_index;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1;
|
return player_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int SDL_GetPlayerIndexForJoystickID(SDL_JoystickID instance_id)
|
static int SDL_GetPlayerIndexForJoystickID(SDL_JoystickID instance_id)
|
||||||
@@ -1906,7 +1906,7 @@ void SDL_GetJoystickGUIDInfo(SDL_JoystickGUID guid, Uint16 *vendor, Uint16 *prod
|
|||||||
if (crc16) {
|
if (crc16) {
|
||||||
*crc16 = SDL_SwapLE16(guid16[1]);
|
*crc16 = SDL_SwapLE16(guid16[1]);
|
||||||
}
|
}
|
||||||
} else if (bus < ' ') {
|
} else if (bus < ' ' || bus == SDL_HARDWARE_BUS_VIRTUAL) {
|
||||||
/* This GUID fits the unknown VID/PID form:
|
/* This GUID fits the unknown VID/PID form:
|
||||||
* 16-bit bus
|
* 16-bit bus
|
||||||
* 16-bit CRC16 of the joystick name (can be zero)
|
* 16-bit CRC16 of the joystick name (can be zero)
|
||||||
@@ -2346,7 +2346,8 @@ SDL_bool SDL_IsJoystickXboxSeriesX(Uint16 vendor_id, Uint16 product_id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (vendor_id == USB_VENDOR_8BITDO) {
|
if (vendor_id == USB_VENDOR_8BITDO) {
|
||||||
if (product_id == USB_PRODUCT_8BITDO_XBOX_CONTROLLER) {
|
if (product_id == USB_PRODUCT_8BITDO_XBOX_CONTROLLER1 ||
|
||||||
|
product_id == USB_PRODUCT_8BITDO_XBOX_CONTROLLER2) {
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2479,8 +2480,11 @@ static SDL_bool SDL_IsJoystickProductWheel(Uint32 vidpid)
|
|||||||
MAKE_VIDPID(0x046d, 0xc262), /* Logitech G920 (active mode) */
|
MAKE_VIDPID(0x046d, 0xc262), /* Logitech G920 (active mode) */
|
||||||
MAKE_VIDPID(0x046d, 0xc268), /* Logitech PRO Racing Wheel (PC mode) */
|
MAKE_VIDPID(0x046d, 0xc268), /* Logitech PRO Racing Wheel (PC mode) */
|
||||||
MAKE_VIDPID(0x046d, 0xc269), /* Logitech PRO Racing Wheel (PS4/PS5 mode) */
|
MAKE_VIDPID(0x046d, 0xc269), /* Logitech PRO Racing Wheel (PS4/PS5 mode) */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc272), /* Logitech PRO Racing Wheel for Xbox (PC mode) */
|
||||||
MAKE_VIDPID(0x046d, 0xc26d), /* Logitech G923 (Xbox) */
|
MAKE_VIDPID(0x046d, 0xc26d), /* Logitech G923 (Xbox) */
|
||||||
MAKE_VIDPID(0x046d, 0xc26e), /* Logitech G923 */
|
MAKE_VIDPID(0x046d, 0xc26e), /* Logitech G923 */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc266), /* Logitech G923 for Playstation 4 and PC (PC mode) */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc267), /* Logitech G923 for Playstation 4 and PC (PS4 mode)*/
|
||||||
MAKE_VIDPID(0x046d, 0xca03), /* Logitech Momo Racing */
|
MAKE_VIDPID(0x046d, 0xca03), /* Logitech Momo Racing */
|
||||||
MAKE_VIDPID(0x044f, 0xb65d), /* Thrustmaster Wheel FFB */
|
MAKE_VIDPID(0x044f, 0xb65d), /* Thrustmaster Wheel FFB */
|
||||||
MAKE_VIDPID(0x044f, 0xb66d), /* Thrustmaster Wheel FFB */
|
MAKE_VIDPID(0x044f, 0xb66d), /* Thrustmaster Wheel FFB */
|
||||||
@@ -2492,7 +2496,22 @@ static SDL_bool SDL_IsJoystickProductWheel(Uint32 vidpid)
|
|||||||
MAKE_VIDPID(0x044f, 0xb65e), /* Thrustmaster T500RS */
|
MAKE_VIDPID(0x044f, 0xb65e), /* Thrustmaster T500RS */
|
||||||
MAKE_VIDPID(0x044f, 0xb664), /* Thrustmaster TX (initial mode) */
|
MAKE_VIDPID(0x044f, 0xb664), /* Thrustmaster TX (initial mode) */
|
||||||
MAKE_VIDPID(0x044f, 0xb669), /* Thrustmaster TX (active mode) */
|
MAKE_VIDPID(0x044f, 0xb669), /* Thrustmaster TX (active mode) */
|
||||||
|
MAKE_VIDPID(0x0483, 0x0522), /* Simagic Wheelbase (including M10, Alpha Mini, Alpha, Alpha U) */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0001), /* Fanatec ClubSport Wheel Base V2 */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0004), /* Fanatec ClubSport Wheel Base V2.5 */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0005), /* Fanatec CSL Elite Wheel Base+ (PS4) */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0006), /* Fanatec Podium Wheel Base DD1 */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0007), /* Fanatec Podium Wheel Base DD2 */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0011), /* Fanatec Forza Motorsport (CSR Wheel / CSR Elite Wheel) */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0020), /* Fanatec generic wheel / CSL DD / GT DD Pro */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0197), /* Fanatec Porsche Wheel (Turbo / GT3 RS / Turbo S / GT3 V2 / GT2) */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x038e), /* Fanatec ClubSport Wheel Base V1 */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0e03), /* Fanatec CSL Elite Wheel Base */
|
||||||
MAKE_VIDPID(0x11ff, 0x0511), /* DragonRise Inc. Wired Wheel (initial mode) (also known as PXN V900 (PS3), Superdrive SV-750, or a Genesis Seaborg 400) */
|
MAKE_VIDPID(0x11ff, 0x0511), /* DragonRise Inc. Wired Wheel (initial mode) (also known as PXN V900 (PS3), Superdrive SV-750, or a Genesis Seaborg 400) */
|
||||||
|
MAKE_VIDPID(0x2433, 0xf300), /* Asetek SimSports Invicta Wheelbase */
|
||||||
|
MAKE_VIDPID(0x2433, 0xf301), /* Asetek SimSports Forte Wheelbase */
|
||||||
|
MAKE_VIDPID(0x2433, 0xf303), /* Asetek SimSports La Prima Wheelbase */
|
||||||
|
MAKE_VIDPID(0x2433, 0xf306), /* Asetek SimSports Tony Kannan Wheelbase */
|
||||||
};
|
};
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -2774,6 +2793,7 @@ SDL_bool SDL_ShouldIgnoreJoystick(const char *name, SDL_JoystickGUID guid)
|
|||||||
};
|
};
|
||||||
|
|
||||||
static Uint32 rog_chakram_list[] = {
|
static Uint32 rog_chakram_list[] = {
|
||||||
|
MAKE_VIDPID(0x0b05, 0x1906), /* ROG Pugio II */
|
||||||
MAKE_VIDPID(0x0b05, 0x1958), /* ROG Chakram Core Mouse */
|
MAKE_VIDPID(0x0b05, 0x1958), /* ROG Chakram Core Mouse */
|
||||||
MAKE_VIDPID(0x0b05, 0x18e3), /* ROG Chakram (wired) Mouse */
|
MAKE_VIDPID(0x0b05, 0x18e3), /* ROG Chakram (wired) Mouse */
|
||||||
MAKE_VIDPID(0x0b05, 0x18e5), /* ROG Chakram (wireless) Mouse */
|
MAKE_VIDPID(0x0b05, 0x18e5), /* ROG Chakram (wireless) Mouse */
|
||||||
|
|||||||
@@ -294,6 +294,7 @@ static const ControllerDescription_t arrControllers[] = {
|
|||||||
{ MAKE_CONTROLLER_ID( 0x24c6, 0xfafd ), k_eControllerType_XBox360Controller, NULL }, // Afterglow Gamepad 3
|
{ MAKE_CONTROLLER_ID( 0x24c6, 0xfafd ), k_eControllerType_XBox360Controller, NULL }, // Afterglow Gamepad 3
|
||||||
{ MAKE_CONTROLLER_ID( 0x24c6, 0xfafe ), k_eControllerType_XBox360Controller, NULL }, // Rock Candy Gamepad for Xbox 360
|
{ MAKE_CONTROLLER_ID( 0x24c6, 0xfafe ), k_eControllerType_XBox360Controller, NULL }, // Rock Candy Gamepad for Xbox 360
|
||||||
|
|
||||||
|
{ MAKE_CONTROLLER_ID( 0x03f0, 0x0495 ), k_eControllerType_XBoxOneController, NULL }, // HP HyperX Clutch Gladiate
|
||||||
{ MAKE_CONTROLLER_ID( 0x044f, 0xd012 ), k_eControllerType_XBoxOneController, NULL }, // ThrustMaster eSwap PRO Controller Xbox
|
{ MAKE_CONTROLLER_ID( 0x044f, 0xd012 ), k_eControllerType_XBoxOneController, NULL }, // ThrustMaster eSwap PRO Controller Xbox
|
||||||
{ MAKE_CONTROLLER_ID( 0x045e, 0x02d1 ), k_eControllerType_XBoxOneController, "Xbox One Controller" }, // Microsoft X-Box One pad
|
{ MAKE_CONTROLLER_ID( 0x045e, 0x02d1 ), k_eControllerType_XBoxOneController, "Xbox One Controller" }, // Microsoft X-Box One pad
|
||||||
{ MAKE_CONTROLLER_ID( 0x045e, 0x02dd ), k_eControllerType_XBoxOneController, "Xbox One Controller" }, // Microsoft X-Box One pad (Firmware 2015)
|
{ MAKE_CONTROLLER_ID( 0x045e, 0x02dd ), k_eControllerType_XBoxOneController, "Xbox One Controller" }, // Microsoft X-Box One pad (Firmware 2015)
|
||||||
|
|||||||
@@ -657,8 +657,8 @@ static SDL_bool CreateHIDManager(void)
|
|||||||
|
|
||||||
static int DARWIN_JoystickInit(void)
|
static int DARWIN_JoystickInit(void)
|
||||||
{
|
{
|
||||||
if (gpDeviceList) {
|
if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_IOKIT, SDL_TRUE)) {
|
||||||
return SDL_SetError("Joystick: Device list already inited.");
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CreateHIDManager()) {
|
if (!CreateHIDManager()) {
|
||||||
@@ -694,10 +694,12 @@ static void DARWIN_JoystickDetect(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* run this after the checks above so we don't set device->removed and delete the device before
|
if (hidman) {
|
||||||
DARWIN_JoystickUpdate can run to clean up the SDL_Joystick object that owns this device */
|
/* run this after the checks above so we don't set device->removed and delete the device before
|
||||||
while (CFRunLoopRunInMode(SDL_JOYSTICK_RUNLOOP_MODE, 0, TRUE) == kCFRunLoopRunHandledSource) {
|
DARWIN_JoystickUpdate can run to clean up the SDL_Joystick object that owns this device */
|
||||||
/* no-op. Pending callbacks will fire in CFRunLoopRunInMode(). */
|
while (CFRunLoopRunInMode(SDL_JOYSTICK_RUNLOOP_MODE, 0, TRUE) == kCFRunLoopRunHandledSource) {
|
||||||
|
/* no-op. Pending callbacks will fire in CFRunLoopRunInMode(). */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ static SDL_joylist_item *JoystickByIndex(int index);
|
|||||||
static SDL_joylist_item *SDL_joylist = NULL;
|
static SDL_joylist_item *SDL_joylist = NULL;
|
||||||
static SDL_joylist_item *SDL_joylist_tail = NULL;
|
static SDL_joylist_item *SDL_joylist_tail = NULL;
|
||||||
static int numjoysticks = 0;
|
static int numjoysticks = 0;
|
||||||
static int instance_counter = 0;
|
|
||||||
|
|
||||||
static EM_BOOL Emscripten_JoyStickConnected(int eventType, const EmscriptenGamepadEvent *gamepadEvent, void *userData)
|
static EM_BOOL Emscripten_JoyStickConnected(int eventType, const EmscriptenGamepadEvent *gamepadEvent, void *userData)
|
||||||
{
|
{
|
||||||
@@ -72,7 +71,7 @@ static EM_BOOL Emscripten_JoyStickConnected(int eventType, const EmscriptenGamep
|
|||||||
|
|
||||||
item->naxes = gamepadEvent->numAxes;
|
item->naxes = gamepadEvent->numAxes;
|
||||||
item->nbuttons = gamepadEvent->numButtons;
|
item->nbuttons = gamepadEvent->numButtons;
|
||||||
item->device_instance = instance_counter++;
|
item->device_instance = SDL_GetNextJoystickInstanceID();
|
||||||
|
|
||||||
item->timestamp = gamepadEvent->timestamp;
|
item->timestamp = gamepadEvent->timestamp;
|
||||||
|
|
||||||
@@ -168,7 +167,6 @@ static void EMSCRIPTEN_JoystickQuit(void)
|
|||||||
SDL_joylist = SDL_joylist_tail = NULL;
|
SDL_joylist = SDL_joylist_tail = NULL;
|
||||||
|
|
||||||
numjoysticks = 0;
|
numjoysticks = 0;
|
||||||
instance_counter = 0;
|
|
||||||
|
|
||||||
emscripten_set_gamepadconnected_callback(NULL, 0, NULL);
|
emscripten_set_gamepadconnected_callback(NULL, 0, NULL);
|
||||||
emscripten_set_gamepaddisconnected_callback(NULL, 0, NULL);
|
emscripten_set_gamepaddisconnected_callback(NULL, 0, NULL);
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ typedef enum
|
|||||||
k_eSwitchDeviceInfoControllerType_JoyConRight = 2,
|
k_eSwitchDeviceInfoControllerType_JoyConRight = 2,
|
||||||
k_eSwitchDeviceInfoControllerType_ProController = 3,
|
k_eSwitchDeviceInfoControllerType_ProController = 3,
|
||||||
k_eSwitchDeviceInfoControllerType_LicProController = 6,
|
k_eSwitchDeviceInfoControllerType_LicProController = 6,
|
||||||
|
k_eSwitchDeviceInfoControllerType_HVCLeft = 7,
|
||||||
|
k_eSwitchDeviceInfoControllerType_HVCRight = 8,
|
||||||
k_eSwitchDeviceInfoControllerType_NESLeft = 9,
|
k_eSwitchDeviceInfoControllerType_NESLeft = 9,
|
||||||
k_eSwitchDeviceInfoControllerType_NESRight = 10,
|
k_eSwitchDeviceInfoControllerType_NESRight = 10,
|
||||||
k_eSwitchDeviceInfoControllerType_SNES = 11,
|
k_eSwitchDeviceInfoControllerType_SNES = 11,
|
||||||
|
|||||||
@@ -320,81 +320,83 @@ static SDL_bool HIDAPI_DriverPS4_InitDevice(SDL_HIDAPI_Device *device)
|
|||||||
SDL_Log("PS4 dongle = %s, bluetooth = %s\n", ctx->is_dongle ? "TRUE" : "FALSE", device->is_bluetooth ? "TRUE" : "FALSE");
|
SDL_Log("PS4 dongle = %s, bluetooth = %s\n", ctx->is_dongle ? "TRUE" : "FALSE", device->is_bluetooth ? "TRUE" : "FALSE");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
size = ReadFeatureReport(device->dev, k_ePS4FeatureReportIdCapabilities, data, sizeof(data));
|
if (device->vendor_id == USB_VENDOR_SONY) {
|
||||||
/* Get the device capabilities */
|
|
||||||
if (size == 48 && data[2] == 0x27) {
|
|
||||||
Uint8 capabilities = data[4];
|
|
||||||
Uint8 device_type = data[5];
|
|
||||||
Uint16 gyro_numerator = LOAD16(data[10], data[11]);
|
|
||||||
Uint16 gyro_denominator = LOAD16(data[12], data[13]);
|
|
||||||
Uint16 accel_numerator = LOAD16(data[14], data[15]);
|
|
||||||
Uint16 accel_denominator = LOAD16(data[16], data[17]);
|
|
||||||
|
|
||||||
#ifdef DEBUG_PS4_PROTOCOL
|
|
||||||
HIDAPI_DumpPacket("PS4 capabilities: size = %d", data, size);
|
|
||||||
#endif
|
|
||||||
if (capabilities & 0x02) {
|
|
||||||
ctx->sensors_supported = SDL_TRUE;
|
|
||||||
}
|
|
||||||
if (capabilities & 0x04) {
|
|
||||||
ctx->lightbar_supported = SDL_TRUE;
|
|
||||||
}
|
|
||||||
if (capabilities & 0x08) {
|
|
||||||
ctx->vibration_supported = SDL_TRUE;
|
|
||||||
}
|
|
||||||
if (capabilities & 0x40) {
|
|
||||||
ctx->touchpad_supported = SDL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (device_type) {
|
|
||||||
case 0x00:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_GAMECONTROLLER;
|
|
||||||
break;
|
|
||||||
case 0x01:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_GUITAR;
|
|
||||||
break;
|
|
||||||
case 0x02:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_DRUM_KIT;
|
|
||||||
break;
|
|
||||||
case 0x04:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_DANCE_PAD;
|
|
||||||
break;
|
|
||||||
case 0x06:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_WHEEL;
|
|
||||||
break;
|
|
||||||
case 0x07:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_ARCADE_STICK;
|
|
||||||
break;
|
|
||||||
case 0x08:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_FLIGHT_STICK;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_UNKNOWN;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gyro_numerator && gyro_denominator) {
|
|
||||||
ctx->gyro_numerator = gyro_numerator;
|
|
||||||
ctx->gyro_denominator = gyro_denominator;
|
|
||||||
}
|
|
||||||
if (accel_numerator && accel_denominator) {
|
|
||||||
ctx->accel_numerator = accel_numerator;
|
|
||||||
ctx->accel_denominator = accel_denominator;
|
|
||||||
}
|
|
||||||
} else if (device->vendor_id == USB_VENDOR_SONY) {
|
|
||||||
ctx->official_controller = SDL_TRUE;
|
ctx->official_controller = SDL_TRUE;
|
||||||
ctx->sensors_supported = SDL_TRUE;
|
ctx->sensors_supported = SDL_TRUE;
|
||||||
ctx->lightbar_supported = SDL_TRUE;
|
ctx->lightbar_supported = SDL_TRUE;
|
||||||
ctx->vibration_supported = SDL_TRUE;
|
ctx->vibration_supported = SDL_TRUE;
|
||||||
ctx->touchpad_supported = SDL_TRUE;
|
ctx->touchpad_supported = SDL_TRUE;
|
||||||
} else if (device->vendor_id == USB_VENDOR_RAZER) {
|
} else {
|
||||||
/* The Razer Raiju doesn't respond to the detection protocol, but has a touchpad and vibration */
|
size = ReadFeatureReport(device->dev, k_ePS4FeatureReportIdCapabilities, data, sizeof(data));
|
||||||
ctx->vibration_supported = SDL_TRUE;
|
/* Get the device capabilities */
|
||||||
ctx->touchpad_supported = SDL_TRUE;
|
if (size == 48 && data[2] == 0x27) {
|
||||||
|
Uint8 capabilities = data[4];
|
||||||
|
Uint8 device_type = data[5];
|
||||||
|
Uint16 gyro_numerator = LOAD16(data[10], data[11]);
|
||||||
|
Uint16 gyro_denominator = LOAD16(data[12], data[13]);
|
||||||
|
Uint16 accel_numerator = LOAD16(data[14], data[15]);
|
||||||
|
Uint16 accel_denominator = LOAD16(data[16], data[17]);
|
||||||
|
|
||||||
if (device->product_id == USB_PRODUCT_RAZER_TOURNAMENT_EDITION_BLUETOOTH ||
|
#ifdef DEBUG_PS4_PROTOCOL
|
||||||
device->product_id == USB_PRODUCT_RAZER_ULTIMATE_EDITION_BLUETOOTH) {
|
HIDAPI_DumpPacket("PS4 capabilities: size = %d", data, size);
|
||||||
device->is_bluetooth = SDL_TRUE;
|
#endif
|
||||||
|
if (capabilities & 0x02) {
|
||||||
|
ctx->sensors_supported = SDL_TRUE;
|
||||||
|
}
|
||||||
|
if (capabilities & 0x04) {
|
||||||
|
ctx->lightbar_supported = SDL_TRUE;
|
||||||
|
}
|
||||||
|
if (capabilities & 0x08) {
|
||||||
|
ctx->vibration_supported = SDL_TRUE;
|
||||||
|
}
|
||||||
|
if (capabilities & 0x40) {
|
||||||
|
ctx->touchpad_supported = SDL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (device_type) {
|
||||||
|
case 0x00:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_GAMECONTROLLER;
|
||||||
|
break;
|
||||||
|
case 0x01:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_GUITAR;
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_DRUM_KIT;
|
||||||
|
break;
|
||||||
|
case 0x04:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_DANCE_PAD;
|
||||||
|
break;
|
||||||
|
case 0x06:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_WHEEL;
|
||||||
|
break;
|
||||||
|
case 0x07:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_ARCADE_STICK;
|
||||||
|
break;
|
||||||
|
case 0x08:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_FLIGHT_STICK;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_UNKNOWN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gyro_numerator && gyro_denominator) {
|
||||||
|
ctx->gyro_numerator = gyro_numerator;
|
||||||
|
ctx->gyro_denominator = gyro_denominator;
|
||||||
|
}
|
||||||
|
if (accel_numerator && accel_denominator) {
|
||||||
|
ctx->accel_numerator = accel_numerator;
|
||||||
|
ctx->accel_denominator = accel_denominator;
|
||||||
|
}
|
||||||
|
} else if (device->vendor_id == USB_VENDOR_RAZER) {
|
||||||
|
/* The Razer Raiju doesn't respond to the detection protocol, but has a touchpad and vibration */
|
||||||
|
ctx->vibration_supported = SDL_TRUE;
|
||||||
|
ctx->touchpad_supported = SDL_TRUE;
|
||||||
|
|
||||||
|
if (device->product_id == USB_PRODUCT_RAZER_TOURNAMENT_EDITION_BLUETOOTH ||
|
||||||
|
device->product_id == USB_PRODUCT_RAZER_ULTIMATE_EDITION_BLUETOOTH) {
|
||||||
|
device->is_bluetooth = SDL_TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx->effects_supported = (ctx->lightbar_supported || ctx->vibration_supported);
|
ctx->effects_supported = (ctx->lightbar_supported || ctx->vibration_supported);
|
||||||
@@ -660,16 +662,25 @@ static int HIDAPI_DriverPS4_UpdateEffects(SDL_HIDAPI_Device *device)
|
|||||||
|
|
||||||
static void HIDAPI_DriverPS4_TickleBluetooth(SDL_HIDAPI_Device *device)
|
static void HIDAPI_DriverPS4_TickleBluetooth(SDL_HIDAPI_Device *device)
|
||||||
{
|
{
|
||||||
/* This is just a dummy packet that should have no effect, since we don't set the CRC */
|
SDL_DriverPS4_Context *ctx = (SDL_DriverPS4_Context *)device->context;
|
||||||
Uint8 data[78];
|
|
||||||
|
|
||||||
SDL_zeroa(data);
|
if (ctx->enhanced_mode) {
|
||||||
|
/* This is just a dummy packet that should have no effect, since we don't set the CRC */
|
||||||
|
Uint8 data[78];
|
||||||
|
|
||||||
data[0] = k_EPS4ReportIdBluetoothEffects;
|
SDL_zeroa(data);
|
||||||
data[1] = 0xC0; /* Magic value HID + CRC */
|
|
||||||
|
|
||||||
if (SDL_HIDAPI_LockRumble() == 0) {
|
data[0] = k_EPS4ReportIdBluetoothEffects;
|
||||||
SDL_HIDAPI_SendRumbleAndUnlock(device, data, sizeof(data));
|
data[1] = 0xC0; /* Magic value HID + CRC */
|
||||||
|
|
||||||
|
if (SDL_HIDAPI_LockRumble() == 0) {
|
||||||
|
SDL_HIDAPI_SendRumbleAndUnlock(device, data, sizeof(data));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* We can't even send an invalid effects packet, or it will put the controller in enhanced mode */
|
||||||
|
if (device->num_joysticks > 0) {
|
||||||
|
HIDAPI_JoystickDisconnected(device, device->joysticks[0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ typedef struct
|
|||||||
Uint8 rgucAccelX[2]; /* 21 */
|
Uint8 rgucAccelX[2]; /* 21 */
|
||||||
Uint8 rgucAccelY[2]; /* 23 */
|
Uint8 rgucAccelY[2]; /* 23 */
|
||||||
Uint8 rgucAccelZ[2]; /* 25 */
|
Uint8 rgucAccelZ[2]; /* 25 */
|
||||||
Uint8 rgucSensorTimestamp[4]; /* 27 - 32 bit little endian */
|
Uint8 rgucSensorTimestamp[4]; /* 27 - 16/32 bit little endian */
|
||||||
|
|
||||||
} PS5StatePacketCommon_t;
|
} PS5StatePacketCommon_t;
|
||||||
|
|
||||||
@@ -154,7 +154,9 @@ typedef struct
|
|||||||
Uint8 rgucAccelX[2]; /* 21 */
|
Uint8 rgucAccelX[2]; /* 21 */
|
||||||
Uint8 rgucAccelY[2]; /* 23 */
|
Uint8 rgucAccelY[2]; /* 23 */
|
||||||
Uint8 rgucAccelZ[2]; /* 25 */
|
Uint8 rgucAccelZ[2]; /* 25 */
|
||||||
Uint8 rgucSensorTimestamp[4]; /* 27 - 32 bit little endian */
|
Uint8 rgucSensorTimestamp[2]; /* 27 - 16 bit little endian */
|
||||||
|
Uint8 ucBatteryLevel; /* 29 */
|
||||||
|
Uint8 ucUnknown; /* 30 */
|
||||||
Uint8 ucTouchpadCounter1; /* 31 - high bit clear + counter */
|
Uint8 ucTouchpadCounter1; /* 31 - high bit clear + counter */
|
||||||
Uint8 rgucTouchpadData1[3]; /* 32 - X/Y, 12 bits per axis */
|
Uint8 rgucTouchpadData1[3]; /* 32 - X/Y, 12 bits per axis */
|
||||||
Uint8 ucTouchpadCounter2; /* 35 - high bit clear + counter */
|
Uint8 ucTouchpadCounter2; /* 35 - high bit clear + counter */
|
||||||
@@ -421,7 +423,6 @@ static SDL_bool HIDAPI_DriverPS5_InitDevice(SDL_HIDAPI_Device *device)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size = ReadFeatureReport(device->dev, k_EPS5FeatureReportIdCapabilities, data, sizeof(data));
|
|
||||||
/* Get the device capabilities */
|
/* Get the device capabilities */
|
||||||
if (device->vendor_id == USB_VENDOR_SONY) {
|
if (device->vendor_id == USB_VENDOR_SONY) {
|
||||||
ctx->sensors_supported = SDL_TRUE;
|
ctx->sensors_supported = SDL_TRUE;
|
||||||
@@ -429,61 +430,66 @@ static SDL_bool HIDAPI_DriverPS5_InitDevice(SDL_HIDAPI_Device *device)
|
|||||||
ctx->vibration_supported = SDL_TRUE;
|
ctx->vibration_supported = SDL_TRUE;
|
||||||
ctx->playerled_supported = SDL_TRUE;
|
ctx->playerled_supported = SDL_TRUE;
|
||||||
ctx->touchpad_supported = SDL_TRUE;
|
ctx->touchpad_supported = SDL_TRUE;
|
||||||
} else if (size == 48 && data[2] == 0x28) {
|
} else {
|
||||||
Uint8 capabilities = data[4];
|
/* Third party controller capability request */
|
||||||
Uint8 capabilities2 = data[20];
|
size = ReadFeatureReport(device->dev, k_EPS5FeatureReportIdCapabilities, data, sizeof(data));
|
||||||
Uint8 device_type = data[5];
|
if (size == 48 && data[2] == 0x28) {
|
||||||
|
Uint8 capabilities = data[4];
|
||||||
|
Uint8 capabilities2 = data[20];
|
||||||
|
Uint8 device_type = data[5];
|
||||||
|
|
||||||
#ifdef DEBUG_PS5_PROTOCOL
|
#ifdef DEBUG_PS5_PROTOCOL
|
||||||
HIDAPI_DumpPacket("PS5 capabilities: size = %d", data, size);
|
HIDAPI_DumpPacket("PS5 capabilities: size = %d", data, size);
|
||||||
#endif
|
#endif
|
||||||
if (capabilities & 0x02) {
|
if (capabilities & 0x02) {
|
||||||
|
ctx->sensors_supported = SDL_TRUE;
|
||||||
|
}
|
||||||
|
if (capabilities & 0x04) {
|
||||||
|
ctx->lightbar_supported = SDL_TRUE;
|
||||||
|
}
|
||||||
|
if (capabilities & 0x08) {
|
||||||
|
ctx->vibration_supported = SDL_TRUE;
|
||||||
|
}
|
||||||
|
if (capabilities & 0x40) {
|
||||||
|
ctx->touchpad_supported = SDL_TRUE;
|
||||||
|
}
|
||||||
|
if (capabilities2 & 0x80) {
|
||||||
|
ctx->playerled_supported = SDL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (device_type) {
|
||||||
|
case 0x00:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_GAMECONTROLLER;
|
||||||
|
break;
|
||||||
|
case 0x01:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_GUITAR;
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_DRUM_KIT;
|
||||||
|
break;
|
||||||
|
case 0x06:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_WHEEL;
|
||||||
|
break;
|
||||||
|
case 0x07:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_ARCADE_STICK;
|
||||||
|
break;
|
||||||
|
case 0x08:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_FLIGHT_STICK;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
joystick_type = SDL_JOYSTICK_TYPE_UNKNOWN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->use_alternate_report = SDL_TRUE;
|
||||||
|
} else if (device->vendor_id == USB_VENDOR_RAZER &&
|
||||||
|
(device->product_id == USB_PRODUCT_RAZER_WOLVERINE_V2_PRO_PS5_WIRED ||
|
||||||
|
device->product_id == USB_PRODUCT_RAZER_WOLVERINE_V2_PRO_PS5_WIRELESS)) {
|
||||||
|
/* The Razer Wolverine V2 Pro doesn't respond to the detection protocol, but has a touchpad and sensors, but no vibration */
|
||||||
ctx->sensors_supported = SDL_TRUE;
|
ctx->sensors_supported = SDL_TRUE;
|
||||||
}
|
|
||||||
if (capabilities & 0x04) {
|
|
||||||
ctx->lightbar_supported = SDL_TRUE;
|
|
||||||
}
|
|
||||||
if (capabilities & 0x08) {
|
|
||||||
ctx->vibration_supported = SDL_TRUE;
|
|
||||||
}
|
|
||||||
if (capabilities & 0x40) {
|
|
||||||
ctx->touchpad_supported = SDL_TRUE;
|
ctx->touchpad_supported = SDL_TRUE;
|
||||||
|
ctx->use_alternate_report = SDL_TRUE;
|
||||||
}
|
}
|
||||||
if (capabilities2 & 0x80) {
|
|
||||||
ctx->playerled_supported = SDL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (device_type) {
|
|
||||||
case 0x00:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_GAMECONTROLLER;
|
|
||||||
break;
|
|
||||||
case 0x01:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_GUITAR;
|
|
||||||
break;
|
|
||||||
case 0x02:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_DRUM_KIT;
|
|
||||||
break;
|
|
||||||
case 0x06:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_WHEEL;
|
|
||||||
break;
|
|
||||||
case 0x07:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_ARCADE_STICK;
|
|
||||||
break;
|
|
||||||
case 0x08:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_FLIGHT_STICK;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
joystick_type = SDL_JOYSTICK_TYPE_UNKNOWN;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->use_alternate_report = SDL_TRUE;
|
|
||||||
} else if (device->vendor_id == USB_VENDOR_RAZER &&
|
|
||||||
(device->product_id == USB_PRODUCT_RAZER_WOLVERINE_V2_PRO_PS5_WIRED ||
|
|
||||||
device->product_id == USB_PRODUCT_RAZER_WOLVERINE_V2_PRO_PS5_WIRELESS)) {
|
|
||||||
/* The Razer Wolverine V2 Pro doesn't respond to the detection protocol, but has a touchpad and sensors, but no vibration */
|
|
||||||
ctx->sensors_supported = SDL_TRUE;
|
|
||||||
ctx->touchpad_supported = SDL_TRUE;
|
|
||||||
}
|
}
|
||||||
ctx->effects_supported = (ctx->lightbar_supported || ctx->vibration_supported || ctx->playerled_supported);
|
ctx->effects_supported = (ctx->lightbar_supported || ctx->vibration_supported || ctx->playerled_supported);
|
||||||
|
|
||||||
@@ -717,7 +723,7 @@ static void HIDAPI_DriverPS5_CheckPendingLEDReset(SDL_HIDAPI_Device *device)
|
|||||||
SDL_DriverPS5_Context *ctx = (SDL_DriverPS5_Context *)device->context;
|
SDL_DriverPS5_Context *ctx = (SDL_DriverPS5_Context *)device->context;
|
||||||
SDL_bool led_reset_complete = SDL_FALSE;
|
SDL_bool led_reset_complete = SDL_FALSE;
|
||||||
|
|
||||||
if (ctx->sensors_supported) {
|
if (ctx->enhanced_mode && ctx->sensors_supported && !ctx->use_alternate_report) {
|
||||||
const PS5StatePacketCommon_t *packet = &ctx->last_state.state;
|
const PS5StatePacketCommon_t *packet = &ctx->last_state.state;
|
||||||
|
|
||||||
/* Check the timer to make sure the Bluetooth connection LED animation is complete */
|
/* Check the timer to make sure the Bluetooth connection LED animation is complete */
|
||||||
@@ -726,7 +732,7 @@ static void HIDAPI_DriverPS5_CheckPendingLEDReset(SDL_HIDAPI_Device *device)
|
|||||||
packet->rgucSensorTimestamp[1],
|
packet->rgucSensorTimestamp[1],
|
||||||
packet->rgucSensorTimestamp[2],
|
packet->rgucSensorTimestamp[2],
|
||||||
packet->rgucSensorTimestamp[3]);
|
packet->rgucSensorTimestamp[3]);
|
||||||
if (SDL_TICKS_PASSED(timestamp, connection_complete)) {
|
if (timestamp >= connection_complete) {
|
||||||
led_reset_complete = SDL_TRUE;
|
led_reset_complete = SDL_TRUE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -745,16 +751,25 @@ static void HIDAPI_DriverPS5_CheckPendingLEDReset(SDL_HIDAPI_Device *device)
|
|||||||
|
|
||||||
static void HIDAPI_DriverPS5_TickleBluetooth(SDL_HIDAPI_Device *device)
|
static void HIDAPI_DriverPS5_TickleBluetooth(SDL_HIDAPI_Device *device)
|
||||||
{
|
{
|
||||||
/* This is just a dummy packet that should have no effect, since we don't set the CRC */
|
SDL_DriverPS5_Context *ctx = (SDL_DriverPS5_Context *)device->context;
|
||||||
Uint8 data[78];
|
|
||||||
|
|
||||||
SDL_zeroa(data);
|
if (ctx->enhanced_mode) {
|
||||||
|
/* This is just a dummy packet that should have no effect, since we don't set the CRC */
|
||||||
|
Uint8 data[78];
|
||||||
|
|
||||||
data[0] = k_EPS5ReportIdBluetoothEffects;
|
SDL_zeroa(data);
|
||||||
data[1] = 0x02; /* Magic value */
|
|
||||||
|
|
||||||
if (SDL_HIDAPI_LockRumble() == 0) {
|
data[0] = k_EPS5ReportIdBluetoothEffects;
|
||||||
SDL_HIDAPI_SendRumbleAndUnlock(device, data, sizeof(data));
|
data[1] = 0x02; /* Magic value */
|
||||||
|
|
||||||
|
if (SDL_HIDAPI_LockRumble() == 0) {
|
||||||
|
SDL_HIDAPI_SendRumbleAndUnlock(device, data, sizeof(data));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* We can't even send an invalid effects packet, or it will put the controller in enhanced mode */
|
||||||
|
if (device->num_joysticks > 0) {
|
||||||
|
HIDAPI_JoystickDisconnected(device, device->joysticks[0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1216,30 +1231,56 @@ static void HIDAPI_DriverPS5_HandleStatePacketCommon(SDL_Joystick *joystick, SDL
|
|||||||
SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_RIGHTY, axis);
|
SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_RIGHTY, axis);
|
||||||
|
|
||||||
if (ctx->report_sensors) {
|
if (ctx->report_sensors) {
|
||||||
Uint32 timestamp;
|
|
||||||
Uint64 timestamp_us;
|
|
||||||
float data[3];
|
float data[3];
|
||||||
|
Uint64 timestamp_us;
|
||||||
|
|
||||||
timestamp = LOAD32(packet->rgucSensorTimestamp[0],
|
if (ctx->use_alternate_report) {
|
||||||
packet->rgucSensorTimestamp[1],
|
/* 16-bit timestamp */
|
||||||
packet->rgucSensorTimestamp[2],
|
Uint16 timestamp;
|
||||||
packet->rgucSensorTimestamp[3]);
|
|
||||||
if (ctx->timestamp) {
|
|
||||||
Uint32 delta;
|
|
||||||
|
|
||||||
if (ctx->last_timestamp > timestamp) {
|
timestamp = LOAD16(packet->rgucSensorTimestamp[0],
|
||||||
delta = (SDL_MAX_UINT32 - ctx->last_timestamp + timestamp + 1);
|
packet->rgucSensorTimestamp[1]);
|
||||||
|
if (ctx->timestamp) {
|
||||||
|
Uint16 delta;
|
||||||
|
|
||||||
|
if (ctx->last_timestamp > timestamp) {
|
||||||
|
delta = (SDL_MAX_UINT16 - ctx->last_timestamp + timestamp + 1);
|
||||||
|
} else {
|
||||||
|
delta = (timestamp - ctx->last_timestamp);
|
||||||
|
}
|
||||||
|
ctx->timestamp += delta;
|
||||||
} else {
|
} else {
|
||||||
delta = (timestamp - ctx->last_timestamp);
|
ctx->timestamp = timestamp;
|
||||||
}
|
}
|
||||||
ctx->timestamp += delta;
|
ctx->last_timestamp = timestamp;
|
||||||
} else {
|
|
||||||
ctx->timestamp = timestamp;
|
|
||||||
}
|
|
||||||
ctx->last_timestamp = timestamp;
|
|
||||||
|
|
||||||
/* Sensor timestamp is in 0.33us units */
|
/* Sensor timestamp is in 1us units */
|
||||||
timestamp_us = ctx->timestamp / 3;
|
timestamp_us = ctx->timestamp;
|
||||||
|
} else {
|
||||||
|
/* 32-bit timestamp */
|
||||||
|
Uint32 timestamp;
|
||||||
|
|
||||||
|
timestamp = LOAD32(packet->rgucSensorTimestamp[0],
|
||||||
|
packet->rgucSensorTimestamp[1],
|
||||||
|
packet->rgucSensorTimestamp[2],
|
||||||
|
packet->rgucSensorTimestamp[3]);
|
||||||
|
if (ctx->timestamp) {
|
||||||
|
Uint32 delta;
|
||||||
|
|
||||||
|
if (ctx->last_timestamp > timestamp) {
|
||||||
|
delta = (SDL_MAX_UINT32 - ctx->last_timestamp + timestamp + 1);
|
||||||
|
} else {
|
||||||
|
delta = (timestamp - ctx->last_timestamp);
|
||||||
|
}
|
||||||
|
ctx->timestamp += delta;
|
||||||
|
} else {
|
||||||
|
ctx->timestamp = timestamp;
|
||||||
|
}
|
||||||
|
ctx->last_timestamp = timestamp;
|
||||||
|
|
||||||
|
/* Sensor timestamp is in 0.33us units */
|
||||||
|
timestamp_us = ctx->timestamp / 3;
|
||||||
|
}
|
||||||
|
|
||||||
data[0] = HIDAPI_DriverPS5_ApplyCalibrationData(ctx, 0, LOAD16(packet->rgucGyroX[0], packet->rgucGyroX[1]));
|
data[0] = HIDAPI_DriverPS5_ApplyCalibrationData(ctx, 0, LOAD16(packet->rgucGyroX[0], packet->rgucGyroX[1]));
|
||||||
data[1] = HIDAPI_DriverPS5_ApplyCalibrationData(ctx, 1, LOAD16(packet->rgucGyroY[0], packet->rgucGyroY[1]));
|
data[1] = HIDAPI_DriverPS5_ApplyCalibrationData(ctx, 1, LOAD16(packet->rgucGyroY[0], packet->rgucGyroY[1]));
|
||||||
@@ -1395,15 +1436,15 @@ static SDL_bool HIDAPI_DriverPS5_UpdateDevice(SDL_HIDAPI_Device *device)
|
|||||||
/* This is the extended report, we can enable effects now */
|
/* This is the extended report, we can enable effects now */
|
||||||
HIDAPI_DriverPS5_SetEnhancedMode(device, joystick);
|
HIDAPI_DriverPS5_SetEnhancedMode(device, joystick);
|
||||||
}
|
}
|
||||||
if (ctx->led_reset_state == k_EDS5LEDResetStatePending) {
|
|
||||||
HIDAPI_DriverPS5_CheckPendingLEDReset(device);
|
|
||||||
}
|
|
||||||
HIDAPI_DriverPS5_HandleStatePacketCommon(joystick, device->dev, ctx, (PS5StatePacketCommon_t *)&data[2]);
|
HIDAPI_DriverPS5_HandleStatePacketCommon(joystick, device->dev, ctx, (PS5StatePacketCommon_t *)&data[2]);
|
||||||
if (ctx->use_alternate_report) {
|
if (ctx->use_alternate_report) {
|
||||||
HIDAPI_DriverPS5_HandleStatePacketAlt(joystick, device->dev, ctx, (PS5StatePacketAlt_t *)&data[2]);
|
HIDAPI_DriverPS5_HandleStatePacketAlt(joystick, device->dev, ctx, (PS5StatePacketAlt_t *)&data[2]);
|
||||||
} else {
|
} else {
|
||||||
HIDAPI_DriverPS5_HandleStatePacket(joystick, device->dev, ctx, (PS5StatePacket_t *)&data[2]);
|
HIDAPI_DriverPS5_HandleStatePacket(joystick, device->dev, ctx, (PS5StatePacket_t *)&data[2]);
|
||||||
}
|
}
|
||||||
|
if (ctx->led_reset_state == k_EDS5LEDResetStatePending) {
|
||||||
|
HIDAPI_DriverPS5_CheckPendingLEDReset(device);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
#ifdef DEBUG_JOYSTICK
|
#ifdef DEBUG_JOYSTICK
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ typedef enum
|
|||||||
{
|
{
|
||||||
k_eSwitchInputReportIDs_SubcommandReply = 0x21,
|
k_eSwitchInputReportIDs_SubcommandReply = 0x21,
|
||||||
k_eSwitchInputReportIDs_FullControllerState = 0x30,
|
k_eSwitchInputReportIDs_FullControllerState = 0x30,
|
||||||
|
k_eSwitchInputReportIDs_FullControllerAndMcuState = 0x31,
|
||||||
k_eSwitchInputReportIDs_SimpleControllerState = 0x3F,
|
k_eSwitchInputReportIDs_SimpleControllerState = 0x3F,
|
||||||
k_eSwitchInputReportIDs_CommandAck = 0x81,
|
k_eSwitchInputReportIDs_CommandAck = 0x81,
|
||||||
} ESwitchInputReportIDs;
|
} ESwitchInputReportIDs;
|
||||||
@@ -760,9 +761,8 @@ static SDL_bool LoadStickCalibration(SDL_DriverSwitch_Context *ctx)
|
|||||||
readUserParams.unAddress = k_unSPIStickUserCalibrationStartOffset;
|
readUserParams.unAddress = k_unSPIStickUserCalibrationStartOffset;
|
||||||
readUserParams.ucLength = k_unSPIStickUserCalibrationLength;
|
readUserParams.ucLength = k_unSPIStickUserCalibrationLength;
|
||||||
|
|
||||||
if (!WriteSubcommand(ctx, k_eSwitchSubcommandIDs_SPIFlashRead, (uint8_t *)&readUserParams, sizeof(readUserParams), &user_reply)) {
|
/* This isn't readable on all controllers, so ignore failure */
|
||||||
return SDL_FALSE;
|
WriteSubcommand(ctx, k_eSwitchSubcommandIDs_SPIFlashRead, (uint8_t *)&readUserParams, sizeof(readUserParams), &user_reply);
|
||||||
}
|
|
||||||
|
|
||||||
/* Read Factory Calibration Info */
|
/* Read Factory Calibration Info */
|
||||||
readFactoryParams.unAddress = k_unSPIStickFactoryCalibrationStartOffset;
|
readFactoryParams.unAddress = k_unSPIStickFactoryCalibrationStartOffset;
|
||||||
@@ -773,13 +773,13 @@ static SDL_bool LoadStickCalibration(SDL_DriverSwitch_Context *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Automatically select the user calibration if magic bytes are set */
|
/* Automatically select the user calibration if magic bytes are set */
|
||||||
if (user_reply->stickUserCalibration.rgucLeftMagic[0] == 0xB2 && user_reply->stickUserCalibration.rgucLeftMagic[1] == 0xA1) {
|
if (user_reply && user_reply->stickUserCalibration.rgucLeftMagic[0] == 0xB2 && user_reply->stickUserCalibration.rgucLeftMagic[1] == 0xA1) {
|
||||||
pLeftStickCal = user_reply->stickUserCalibration.rgucLeftCalibration;
|
pLeftStickCal = user_reply->stickUserCalibration.rgucLeftCalibration;
|
||||||
} else {
|
} else {
|
||||||
pLeftStickCal = factory_reply->stickFactoryCalibration.rgucLeftCalibration;
|
pLeftStickCal = factory_reply->stickFactoryCalibration.rgucLeftCalibration;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user_reply->stickUserCalibration.rgucRightMagic[0] == 0xB2 && user_reply->stickUserCalibration.rgucRightMagic[1] == 0xA1) {
|
if (user_reply && user_reply->stickUserCalibration.rgucRightMagic[0] == 0xB2 && user_reply->stickUserCalibration.rgucRightMagic[1] == 0xA1) {
|
||||||
pRightStickCal = user_reply->stickUserCalibration.rgucRightCalibration;
|
pRightStickCal = user_reply->stickUserCalibration.rgucRightCalibration;
|
||||||
} else {
|
} else {
|
||||||
pRightStickCal = factory_reply->stickFactoryCalibration.rgucRightCalibration;
|
pRightStickCal = factory_reply->stickFactoryCalibration.rgucRightCalibration;
|
||||||
@@ -841,16 +841,55 @@ static SDL_bool LoadStickCalibration(SDL_DriverSwitch_Context *ctx)
|
|||||||
|
|
||||||
static SDL_bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
|
static SDL_bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
|
||||||
{
|
{
|
||||||
Uint8 *pIMUScale;
|
|
||||||
SwitchSubcommandInputPacket_t *reply = NULL;
|
SwitchSubcommandInputPacket_t *reply = NULL;
|
||||||
Sint16 sAccelRawX, sAccelRawY, sAccelRawZ, sGyroRawX, sGyroRawY, sGyroRawZ;
|
|
||||||
|
|
||||||
/* Read Calibration Info */
|
/* Read Calibration Info */
|
||||||
SwitchSPIOpData_t readParams;
|
SwitchSPIOpData_t readParams;
|
||||||
readParams.unAddress = k_unSPIIMUScaleStartOffset;
|
readParams.unAddress = k_unSPIIMUScaleStartOffset;
|
||||||
readParams.ucLength = k_unSPIIMUScaleLength;
|
readParams.ucLength = k_unSPIIMUScaleLength;
|
||||||
|
|
||||||
if (!WriteSubcommand(ctx, k_eSwitchSubcommandIDs_SPIFlashRead, (uint8_t *)&readParams, sizeof(readParams), &reply)) {
|
if (WriteSubcommand(ctx, k_eSwitchSubcommandIDs_SPIFlashRead, (uint8_t *)&readParams, sizeof(readParams), &reply)) {
|
||||||
|
Uint8 *pIMUScale;
|
||||||
|
Sint16 sAccelRawX, sAccelRawY, sAccelRawZ, sGyroRawX, sGyroRawY, sGyroRawZ;
|
||||||
|
|
||||||
|
/* IMU scale gives us multipliers for converting raw values to real world values */
|
||||||
|
pIMUScale = reply->spiReadData.rgucReadData;
|
||||||
|
|
||||||
|
sAccelRawX = (pIMUScale[1] << 8) | pIMUScale[0];
|
||||||
|
sAccelRawY = (pIMUScale[3] << 8) | pIMUScale[2];
|
||||||
|
sAccelRawZ = (pIMUScale[5] << 8) | pIMUScale[4];
|
||||||
|
|
||||||
|
sGyroRawX = (pIMUScale[13] << 8) | pIMUScale[12];
|
||||||
|
sGyroRawY = (pIMUScale[15] << 8) | pIMUScale[14];
|
||||||
|
sGyroRawZ = (pIMUScale[17] << 8) | pIMUScale[16];
|
||||||
|
|
||||||
|
/* Check for user calibration data. If it's present and set, it'll override the factory settings */
|
||||||
|
readParams.unAddress = k_unSPIIMUUserScaleStartOffset;
|
||||||
|
readParams.ucLength = k_unSPIIMUUserScaleLength;
|
||||||
|
if (WriteSubcommand(ctx, k_eSwitchSubcommandIDs_SPIFlashRead, (uint8_t *)&readParams, sizeof(readParams), &reply) && (pIMUScale[0] | pIMUScale[1] << 8) == 0xA1B2) {
|
||||||
|
pIMUScale = reply->spiReadData.rgucReadData;
|
||||||
|
|
||||||
|
sAccelRawX = (pIMUScale[3] << 8) | pIMUScale[2];
|
||||||
|
sAccelRawY = (pIMUScale[5] << 8) | pIMUScale[4];
|
||||||
|
sAccelRawZ = (pIMUScale[7] << 8) | pIMUScale[6];
|
||||||
|
|
||||||
|
sGyroRawX = (pIMUScale[15] << 8) | pIMUScale[14];
|
||||||
|
sGyroRawY = (pIMUScale[17] << 8) | pIMUScale[16];
|
||||||
|
sGyroRawZ = (pIMUScale[19] << 8) | pIMUScale[18];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Accelerometer scale */
|
||||||
|
ctx->m_IMUScaleData.fAccelScaleX = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawX) * SDL_STANDARD_GRAVITY;
|
||||||
|
ctx->m_IMUScaleData.fAccelScaleY = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawY) * SDL_STANDARD_GRAVITY;
|
||||||
|
ctx->m_IMUScaleData.fAccelScaleZ = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawZ) * SDL_STANDARD_GRAVITY;
|
||||||
|
|
||||||
|
/* Gyro scale */
|
||||||
|
ctx->m_IMUScaleData.fGyroScaleX = SWITCH_GYRO_SCALE_MULT / (SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawX) * (float)M_PI / 180.0f;
|
||||||
|
ctx->m_IMUScaleData.fGyroScaleY = SWITCH_GYRO_SCALE_MULT / (SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawY) * (float)M_PI / 180.0f;
|
||||||
|
ctx->m_IMUScaleData.fGyroScaleZ = SWITCH_GYRO_SCALE_MULT / (SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawZ) * (float)M_PI / 180.0f;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* Use default values */
|
||||||
const float accelScale = SDL_STANDARD_GRAVITY / SWITCH_ACCEL_SCALE;
|
const float accelScale = SDL_STANDARD_GRAVITY / SWITCH_ACCEL_SCALE;
|
||||||
const float gyroScale = (float)M_PI / 180.0f / SWITCH_GYRO_SCALE;
|
const float gyroScale = (float)M_PI / 180.0f / SWITCH_GYRO_SCALE;
|
||||||
|
|
||||||
@@ -861,46 +900,7 @@ static SDL_bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
|
|||||||
ctx->m_IMUScaleData.fGyroScaleX = gyroScale;
|
ctx->m_IMUScaleData.fGyroScaleX = gyroScale;
|
||||||
ctx->m_IMUScaleData.fGyroScaleY = gyroScale;
|
ctx->m_IMUScaleData.fGyroScaleY = gyroScale;
|
||||||
ctx->m_IMUScaleData.fGyroScaleZ = gyroScale;
|
ctx->m_IMUScaleData.fGyroScaleZ = gyroScale;
|
||||||
|
|
||||||
return SDL_FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* IMU scale gives us multipliers for converting raw values to real world values */
|
|
||||||
pIMUScale = reply->spiReadData.rgucReadData;
|
|
||||||
|
|
||||||
sAccelRawX = (pIMUScale[1] << 8) | pIMUScale[0];
|
|
||||||
sAccelRawY = (pIMUScale[3] << 8) | pIMUScale[2];
|
|
||||||
sAccelRawZ = (pIMUScale[5] << 8) | pIMUScale[4];
|
|
||||||
|
|
||||||
sGyroRawX = (pIMUScale[13] << 8) | pIMUScale[12];
|
|
||||||
sGyroRawY = (pIMUScale[15] << 8) | pIMUScale[14];
|
|
||||||
sGyroRawZ = (pIMUScale[17] << 8) | pIMUScale[16];
|
|
||||||
|
|
||||||
/* Check for user calibration data. If it's present and set, it'll override the factory settings */
|
|
||||||
readParams.unAddress = k_unSPIIMUUserScaleStartOffset;
|
|
||||||
readParams.ucLength = k_unSPIIMUUserScaleLength;
|
|
||||||
if (WriteSubcommand(ctx, k_eSwitchSubcommandIDs_SPIFlashRead, (uint8_t *)&readParams, sizeof(readParams), &reply) && (pIMUScale[0] | pIMUScale[1] << 8) == 0xA1B2) {
|
|
||||||
pIMUScale = reply->spiReadData.rgucReadData;
|
|
||||||
|
|
||||||
sAccelRawX = (pIMUScale[3] << 8) | pIMUScale[2];
|
|
||||||
sAccelRawY = (pIMUScale[5] << 8) | pIMUScale[4];
|
|
||||||
sAccelRawZ = (pIMUScale[7] << 8) | pIMUScale[6];
|
|
||||||
|
|
||||||
sGyroRawX = (pIMUScale[15] << 8) | pIMUScale[14];
|
|
||||||
sGyroRawY = (pIMUScale[17] << 8) | pIMUScale[16];
|
|
||||||
sGyroRawZ = (pIMUScale[19] << 8) | pIMUScale[18];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Accelerometer scale */
|
|
||||||
ctx->m_IMUScaleData.fAccelScaleX = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawX) * SDL_STANDARD_GRAVITY;
|
|
||||||
ctx->m_IMUScaleData.fAccelScaleY = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawY) * SDL_STANDARD_GRAVITY;
|
|
||||||
ctx->m_IMUScaleData.fAccelScaleZ = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawZ) * SDL_STANDARD_GRAVITY;
|
|
||||||
|
|
||||||
/* Gyro scale */
|
|
||||||
ctx->m_IMUScaleData.fGyroScaleX = SWITCH_GYRO_SCALE_MULT / (float)(SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawX) * (float)M_PI / 180.0f;
|
|
||||||
ctx->m_IMUScaleData.fGyroScaleY = SWITCH_GYRO_SCALE_MULT / (float)(SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawY) * (float)M_PI / 180.0f;
|
|
||||||
ctx->m_IMUScaleData.fGyroScaleZ = SWITCH_GYRO_SCALE_MULT / (float)(SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawZ) * (float)M_PI / 180.0f;
|
|
||||||
|
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -998,7 +998,9 @@ static ESwitchDeviceInfoControllerType ReadJoyConControllerType(SDL_HIDAPI_Devic
|
|||||||
ctx->m_bSyncWrite = SDL_TRUE;
|
ctx->m_bSyncWrite = SDL_TRUE;
|
||||||
ctx->m_nMaxWriteAttempts = GetMaxWriteAttempts(device);
|
ctx->m_nMaxWriteAttempts = GetMaxWriteAttempts(device);
|
||||||
|
|
||||||
for (attempts = 0; attempts < MAX_ATTEMPTS; ++attempts) {
|
for ( ; ; ) {
|
||||||
|
++attempts;
|
||||||
|
device->is_bluetooth = SDL_FALSE;
|
||||||
if (WriteProprietary(ctx, k_eSwitchProprietaryCommandIDs_Status, NULL, 0, SDL_TRUE)) {
|
if (WriteProprietary(ctx, k_eSwitchProprietaryCommandIDs_Status, NULL, 0, SDL_TRUE)) {
|
||||||
SwitchProprietaryStatusPacket_t *status = (SwitchProprietaryStatusPacket_t *)&ctx->m_rgucReadBuffer[0];
|
SwitchProprietaryStatusPacket_t *status = (SwitchProprietaryStatusPacket_t *)&ctx->m_rgucReadBuffer[0];
|
||||||
|
|
||||||
@@ -1011,13 +1013,12 @@ static ESwitchDeviceInfoControllerType ReadJoyConControllerType(SDL_HIDAPI_Devic
|
|||||||
eControllerType = CalculateControllerType(ctx, (ESwitchDeviceInfoControllerType)reply->deviceInfo.ucDeviceType);
|
eControllerType = CalculateControllerType(ctx, (ESwitchDeviceInfoControllerType)reply->deviceInfo.ucDeviceType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (eControllerType == k_eSwitchDeviceInfoControllerType_Unknown) {
|
if (eControllerType == k_eSwitchDeviceInfoControllerType_Unknown && attempts < MAX_ATTEMPTS) {
|
||||||
/* Wait a bit and try again */
|
/* Wait a bit and try again */
|
||||||
SDL_Delay(100);
|
SDL_Delay(100);
|
||||||
continue;
|
continue;
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
SDL_free(ctx);
|
SDL_free(ctx);
|
||||||
}
|
}
|
||||||
@@ -1058,6 +1059,8 @@ static SDL_bool AlwaysUsesLabels(int vendor_id, int product_id, ESwitchDeviceInf
|
|||||||
{
|
{
|
||||||
/* These controllers don't have a diamond button configuration, so always use labels */
|
/* These controllers don't have a diamond button configuration, so always use labels */
|
||||||
switch (eControllerType) {
|
switch (eControllerType) {
|
||||||
|
case k_eSwitchDeviceInfoControllerType_HVCLeft:
|
||||||
|
case k_eSwitchDeviceInfoControllerType_HVCRight:
|
||||||
case k_eSwitchDeviceInfoControllerType_NESLeft:
|
case k_eSwitchDeviceInfoControllerType_NESLeft:
|
||||||
case k_eSwitchDeviceInfoControllerType_NESRight:
|
case k_eSwitchDeviceInfoControllerType_NESRight:
|
||||||
case k_eSwitchDeviceInfoControllerType_N64:
|
case k_eSwitchDeviceInfoControllerType_N64:
|
||||||
@@ -1104,7 +1107,8 @@ static SDL_bool HIDAPI_DriverNintendoClassic_IsSupportedDevice(SDL_HIDAPI_Device
|
|||||||
{
|
{
|
||||||
if (vendor_id == USB_VENDOR_NINTENDO) {
|
if (vendor_id == USB_VENDOR_NINTENDO) {
|
||||||
if (product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_RIGHT) {
|
if (product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_RIGHT) {
|
||||||
if (SDL_strncmp(name, "NES Controller", 14) == 0) {
|
if (SDL_strncmp(name, "NES Controller", 14) == 0 ||
|
||||||
|
SDL_strncmp(name, "HVC Controller", 14) == 0) {
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1219,6 +1223,14 @@ static void UpdateDeviceIdentity(SDL_HIDAPI_Device *device)
|
|||||||
HIDAPI_SetDeviceProduct(device, USB_VENDOR_NINTENDO, USB_PRODUCT_NINTENDO_SWITCH_PRO);
|
HIDAPI_SetDeviceProduct(device, USB_VENDOR_NINTENDO, USB_PRODUCT_NINTENDO_SWITCH_PRO);
|
||||||
device->type = SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO;
|
device->type = SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO;
|
||||||
break;
|
break;
|
||||||
|
case k_eSwitchDeviceInfoControllerType_HVCLeft:
|
||||||
|
HIDAPI_SetDeviceName(device, "Nintendo HVC Controller (1)");
|
||||||
|
device->type = SDL_CONTROLLER_TYPE_UNKNOWN;
|
||||||
|
break;
|
||||||
|
case k_eSwitchDeviceInfoControllerType_HVCRight:
|
||||||
|
HIDAPI_SetDeviceName(device, "Nintendo HVC Controller (2)");
|
||||||
|
device->type = SDL_CONTROLLER_TYPE_UNKNOWN;
|
||||||
|
break;
|
||||||
case k_eSwitchDeviceInfoControllerType_NESLeft:
|
case k_eSwitchDeviceInfoControllerType_NESLeft:
|
||||||
HIDAPI_SetDeviceName(device, "Nintendo NES Controller (L)");
|
HIDAPI_SetDeviceName(device, "Nintendo NES Controller (L)");
|
||||||
device->type = SDL_CONTROLLER_TYPE_UNKNOWN;
|
device->type = SDL_CONTROLLER_TYPE_UNKNOWN;
|
||||||
@@ -1246,6 +1258,7 @@ static void UpdateDeviceIdentity(SDL_HIDAPI_Device *device)
|
|||||||
/* We couldn't read the device info for this controller, might not be fully compliant */
|
/* We couldn't read the device info for this controller, might not be fully compliant */
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
|
device->type = SDL_CONTROLLER_TYPE_UNKNOWN;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
device->guid.data[15] = ctx->m_eControllerType;
|
device->guid.data[15] = ctx->m_eControllerType;
|
||||||
@@ -1347,7 +1360,9 @@ static SDL_bool HIDAPI_DriverSwitch_OpenJoystick(SDL_HIDAPI_Device *device, SDL_
|
|||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx->m_eControllerType != k_eSwitchDeviceInfoControllerType_NESLeft &&
|
if (ctx->m_eControllerType != k_eSwitchDeviceInfoControllerType_HVCLeft &&
|
||||||
|
ctx->m_eControllerType != k_eSwitchDeviceInfoControllerType_HVCRight &&
|
||||||
|
ctx->m_eControllerType != k_eSwitchDeviceInfoControllerType_NESLeft &&
|
||||||
ctx->m_eControllerType != k_eSwitchDeviceInfoControllerType_NESRight &&
|
ctx->m_eControllerType != k_eSwitchDeviceInfoControllerType_NESRight &&
|
||||||
ctx->m_eControllerType != k_eSwitchDeviceInfoControllerType_SNES &&
|
ctx->m_eControllerType != k_eSwitchDeviceInfoControllerType_SNES &&
|
||||||
ctx->m_eControllerType != k_eSwitchDeviceInfoControllerType_N64 &&
|
ctx->m_eControllerType != k_eSwitchDeviceInfoControllerType_N64 &&
|
||||||
@@ -2165,6 +2180,7 @@ static SDL_bool HIDAPI_DriverSwitch_UpdateDevice(SDL_HIDAPI_Device *device)
|
|||||||
HandleSimpleControllerState(joystick, ctx, (SwitchSimpleStatePacket_t *)&ctx->m_rgucReadBuffer[1]);
|
HandleSimpleControllerState(joystick, ctx, (SwitchSimpleStatePacket_t *)&ctx->m_rgucReadBuffer[1]);
|
||||||
break;
|
break;
|
||||||
case k_eSwitchInputReportIDs_FullControllerState:
|
case k_eSwitchInputReportIDs_FullControllerState:
|
||||||
|
case k_eSwitchInputReportIDs_FullControllerAndMcuState:
|
||||||
HandleFullControllerState(joystick, ctx, (SwitchStatePacket_t *)&ctx->m_rgucReadBuffer[1]);
|
HandleFullControllerState(joystick, ctx, (SwitchStatePacket_t *)&ctx->m_rgucReadBuffer[1]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -265,6 +265,7 @@ static SDL_GameControllerType SDL_GetJoystickGameControllerProtocol(const char *
|
|||||||
interface_protocol == XBONE_IFACE_PROTOCOL) {
|
interface_protocol == XBONE_IFACE_PROTOCOL) {
|
||||||
|
|
||||||
static const int SUPPORTED_VENDORS[] = {
|
static const int SUPPORTED_VENDORS[] = {
|
||||||
|
0x03f0, /* HP */
|
||||||
0x044f, /* Thrustmaster */
|
0x044f, /* Thrustmaster */
|
||||||
0x045e, /* Microsoft */
|
0x045e, /* Microsoft */
|
||||||
0x0738, /* Mad Catz */
|
0x0738, /* Mad Catz */
|
||||||
@@ -1436,6 +1437,12 @@ static int HIDAPI_JoystickOpen(SDL_Joystick *joystick, int device_index)
|
|||||||
device->updating = SDL_FALSE;
|
device->updating = SDL_FALSE;
|
||||||
SDL_UnlockMutex(device->dev_lock);
|
SDL_UnlockMutex(device->dev_lock);
|
||||||
|
|
||||||
|
/* UpdateDevice() may have called HIDAPI_JoystickDisconnected() if the device went away */
|
||||||
|
if (device->num_joysticks == 0) {
|
||||||
|
SDL_free(hwdata);
|
||||||
|
return SDL_SetError("HIDAPI device disconnected while opening");
|
||||||
|
}
|
||||||
|
|
||||||
if (!device->driver->OpenJoystick(device, joystick)) {
|
if (!device->driver->OpenJoystick(device, joystick)) {
|
||||||
/* The open failed, mark this device as disconnected and update devices */
|
/* The open failed, mark this device as disconnected and update devices */
|
||||||
HIDAPI_JoystickDisconnected(device, joystickID);
|
HIDAPI_JoystickDisconnected(device, joystickID);
|
||||||
|
|||||||
@@ -663,6 +663,10 @@ static void SDLCALL SDL_AppleTVRemoteRotationHintChanged(void *udata, const char
|
|||||||
|
|
||||||
static int IOS_JoystickInit(void)
|
static int IOS_JoystickInit(void)
|
||||||
{
|
{
|
||||||
|
if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_MFI, SDL_TRUE)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(__MACOSX__)
|
#if defined(__MACOSX__)
|
||||||
#if _SDL_HAS_BUILTIN(__builtin_available)
|
#if _SDL_HAS_BUILTIN(__builtin_available)
|
||||||
if (@available(macOS 10.16, *)) {
|
if (@available(macOS 10.16, *)) {
|
||||||
@@ -1680,6 +1684,10 @@ static SDL_bool IOS_JoystickGetGamepadMapping(int device_index, SDL_GamepadMappi
|
|||||||
#if defined(SDL_JOYSTICK_MFI) && defined(__MACOSX__)
|
#if defined(SDL_JOYSTICK_MFI) && defined(__MACOSX__)
|
||||||
SDL_bool IOS_SupportedHIDDevice(IOHIDDeviceRef device)
|
SDL_bool IOS_SupportedHIDDevice(IOHIDDeviceRef device)
|
||||||
{
|
{
|
||||||
|
if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_MFI, SDL_TRUE)) {
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (@available(macOS 10.16, *)) {
|
if (@available(macOS 10.16, *)) {
|
||||||
const int MAX_ATTEMPTS = 3;
|
const int MAX_ATTEMPTS = 3;
|
||||||
for (int attempt = 0; attempt < MAX_ATTEMPTS; ++attempt) {
|
for (int attempt = 0; attempt < MAX_ATTEMPTS; ++attempt) {
|
||||||
|
|||||||
@@ -1041,7 +1041,7 @@ static void ConfigJoystick(SDL_Joystick *joystick, int fd)
|
|||||||
}
|
}
|
||||||
for (i = 0; i < ABS_MAX; ++i) {
|
for (i = 0; i < ABS_MAX; ++i) {
|
||||||
/* Skip digital hats */
|
/* Skip digital hats */
|
||||||
if (joystick->hwdata->has_hat[(i - ABS_HAT0X) / 2]) {
|
if (i >= ABS_HAT0X && i <= ABS_HAT3Y && joystick->hwdata->has_hat[(i - ABS_HAT0X) / 2]) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (test_bit(i, absbit)) {
|
if (test_bit(i, absbit)) {
|
||||||
@@ -1752,11 +1752,11 @@ static SDL_bool LINUX_JoystickGetGamepadMapping(int device_index, SDL_GamepadMap
|
|||||||
/* We temporarily open the device to check how it's configured. Make
|
/* We temporarily open the device to check how it's configured. Make
|
||||||
a fake SDL_Joystick object to do so. */
|
a fake SDL_Joystick object to do so. */
|
||||||
joystick = (SDL_Joystick *)SDL_calloc(sizeof(*joystick), 1);
|
joystick = (SDL_Joystick *)SDL_calloc(sizeof(*joystick), 1);
|
||||||
joystick->magic = &SDL_joystick_magic;
|
|
||||||
if (joystick == NULL) {
|
if (joystick == NULL) {
|
||||||
SDL_OutOfMemory();
|
SDL_OutOfMemory();
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
joystick->magic = &SDL_joystick_magic;
|
||||||
SDL_memcpy(&joystick->guid, &item->guid, sizeof(item->guid));
|
SDL_memcpy(&joystick->guid, &item->guid, sizeof(item->guid));
|
||||||
|
|
||||||
joystick->hwdata = (struct joystick_hwdata *)
|
joystick->hwdata = (struct joystick_hwdata *)
|
||||||
@@ -2026,7 +2026,7 @@ static SDL_bool LINUX_JoystickGetGamepadMapping(int device_index, SDL_GamepadMap
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(mapped & MAPPED_TRIGGER_LEFT) && joystick->hwdata->has_key[BTN_TR2]) {
|
if (!(mapped & MAPPED_TRIGGER_RIGHT) && joystick->hwdata->has_key[BTN_TR2]) {
|
||||||
out->righttrigger.kind = EMappingKind_Button;
|
out->righttrigger.kind = EMappingKind_Button;
|
||||||
out->righttrigger.target = joystick->hwdata->key_map[BTN_TR2];
|
out->righttrigger.target = joystick->hwdata->key_map[BTN_TR2];
|
||||||
mapped |= MAPPED_TRIGGER_RIGHT;
|
mapped |= MAPPED_TRIGGER_RIGHT;
|
||||||
|
|||||||
+538
-500
File diff suppressed because it is too large.
Load diff
@@ -22,6 +22,7 @@ standard_guid_pattern = re.compile(r'^([0-9a-fA-F]{4})([0-9a-fA-F]{2})([0-9a-fA-
|
|||||||
invalid_controllers = (
|
invalid_controllers = (
|
||||||
('0079', '0006', '0000'), # DragonRise Inc. Generic USB Joystick
|
('0079', '0006', '0000'), # DragonRise Inc. Generic USB Joystick
|
||||||
('0079', '0006', '6120'), # DragonRise Inc. Generic USB Joystick
|
('0079', '0006', '6120'), # DragonRise Inc. Generic USB Joystick
|
||||||
|
('04b4', '2412', 'c529'), # Flydigi Vader 2, Vader 2 Pro, Apex 2, Apex 3
|
||||||
('16c0', '05e1', '0000'), # Xinmotek Controller
|
('16c0', '05e1', '0000'), # Xinmotek Controller
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,8 @@
|
|||||||
#define USB_VENDOR_VALVE 0x28de
|
#define USB_VENDOR_VALVE 0x28de
|
||||||
#define USB_VENDOR_ZEROPLUS 0x0c12
|
#define USB_VENDOR_ZEROPLUS 0x0c12
|
||||||
|
|
||||||
#define USB_PRODUCT_8BITDO_XBOX_CONTROLLER 0x2002
|
#define USB_PRODUCT_8BITDO_XBOX_CONTROLLER1 0x2002 /* Ultimate Wired Controller for Xbox */
|
||||||
|
#define USB_PRODUCT_8BITDO_XBOX_CONTROLLER2 0x3106 /* Ultimate Wireless / Pro 2 Wired Controller */
|
||||||
#define USB_PRODUCT_AMAZON_LUNA_CONTROLLER 0x0419
|
#define USB_PRODUCT_AMAZON_LUNA_CONTROLLER 0x0419
|
||||||
#define USB_PRODUCT_ASTRO_C40_XBOX360 0x0024
|
#define USB_PRODUCT_ASTRO_C40_XBOX360 0x0024
|
||||||
#define USB_PRODUCT_BACKBONE_ONE_IOS 0x0103
|
#define USB_PRODUCT_BACKBONE_ONE_IOS 0x0103
|
||||||
|
|||||||
@@ -453,7 +453,6 @@ static BOOL CALLBACK EnumJoystickDetectCallback(LPCDIDEVICEINSTANCE pDeviceInsta
|
|||||||
char *hidPath = NULL;
|
char *hidPath = NULL;
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
LPDIRECTINPUTDEVICE8 device = NULL;
|
LPDIRECTINPUTDEVICE8 device = NULL;
|
||||||
DIDEVCAPS caps;
|
|
||||||
|
|
||||||
/* We are only supporting HID devices. */
|
/* We are only supporting HID devices. */
|
||||||
CHECK(pDeviceInstance->dwDevType & DIDEVTYPE_HID);
|
CHECK(pDeviceInstance->dwDevType & DIDEVTYPE_HID);
|
||||||
@@ -463,13 +462,6 @@ static BOOL CALLBACK EnumJoystickDetectCallback(LPCDIDEVICEINSTANCE pDeviceInsta
|
|||||||
CHECK(QueryDevicePath(device, &hidPath));
|
CHECK(QueryDevicePath(device, &hidPath));
|
||||||
CHECK(QueryDeviceInfo(device, &vendor, &product));
|
CHECK(QueryDeviceInfo(device, &vendor, &product));
|
||||||
|
|
||||||
/* Check to make sure the device has buttons and axes.
|
|
||||||
* This fixes incorrectly detecting the ROG CHAKRAM X mouse as a game controller on Windows 10
|
|
||||||
*/
|
|
||||||
caps.dwSize = sizeof(caps);
|
|
||||||
CHECK(SUCCEEDED(IDirectInputDevice8_GetCapabilities(device, &caps)));
|
|
||||||
CHECK(caps.dwAxes > 0 && caps.dwButtons > 0);
|
|
||||||
|
|
||||||
CHECK(!SDL_IsXInputDevice(vendor, product, hidPath));
|
CHECK(!SDL_IsXInputDevice(vendor, product, hidPath));
|
||||||
|
|
||||||
pNewJoystick = *(JoyStick_DeviceData **)pContext;
|
pNewJoystick = *(JoyStick_DeviceData **)pContext;
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#if SDL_JOYSTICK_RAWINPUT
|
#if SDL_JOYSTICK_RAWINPUT
|
||||||
|
|
||||||
|
#include "SDL_atomic.h"
|
||||||
#include "SDL_endian.h"
|
#include "SDL_endian.h"
|
||||||
#include "SDL_events.h"
|
#include "SDL_events.h"
|
||||||
#include "SDL_hints.h"
|
#include "SDL_hints.h"
|
||||||
@@ -47,7 +48,7 @@
|
|||||||
raw input will turn off the Xbox Series X controller when it is connected via the
|
raw input will turn off the Xbox Series X controller when it is connected via the
|
||||||
Xbox One Wireless Adapter.
|
Xbox One Wireless Adapter.
|
||||||
*/
|
*/
|
||||||
#if 0 /*def HAVE_XINPUT_H*/
|
#ifdef HAVE_XINPUT_H
|
||||||
#define SDL_JOYSTICK_RAWINPUT_XINPUT
|
#define SDL_JOYSTICK_RAWINPUT_XINPUT
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_WINDOWS_GAMING_INPUT_H
|
#ifdef HAVE_WINDOWS_GAMING_INPUT_H
|
||||||
@@ -78,7 +79,9 @@ typedef struct WindowsGamingInputGamepadState WindowsGamingInputGamepadState;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*#define DEBUG_RAWINPUT*/
|
#if 0
|
||||||
|
#define DEBUG_RAWINPUT
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef RIDEV_EXINPUTSINK
|
#ifndef RIDEV_EXINPUTSINK
|
||||||
#define RIDEV_EXINPUTSINK 0x00001000
|
#define RIDEV_EXINPUTSINK 0x00001000
|
||||||
@@ -401,6 +404,21 @@ static SDL_bool RAWINPUT_GuessXInputSlot(const WindowsMatchState *state, Uint8 *
|
|||||||
int user_index;
|
int user_index;
|
||||||
int match_count;
|
int match_count;
|
||||||
|
|
||||||
|
/* If there is only one available slot, let's use that
|
||||||
|
* That will be right most of the time, and uncorrelation will fix any bad guesses
|
||||||
|
*/
|
||||||
|
match_count = 0;
|
||||||
|
for (user_index = 0; user_index < XUSER_MAX_COUNT; ++user_index) {
|
||||||
|
if (xinput_state[user_index].connected && !xinput_state[user_index].used) {
|
||||||
|
*slot_idx = user_index;
|
||||||
|
++match_count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (match_count == 1) {
|
||||||
|
*correlation_id = ++xinput_state[*slot_idx].correlation_id;
|
||||||
|
return SDL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
*slot_idx = 0;
|
*slot_idx = 0;
|
||||||
|
|
||||||
match_count = 0;
|
match_count = 0;
|
||||||
@@ -445,8 +463,86 @@ static struct
|
|||||||
SDL_bool need_device_list_update;
|
SDL_bool need_device_list_update;
|
||||||
int ref_count;
|
int ref_count;
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics *gamepad_statics;
|
__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics *gamepad_statics;
|
||||||
|
EventRegistrationToken gamepad_added_token;
|
||||||
|
EventRegistrationToken gamepad_removed_token;
|
||||||
} wgi_state;
|
} wgi_state;
|
||||||
|
|
||||||
|
typedef struct GamepadDelegate
|
||||||
|
{
|
||||||
|
__FIEventHandler_1_Windows__CGaming__CInput__CGamepad iface;
|
||||||
|
SDL_atomic_t refcount;
|
||||||
|
} GamepadDelegate;
|
||||||
|
|
||||||
|
static const IID IID_IEventHandler_Gamepad = { 0x8a7639ee, 0x624a, 0x501a, { 0xbb, 0x53, 0x56, 0x2d, 0x1e, 0xc1, 0x1b, 0x52 } };
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE IEventHandler_CGamepadVtbl_QueryInterface(__FIEventHandler_1_Windows__CGaming__CInput__CGamepad *This, REFIID riid, void **ppvObject)
|
||||||
|
{
|
||||||
|
if (ppvObject == NULL) {
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ppvObject = NULL;
|
||||||
|
if (WIN_IsEqualIID(riid, &IID_IUnknown) || WIN_IsEqualIID(riid, &IID_IAgileObject) || WIN_IsEqualIID(riid, &IID_IEventHandler_Gamepad)) {
|
||||||
|
*ppvObject = This;
|
||||||
|
__FIEventHandler_1_Windows__CGaming__CInput__CGamepad_AddRef(This);
|
||||||
|
return S_OK;
|
||||||
|
} else if (WIN_IsEqualIID(riid, &IID_IMarshal)) {
|
||||||
|
/* This seems complicated. Let's hope it doesn't happen. */
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
} else {
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG STDMETHODCALLTYPE IEventHandler_CGamepadVtbl_AddRef(__FIEventHandler_1_Windows__CGaming__CInput__CGamepad *This)
|
||||||
|
{
|
||||||
|
GamepadDelegate *self = (GamepadDelegate *)This;
|
||||||
|
return SDL_AtomicAdd(&self->refcount, 1) + 1UL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG STDMETHODCALLTYPE IEventHandler_CGamepadVtbl_Release(__FIEventHandler_1_Windows__CGaming__CInput__CGamepad *This)
|
||||||
|
{
|
||||||
|
GamepadDelegate *self = (GamepadDelegate *)This;
|
||||||
|
int rc = SDL_AtomicAdd(&self->refcount, -1) - 1;
|
||||||
|
/* Should never free the static delegate objects */
|
||||||
|
SDL_assert(rc > 0);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE IEventHandler_CGamepadVtbl_InvokeAdded(__FIEventHandler_1_Windows__CGaming__CInput__CGamepad *This, IInspectable *sender, __x_ABI_CWindows_CGaming_CInput_CIGamepad *e)
|
||||||
|
{
|
||||||
|
wgi_state.need_device_list_update = SDL_TRUE;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT STDMETHODCALLTYPE IEventHandler_CGamepadVtbl_InvokeRemoved(__FIEventHandler_1_Windows__CGaming__CInput__CGamepad *This, IInspectable *sender, __x_ABI_CWindows_CGaming_CInput_CIGamepad *e)
|
||||||
|
{
|
||||||
|
wgi_state.need_device_list_update = SDL_TRUE;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __FIEventHandler_1_Windows__CGaming__CInput__CGamepadVtbl gamepad_added_vtbl = {
|
||||||
|
IEventHandler_CGamepadVtbl_QueryInterface,
|
||||||
|
IEventHandler_CGamepadVtbl_AddRef,
|
||||||
|
IEventHandler_CGamepadVtbl_Release,
|
||||||
|
IEventHandler_CGamepadVtbl_InvokeAdded
|
||||||
|
};
|
||||||
|
static GamepadDelegate gamepad_added = {
|
||||||
|
{ &gamepad_added_vtbl },
|
||||||
|
{ 1 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static __FIEventHandler_1_Windows__CGaming__CInput__CGamepadVtbl gamepad_removed_vtbl = {
|
||||||
|
IEventHandler_CGamepadVtbl_QueryInterface,
|
||||||
|
IEventHandler_CGamepadVtbl_AddRef,
|
||||||
|
IEventHandler_CGamepadVtbl_Release,
|
||||||
|
IEventHandler_CGamepadVtbl_InvokeRemoved
|
||||||
|
};
|
||||||
|
static GamepadDelegate gamepad_removed = {
|
||||||
|
{ &gamepad_removed_vtbl },
|
||||||
|
{ 1 }
|
||||||
|
};
|
||||||
|
|
||||||
static void RAWINPUT_MarkWindowsGamingInputSlotUsed(WindowsGamingInputGamepadState *wgi_slot, RAWINPUT_DeviceContext *ctx)
|
static void RAWINPUT_MarkWindowsGamingInputSlotUsed(WindowsGamingInputGamepadState *wgi_slot, RAWINPUT_DeviceContext *ctx)
|
||||||
{
|
{
|
||||||
wgi_slot->used = SDL_TRUE;
|
wgi_slot->used = SDL_TRUE;
|
||||||
@@ -564,7 +660,10 @@ static void RAWINPUT_UpdateWindowsGamingInput()
|
|||||||
}
|
}
|
||||||
static void RAWINPUT_InitWindowsGamingInput(RAWINPUT_DeviceContext *ctx)
|
static void RAWINPUT_InitWindowsGamingInput(RAWINPUT_DeviceContext *ctx)
|
||||||
{
|
{
|
||||||
wgi_state.need_device_list_update = SDL_TRUE;
|
if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_WGI, SDL_TRUE)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
wgi_state.ref_count++;
|
wgi_state.ref_count++;
|
||||||
if (!wgi_state.initialized) {
|
if (!wgi_state.initialized) {
|
||||||
static const IID SDL_IID_IGamepadStatics = { 0x8BBCE529, 0xD49C, 0x39E9, { 0x95, 0x60, 0xE4, 0x7D, 0xDE, 0x96, 0xB7, 0xC8 } };
|
static const IID SDL_IID_IGamepadStatics = { 0x8BBCE529, 0xD49C, 0x39E9, { 0x95, 0x60, 0xE4, 0x7D, 0xDE, 0x96, 0xB7, 0xC8 } };
|
||||||
@@ -596,6 +695,20 @@ static void RAWINPUT_InitWindowsGamingInput(RAWINPUT_DeviceContext *ctx)
|
|||||||
if (SUCCEEDED(hr)) {
|
if (SUCCEEDED(hr)) {
|
||||||
RoGetActivationFactoryFunc(hNamespaceString, &SDL_IID_IGamepadStatics, (void **)&wgi_state.gamepad_statics);
|
RoGetActivationFactoryFunc(hNamespaceString, &SDL_IID_IGamepadStatics, (void **)&wgi_state.gamepad_statics);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wgi_state.gamepad_statics) {
|
||||||
|
wgi_state.need_device_list_update = SDL_TRUE;
|
||||||
|
|
||||||
|
hr = __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_add_GamepadAdded(wgi_state.gamepad_statics, &gamepad_added.iface, &wgi_state.gamepad_added_token);
|
||||||
|
if (!SUCCEEDED(hr)) {
|
||||||
|
SDL_SetError("add_GamepadAdded() failed: 0x%lx\n", hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_add_GamepadRemoved(wgi_state.gamepad_statics, &gamepad_removed.iface, &wgi_state.gamepad_removed_token);
|
||||||
|
if (!SUCCEEDED(hr)) {
|
||||||
|
SDL_SetError("add_GamepadRemoved() failed: 0x%lx\n", hr);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -621,10 +734,27 @@ static SDL_bool RAWINPUT_WindowsGamingInputSlotMatches(const WindowsMatchState *
|
|||||||
static SDL_bool RAWINPUT_GuessWindowsGamingInputSlot(const WindowsMatchState *state, Uint8 *correlation_id, WindowsGamingInputGamepadState **slot, SDL_bool xinput_correlated)
|
static SDL_bool RAWINPUT_GuessWindowsGamingInputSlot(const WindowsMatchState *state, Uint8 *correlation_id, WindowsGamingInputGamepadState **slot, SDL_bool xinput_correlated)
|
||||||
{
|
{
|
||||||
int match_count, user_index;
|
int match_count, user_index;
|
||||||
|
WindowsGamingInputGamepadState *gamepad_state = NULL;
|
||||||
|
|
||||||
|
/* If there is only one available slot, let's use that
|
||||||
|
* That will be right most of the time, and uncorrelation will fix any bad guesses
|
||||||
|
*/
|
||||||
|
match_count = 0;
|
||||||
|
for (user_index = 0; user_index < wgi_state.per_gamepad_count; ++user_index) {
|
||||||
|
gamepad_state = wgi_state.per_gamepad[user_index];
|
||||||
|
if (gamepad_state->connected && !gamepad_state->used) {
|
||||||
|
*slot = gamepad_state;
|
||||||
|
++match_count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (match_count == 1) {
|
||||||
|
*correlation_id = ++gamepad_state->correlation_id;
|
||||||
|
return SDL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
match_count = 0;
|
match_count = 0;
|
||||||
for (user_index = 0; user_index < wgi_state.per_gamepad_count; ++user_index) {
|
for (user_index = 0; user_index < wgi_state.per_gamepad_count; ++user_index) {
|
||||||
WindowsGamingInputGamepadState *gamepad_state = wgi_state.per_gamepad[user_index];
|
gamepad_state = wgi_state.per_gamepad[user_index];
|
||||||
if (RAWINPUT_WindowsGamingInputSlotMatches(state, gamepad_state, xinput_correlated)) {
|
if (RAWINPUT_WindowsGamingInputSlotMatches(state, gamepad_state, xinput_correlated)) {
|
||||||
++match_count;
|
++match_count;
|
||||||
*slot = gamepad_state;
|
*slot = gamepad_state;
|
||||||
@@ -643,7 +773,6 @@ static SDL_bool RAWINPUT_GuessWindowsGamingInputSlot(const WindowsMatchState *st
|
|||||||
|
|
||||||
static void RAWINPUT_QuitWindowsGamingInput(RAWINPUT_DeviceContext *ctx)
|
static void RAWINPUT_QuitWindowsGamingInput(RAWINPUT_DeviceContext *ctx)
|
||||||
{
|
{
|
||||||
wgi_state.need_device_list_update = SDL_TRUE;
|
|
||||||
--wgi_state.ref_count;
|
--wgi_state.ref_count;
|
||||||
if (!wgi_state.ref_count && wgi_state.initialized) {
|
if (!wgi_state.ref_count && wgi_state.initialized) {
|
||||||
int ii;
|
int ii;
|
||||||
@@ -656,6 +785,8 @@ static void RAWINPUT_QuitWindowsGamingInput(RAWINPUT_DeviceContext *ctx)
|
|||||||
}
|
}
|
||||||
wgi_state.per_gamepad_count = 0;
|
wgi_state.per_gamepad_count = 0;
|
||||||
if (wgi_state.gamepad_statics) {
|
if (wgi_state.gamepad_statics) {
|
||||||
|
__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_remove_GamepadAdded(wgi_state.gamepad_statics, wgi_state.gamepad_added_token);
|
||||||
|
__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_remove_GamepadRemoved(wgi_state.gamepad_statics, wgi_state.gamepad_removed_token);
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_Release(wgi_state.gamepad_statics);
|
__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_Release(wgi_state.gamepad_statics);
|
||||||
wgi_state.gamepad_statics = NULL;
|
wgi_state.gamepad_statics = NULL;
|
||||||
}
|
}
|
||||||
@@ -857,7 +988,8 @@ static void RAWINPUT_DetectDevices(void)
|
|||||||
|
|
||||||
devices = (PRAWINPUTDEVICELIST)SDL_malloc(sizeof(RAWINPUTDEVICELIST) * device_count);
|
devices = (PRAWINPUTDEVICELIST)SDL_malloc(sizeof(RAWINPUTDEVICELIST) * device_count);
|
||||||
if (devices) {
|
if (devices) {
|
||||||
if (GetRawInputDeviceList(devices, &device_count, sizeof(RAWINPUTDEVICELIST)) != -1) {
|
device_count = GetRawInputDeviceList(devices, &device_count, sizeof(RAWINPUTDEVICELIST));
|
||||||
|
if (device_count != (UINT)-1) {
|
||||||
for (i = 0; i < device_count; ++i) {
|
for (i = 0; i < device_count; ++i) {
|
||||||
RAWINPUT_AddDevice(devices[i].hDevice);
|
RAWINPUT_AddDevice(devices[i].hDevice);
|
||||||
}
|
}
|
||||||
@@ -879,12 +1011,12 @@ static int RAWINPUT_JoystickInit(void)
|
|||||||
{
|
{
|
||||||
SDL_assert(!SDL_RAWINPUT_inited);
|
SDL_assert(!SDL_RAWINPUT_inited);
|
||||||
|
|
||||||
if (!WIN_IsWindowsVistaOrGreater()) {
|
if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_RAWINPUT, SDL_TRUE)) {
|
||||||
/* According to bug 6400, this doesn't work on Windows XP */
|
return 0;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_RAWINPUT, SDL_TRUE)) {
|
if (!WIN_IsWindowsVistaOrGreater()) {
|
||||||
|
/* According to bug 6400, this doesn't work on Windows XP */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -917,9 +1049,6 @@ SDL_bool RAWINPUT_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 ve
|
|||||||
#ifdef SDL_JOYSTICK_RAWINPUT_XINPUT
|
#ifdef SDL_JOYSTICK_RAWINPUT_XINPUT
|
||||||
xinput_device_change = SDL_TRUE;
|
xinput_device_change = SDL_TRUE;
|
||||||
#endif
|
#endif
|
||||||
#ifdef SDL_JOYSTICK_RAWINPUT_WGI
|
|
||||||
wgi_state.need_device_list_update = SDL_TRUE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
device = SDL_RAWINPUT_devices;
|
device = SDL_RAWINPUT_devices;
|
||||||
while (device) {
|
while (device) {
|
||||||
@@ -1008,8 +1137,13 @@ static void RAWINPUT_PostUpdate(void)
|
|||||||
|
|
||||||
static void RAWINPUT_JoystickDetect(void)
|
static void RAWINPUT_JoystickDetect(void)
|
||||||
{
|
{
|
||||||
SDL_bool remote_desktop = GetSystemMetrics(SM_REMOTESESSION) ? SDL_TRUE : SDL_FALSE;
|
SDL_bool remote_desktop;
|
||||||
|
|
||||||
|
if (!SDL_RAWINPUT_inited) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
remote_desktop = GetSystemMetrics(SM_REMOTESESSION) ? SDL_TRUE : SDL_FALSE;
|
||||||
if (remote_desktop != SDL_RAWINPUT_remote_desktop) {
|
if (remote_desktop != SDL_RAWINPUT_remote_desktop) {
|
||||||
SDL_RAWINPUT_remote_desktop = remote_desktop;
|
SDL_RAWINPUT_remote_desktop = remote_desktop;
|
||||||
|
|
||||||
@@ -1281,20 +1415,8 @@ static int RAWINPUT_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_
|
|||||||
#endif
|
#endif
|
||||||
SDL_bool rumbled = SDL_FALSE;
|
SDL_bool rumbled = SDL_FALSE;
|
||||||
|
|
||||||
#ifdef SDL_JOYSTICK_RAWINPUT_WGI
|
|
||||||
if (!rumbled && ctx->wgi_correlated) {
|
|
||||||
WindowsGamingInputGamepadState *gamepad_state = ctx->wgi_slot;
|
|
||||||
HRESULT hr;
|
|
||||||
gamepad_state->vibration.LeftMotor = (DOUBLE)low_frequency_rumble / SDL_MAX_UINT16;
|
|
||||||
gamepad_state->vibration.RightMotor = (DOUBLE)high_frequency_rumble / SDL_MAX_UINT16;
|
|
||||||
hr = __x_ABI_CWindows_CGaming_CInput_CIGamepad_put_Vibration(gamepad_state->gamepad, gamepad_state->vibration);
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
rumbled = SDL_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SDL_JOYSTICK_RAWINPUT_XINPUT
|
#ifdef SDL_JOYSTICK_RAWINPUT_XINPUT
|
||||||
|
/* Prefer XInput over WGI because it allows rumble in the background */
|
||||||
if (!rumbled && ctx->xinput_correlated) {
|
if (!rumbled && ctx->xinput_correlated) {
|
||||||
XINPUT_VIBRATION XVibration;
|
XINPUT_VIBRATION XVibration;
|
||||||
|
|
||||||
@@ -1312,6 +1434,19 @@ static int RAWINPUT_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_
|
|||||||
}
|
}
|
||||||
#endif /* SDL_JOYSTICK_RAWINPUT_XINPUT */
|
#endif /* SDL_JOYSTICK_RAWINPUT_XINPUT */
|
||||||
|
|
||||||
|
#ifdef SDL_JOYSTICK_RAWINPUT_WGI
|
||||||
|
if (!rumbled && ctx->wgi_correlated) {
|
||||||
|
WindowsGamingInputGamepadState *gamepad_state = ctx->wgi_slot;
|
||||||
|
HRESULT hr;
|
||||||
|
gamepad_state->vibration.LeftMotor = (DOUBLE)low_frequency_rumble / SDL_MAX_UINT16;
|
||||||
|
gamepad_state->vibration.RightMotor = (DOUBLE)high_frequency_rumble / SDL_MAX_UINT16;
|
||||||
|
hr = __x_ABI_CWindows_CGaming_CInput_CIGamepad_put_Vibration(gamepad_state->gamepad, gamepad_state->vibration);
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
rumbled = SDL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!rumbled) {
|
if (!rumbled) {
|
||||||
#if defined(SDL_JOYSTICK_RAWINPUT_WGI) || defined(SDL_JOYSTICK_RAWINPUT_XINPUT)
|
#if defined(SDL_JOYSTICK_RAWINPUT_WGI) || defined(SDL_JOYSTICK_RAWINPUT_XINPUT)
|
||||||
return SDL_SetError("Controller isn't correlated yet, try hitting a button first");
|
return SDL_SetError("Controller isn't correlated yet, try hitting a button first");
|
||||||
@@ -1911,10 +2046,14 @@ static void RAWINPUT_JoystickClose(SDL_Joystick *joystick)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_bool RAWINPUT_RegisterNotifications(HWND hWnd)
|
int RAWINPUT_RegisterNotifications(HWND hWnd)
|
||||||
{
|
{
|
||||||
RAWINPUTDEVICE rid[SDL_arraysize(subscribed_devices)];
|
|
||||||
int i;
|
int i;
|
||||||
|
RAWINPUTDEVICE rid[SDL_arraysize(subscribed_devices)];
|
||||||
|
|
||||||
|
if (!SDL_RAWINPUT_inited) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < SDL_arraysize(subscribed_devices); i++) {
|
for (i = 0; i < SDL_arraysize(subscribed_devices); i++) {
|
||||||
rid[i].usUsagePage = USB_USAGEPAGE_GENERIC_DESKTOP;
|
rid[i].usUsagePage = USB_USAGEPAGE_GENERIC_DESKTOP;
|
||||||
@@ -1924,17 +2063,20 @@ SDL_bool RAWINPUT_RegisterNotifications(HWND hWnd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!RegisterRawInputDevices(rid, SDL_arraysize(rid), sizeof(RAWINPUTDEVICE))) {
|
if (!RegisterRawInputDevices(rid, SDL_arraysize(rid), sizeof(RAWINPUTDEVICE))) {
|
||||||
SDL_SetError("Couldn't register for raw input events");
|
return SDL_SetError("Couldn't register for raw input events");
|
||||||
return SDL_FALSE;
|
|
||||||
}
|
}
|
||||||
return SDL_TRUE;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RAWINPUT_UnregisterNotifications()
|
int RAWINPUT_UnregisterNotifications()
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
RAWINPUTDEVICE rid[SDL_arraysize(subscribed_devices)];
|
RAWINPUTDEVICE rid[SDL_arraysize(subscribed_devices)];
|
||||||
|
|
||||||
|
if (!SDL_RAWINPUT_inited) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < SDL_arraysize(subscribed_devices); i++) {
|
for (i = 0; i < SDL_arraysize(subscribed_devices); i++) {
|
||||||
rid[i].usUsagePage = USB_USAGEPAGE_GENERIC_DESKTOP;
|
rid[i].usUsagePage = USB_USAGEPAGE_GENERIC_DESKTOP;
|
||||||
rid[i].usUsage = subscribed_devices[i];
|
rid[i].usUsage = subscribed_devices[i];
|
||||||
@@ -1943,9 +2085,9 @@ void RAWINPUT_UnregisterNotifications()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!RegisterRawInputDevices(rid, SDL_arraysize(rid), sizeof(RAWINPUTDEVICE))) {
|
if (!RegisterRawInputDevices(rid, SDL_arraysize(rid), sizeof(RAWINPUTDEVICE))) {
|
||||||
SDL_SetError("Couldn't unregister for raw input events");
|
return SDL_SetError("Couldn't unregister for raw input events");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LRESULT CALLBACK
|
LRESULT CALLBACK
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ extern SDL_bool RAWINPUT_IsEnabled();
|
|||||||
extern SDL_bool RAWINPUT_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version, const char *name);
|
extern SDL_bool RAWINPUT_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version, const char *name);
|
||||||
|
|
||||||
/* Registers for input events */
|
/* Registers for input events */
|
||||||
extern SDL_bool RAWINPUT_RegisterNotifications(HWND hWnd);
|
extern int RAWINPUT_RegisterNotifications(HWND hWnd);
|
||||||
extern void RAWINPUT_UnregisterNotifications();
|
extern int RAWINPUT_UnregisterNotifications();
|
||||||
|
|
||||||
/* Returns 0 if message was handled */
|
/* Returns 0 if message was handled */
|
||||||
extern LRESULT CALLBACK RAWINPUT_WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
extern LRESULT CALLBACK RAWINPUT_WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
|
|||||||
@@ -101,6 +101,9 @@ static const IID IID_IRacingWheelStatics = { 0x3AC12CD5, 0x581B, 0x4936, { 0x9F,
|
|||||||
static const IID IID_IRacingWheelStatics2 = { 0xE666BCAA, 0xEDFD, 0x4323, { 0xA9, 0xF6, 0x3C, 0x38, 0x40, 0x48, 0xD1, 0xED } };
|
static const IID IID_IRacingWheelStatics2 = { 0xE666BCAA, 0xEDFD, 0x4323, { 0xA9, 0xF6, 0x3C, 0x38, 0x40, 0x48, 0xD1, 0xED } };
|
||||||
/*static const IID IID_IRacingWheel = { 0xF546656F, 0xE106, 0x4C82, { 0xA9, 0x0F, 0x55, 0x40, 0x12, 0x90, 0x4B, 0x85 } };*/
|
/*static const IID IID_IRacingWheel = { 0xF546656F, 0xE106, 0x4C82, { 0xA9, 0x0F, 0x55, 0x40, 0x12, 0x90, 0x4B, 0x85 } };*/
|
||||||
|
|
||||||
|
typedef HRESULT(WINAPI *WindowsCreateStringReference_t)(PCWSTR sourceString, UINT32 length, HSTRING_HEADER *hstringHeader, HSTRING *string);
|
||||||
|
typedef HRESULT(WINAPI *RoGetActivationFactory_t)(HSTRING activatableClassId, REFIID iid, void **factory);
|
||||||
|
|
||||||
|
|
||||||
extern SDL_bool SDL_XINPUT_Enabled(void);
|
extern SDL_bool SDL_XINPUT_Enabled(void);
|
||||||
extern SDL_bool SDL_DINPUT_JoystickPresent(Uint16 vendor, Uint16 product, Uint16 version);
|
extern SDL_bool SDL_DINPUT_JoystickPresent(Uint16 vendor, Uint16 product, Uint16 version);
|
||||||
@@ -133,7 +136,8 @@ static SDL_bool SDL_IsXInputDevice(Uint16 vendor, Uint16 product)
|
|||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetRawInputDeviceList(raw_devices, &raw_device_count, sizeof(RAWINPUTDEVICELIST)) == -1) {
|
raw_device_count = GetRawInputDeviceList(raw_devices, &raw_device_count, sizeof(RAWINPUTDEVICELIST));
|
||||||
|
if (raw_device_count == (UINT)-1) {
|
||||||
SDL_free(raw_devices);
|
SDL_free(raw_devices);
|
||||||
raw_devices = NULL;
|
raw_devices = NULL;
|
||||||
return SDL_FALSE; /* oh well. */
|
return SDL_FALSE; /* oh well. */
|
||||||
@@ -211,6 +215,136 @@ static SDL_bool SDL_IsXInputDevice(Uint16 vendor, Uint16 product)
|
|||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void WGI_LoadRawGameControllerStatics()
|
||||||
|
{
|
||||||
|
WindowsCreateStringReference_t WindowsCreateStringReferenceFunc = NULL;
|
||||||
|
RoGetActivationFactory_t RoGetActivationFactoryFunc = NULL;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
#ifdef __WINRT__
|
||||||
|
WindowsCreateStringReferenceFunc = WindowsCreateStringReference;
|
||||||
|
RoGetActivationFactoryFunc = RoGetActivationFactory;
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
WindowsCreateStringReferenceFunc = (WindowsCreateStringReference_t)WIN_LoadComBaseFunction("WindowsCreateStringReference");
|
||||||
|
RoGetActivationFactoryFunc = (RoGetActivationFactory_t)WIN_LoadComBaseFunction("RoGetActivationFactory");
|
||||||
|
}
|
||||||
|
#endif /* __WINRT__ */
|
||||||
|
if (WindowsCreateStringReferenceFunc && RoGetActivationFactoryFunc) {
|
||||||
|
PCWSTR pNamespace;
|
||||||
|
HSTRING_HEADER hNamespaceStringHeader;
|
||||||
|
HSTRING hNamespaceString;
|
||||||
|
|
||||||
|
pNamespace = L"Windows.Gaming.Input.RawGameController";
|
||||||
|
hr = WindowsCreateStringReferenceFunc(pNamespace, (UINT32)SDL_wcslen(pNamespace), &hNamespaceStringHeader, &hNamespaceString);
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
hr = RoGetActivationFactoryFunc(hNamespaceString, &IID_IRawGameControllerStatics, (void **)&wgi.statics);
|
||||||
|
if (!SUCCEEDED(hr)) {
|
||||||
|
SDL_SetError("Couldn't find IRawGameControllerStatics: 0x%lx", hr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WGI_LoadOtherControllerStatics()
|
||||||
|
{
|
||||||
|
WindowsCreateStringReference_t WindowsCreateStringReferenceFunc = NULL;
|
||||||
|
RoGetActivationFactory_t RoGetActivationFactoryFunc = NULL;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
#ifdef __WINRT__
|
||||||
|
WindowsCreateStringReferenceFunc = WindowsCreateStringReference;
|
||||||
|
RoGetActivationFactoryFunc = RoGetActivationFactory;
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
WindowsCreateStringReferenceFunc = (WindowsCreateStringReference_t)WIN_LoadComBaseFunction("WindowsCreateStringReference");
|
||||||
|
RoGetActivationFactoryFunc = (RoGetActivationFactory_t)WIN_LoadComBaseFunction("RoGetActivationFactory");
|
||||||
|
}
|
||||||
|
#endif /* __WINRT__ */
|
||||||
|
if (WindowsCreateStringReferenceFunc && RoGetActivationFactoryFunc) {
|
||||||
|
PCWSTR pNamespace;
|
||||||
|
HSTRING_HEADER hNamespaceStringHeader;
|
||||||
|
HSTRING hNamespaceString;
|
||||||
|
|
||||||
|
pNamespace = L"Windows.Gaming.Input.ArcadeStick";
|
||||||
|
hr = WindowsCreateStringReferenceFunc(pNamespace, (UINT32)SDL_wcslen(pNamespace), &hNamespaceStringHeader, &hNamespaceString);
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
hr = RoGetActivationFactoryFunc(hNamespaceString, &IID_IArcadeStickStatics, (void **)&wgi.arcade_stick_statics);
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_QueryInterface(wgi.arcade_stick_statics, &IID_IArcadeStickStatics2, (void **)&wgi.arcade_stick_statics2);
|
||||||
|
} else {
|
||||||
|
SDL_SetError("Couldn't find IID_IArcadeStickStatics: 0x%lx", hr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pNamespace = L"Windows.Gaming.Input.FlightStick";
|
||||||
|
hr = WindowsCreateStringReferenceFunc(pNamespace, (UINT32)SDL_wcslen(pNamespace), &hNamespaceStringHeader, &hNamespaceString);
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
hr = RoGetActivationFactoryFunc(hNamespaceString, &IID_IFlightStickStatics, (void **)&wgi.flight_stick_statics);
|
||||||
|
if (!SUCCEEDED(hr)) {
|
||||||
|
SDL_SetError("Couldn't find IID_IFlightStickStatics: 0x%lx", hr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pNamespace = L"Windows.Gaming.Input.Gamepad";
|
||||||
|
hr = WindowsCreateStringReferenceFunc(pNamespace, (UINT32)SDL_wcslen(pNamespace), &hNamespaceStringHeader, &hNamespaceString);
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
hr = RoGetActivationFactoryFunc(hNamespaceString, &IID_IGamepadStatics, (void **)&wgi.gamepad_statics);
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_QueryInterface(wgi.gamepad_statics, &IID_IGamepadStatics2, (void **)&wgi.gamepad_statics2);
|
||||||
|
} else {
|
||||||
|
SDL_SetError("Couldn't find IGamepadStatics: 0x%lx", hr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pNamespace = L"Windows.Gaming.Input.RacingWheel";
|
||||||
|
hr = WindowsCreateStringReferenceFunc(pNamespace, (UINT32)SDL_wcslen(pNamespace), &hNamespaceStringHeader, &hNamespaceString);
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
hr = RoGetActivationFactoryFunc(hNamespaceString, &IID_IRacingWheelStatics, (void **)&wgi.racing_wheel_statics);
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_QueryInterface(wgi.racing_wheel_statics, &IID_IRacingWheelStatics2, (void **)&wgi.racing_wheel_statics2);
|
||||||
|
} else {
|
||||||
|
SDL_SetError("Couldn't find IRacingWheelStatics: 0x%lx", hr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static SDL_JoystickType GetGameControllerType(__x_ABI_CWindows_CGaming_CInput_CIGameController *gamecontroller)
|
||||||
|
{
|
||||||
|
__x_ABI_CWindows_CGaming_CInput_CIArcadeStick *arcade_stick = NULL;
|
||||||
|
__x_ABI_CWindows_CGaming_CInput_CIFlightStick *flight_stick = NULL;
|
||||||
|
__x_ABI_CWindows_CGaming_CInput_CIGamepad *gamepad = NULL;
|
||||||
|
__x_ABI_CWindows_CGaming_CInput_CIRacingWheel *racing_wheel = NULL;
|
||||||
|
|
||||||
|
/* Wait to initialize these interfaces until we need them.
|
||||||
|
* Initializing the gamepad interface will switch Bluetooth PS4 controllers into enhanced mode, breaking DirectInput
|
||||||
|
*/
|
||||||
|
WGI_LoadOtherControllerStatics();
|
||||||
|
|
||||||
|
if (wgi.gamepad_statics2 && SUCCEEDED(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_FromGameController(wgi.gamepad_statics2, gamecontroller, &gamepad)) && gamepad) {
|
||||||
|
__x_ABI_CWindows_CGaming_CInput_CIGamepad_Release(gamepad);
|
||||||
|
return SDL_JOYSTICK_TYPE_GAMECONTROLLER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wgi.arcade_stick_statics2 && SUCCEEDED(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_FromGameController(wgi.arcade_stick_statics2, gamecontroller, &arcade_stick)) && arcade_stick) {
|
||||||
|
__x_ABI_CWindows_CGaming_CInput_CIArcadeStick_Release(arcade_stick);
|
||||||
|
return SDL_JOYSTICK_TYPE_ARCADE_STICK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wgi.flight_stick_statics && SUCCEEDED(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_FromGameController(wgi.flight_stick_statics, gamecontroller, &flight_stick)) && flight_stick) {
|
||||||
|
__x_ABI_CWindows_CGaming_CInput_CIFlightStick_Release(flight_stick);
|
||||||
|
return SDL_JOYSTICK_TYPE_FLIGHT_STICK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wgi.racing_wheel_statics2 && SUCCEEDED(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_FromGameController(wgi.racing_wheel_statics2, gamecontroller, &racing_wheel)) && racing_wheel) {
|
||||||
|
__x_ABI_CWindows_CGaming_CInput_CIRacingWheel_Release(racing_wheel);
|
||||||
|
return SDL_JOYSTICK_TYPE_WHEEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SDL_JOYSTICK_TYPE_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct RawGameControllerDelegate
|
typedef struct RawGameControllerDelegate
|
||||||
{
|
{
|
||||||
__FIEventHandler_1_Windows__CGaming__CInput__CRawGameController iface;
|
__FIEventHandler_1_Windows__CGaming__CInput__CRawGameController iface;
|
||||||
@@ -226,7 +360,7 @@ static HRESULT STDMETHODCALLTYPE IEventHandler_CRawGameControllerVtbl_QueryInter
|
|||||||
*ppvObject = NULL;
|
*ppvObject = NULL;
|
||||||
if (WIN_IsEqualIID(riid, &IID_IUnknown) || WIN_IsEqualIID(riid, &IID_IAgileObject) || WIN_IsEqualIID(riid, &IID_IEventHandler_RawGameController)) {
|
if (WIN_IsEqualIID(riid, &IID_IUnknown) || WIN_IsEqualIID(riid, &IID_IAgileObject) || WIN_IsEqualIID(riid, &IID_IEventHandler_RawGameController)) {
|
||||||
*ppvObject = This;
|
*ppvObject = This;
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_AddRef(This);
|
__FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_AddRef(This);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
} else if (WIN_IsEqualIID(riid, &IID_IMarshal)) {
|
} else if (WIN_IsEqualIID(riid, &IID_IMarshal)) {
|
||||||
/* This seems complicated. Let's hope it doesn't happen. */
|
/* This seems complicated. Let's hope it doesn't happen. */
|
||||||
@@ -313,38 +447,6 @@ static HRESULT STDMETHODCALLTYPE IEventHandler_CRawGameControllerVtbl_InvokeAdde
|
|||||||
name = SDL_strdup("");
|
name = SDL_strdup("");
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = __x_ABI_CWindows_CGaming_CInput_CIRawGameController_QueryInterface(controller, &IID_IGameController, (void **)&gamecontroller);
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIArcadeStick *arcade_stick = NULL;
|
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIFlightStick *flight_stick = NULL;
|
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIGamepad *gamepad = NULL;
|
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIRacingWheel *racing_wheel = NULL;
|
|
||||||
boolean wireless;
|
|
||||||
|
|
||||||
if (wgi.gamepad_statics2 && SUCCEEDED(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_FromGameController(wgi.gamepad_statics2, gamecontroller, &gamepad)) && gamepad) {
|
|
||||||
type = SDL_JOYSTICK_TYPE_GAMECONTROLLER;
|
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIGamepad_Release(gamepad);
|
|
||||||
} else if (wgi.arcade_stick_statics2 && SUCCEEDED(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_FromGameController(wgi.arcade_stick_statics2, gamecontroller, &arcade_stick)) && arcade_stick) {
|
|
||||||
type = SDL_JOYSTICK_TYPE_ARCADE_STICK;
|
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIArcadeStick_Release(arcade_stick);
|
|
||||||
} else if (wgi.flight_stick_statics && SUCCEEDED(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_FromGameController(wgi.flight_stick_statics, gamecontroller, &flight_stick)) && flight_stick) {
|
|
||||||
type = SDL_JOYSTICK_TYPE_FLIGHT_STICK;
|
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIFlightStick_Release(flight_stick);
|
|
||||||
} else if (wgi.racing_wheel_statics2 && SUCCEEDED(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_FromGameController(wgi.racing_wheel_statics2, gamecontroller, &racing_wheel)) && racing_wheel) {
|
|
||||||
type = SDL_JOYSTICK_TYPE_WHEEL;
|
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIRacingWheel_Release(racing_wheel);
|
|
||||||
}
|
|
||||||
|
|
||||||
hr = __x_ABI_CWindows_CGaming_CInput_CIGameController_get_IsWireless(gamecontroller, &wireless);
|
|
||||||
if (SUCCEEDED(hr) && wireless) {
|
|
||||||
bus = SDL_HARDWARE_BUS_BLUETOOTH;
|
|
||||||
}
|
|
||||||
|
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIGameController_Release(gamecontroller);
|
|
||||||
}
|
|
||||||
|
|
||||||
guid = SDL_CreateJoystickGUID(bus, vendor, product, version, name, 'w', (Uint8)type);
|
|
||||||
|
|
||||||
#ifdef SDL_JOYSTICK_HIDAPI
|
#ifdef SDL_JOYSTICK_HIDAPI
|
||||||
if (!ignore_joystick && HIDAPI_IsDevicePresent(vendor, product, version, name)) {
|
if (!ignore_joystick && HIDAPI_IsDevicePresent(vendor, product, version, name)) {
|
||||||
ignore_joystick = SDL_TRUE;
|
ignore_joystick = SDL_TRUE;
|
||||||
@@ -365,13 +467,29 @@ static HRESULT STDMETHODCALLTYPE IEventHandler_CRawGameControllerVtbl_InvokeAdde
|
|||||||
ignore_joystick = SDL_TRUE;
|
ignore_joystick = SDL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ignore_joystick && SDL_ShouldIgnoreJoystick(name, guid)) {
|
if (!ignore_joystick) {
|
||||||
ignore_joystick = SDL_TRUE;
|
hr = __x_ABI_CWindows_CGaming_CInput_CIRawGameController_QueryInterface(controller, &IID_IGameController, (void **)&gamecontroller);
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
boolean wireless;
|
||||||
|
|
||||||
|
type = GetGameControllerType(gamecontroller);
|
||||||
|
|
||||||
|
hr = __x_ABI_CWindows_CGaming_CInput_CIGameController_get_IsWireless(gamecontroller, &wireless);
|
||||||
|
if (SUCCEEDED(hr) && wireless) {
|
||||||
|
bus = SDL_HARDWARE_BUS_BLUETOOTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
__x_ABI_CWindows_CGaming_CInput_CIGameController_Release(gamecontroller);
|
||||||
|
}
|
||||||
|
|
||||||
|
guid = SDL_CreateJoystickGUID(bus, vendor, product, version, name, 'w', (Uint8)type);
|
||||||
|
|
||||||
|
if (SDL_ShouldIgnoreJoystick(name, guid)) {
|
||||||
|
ignore_joystick = SDL_TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ignore_joystick) {
|
if (!ignore_joystick) {
|
||||||
SDL_free(name);
|
|
||||||
} else {
|
|
||||||
/* New device, add it */
|
/* New device, add it */
|
||||||
WindowsGamingInputControllerState *controllers = SDL_realloc(wgi.controllers, sizeof(wgi.controllers[0]) * (wgi.controller_count + 1));
|
WindowsGamingInputControllerState *controllers = SDL_realloc(wgi.controllers, sizeof(wgi.controllers[0]) * (wgi.controller_count + 1));
|
||||||
if (controllers) {
|
if (controllers) {
|
||||||
@@ -398,6 +516,8 @@ static HRESULT STDMETHODCALLTYPE IEventHandler_CRawGameControllerVtbl_InvokeAdde
|
|||||||
} else {
|
} else {
|
||||||
SDL_free(name);
|
SDL_free(name);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
SDL_free(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIRawGameController_Release(controller);
|
__x_ABI_CWindows_CGaming_CInput_CIRawGameController_Release(controller);
|
||||||
@@ -476,13 +596,12 @@ static RawGameControllerDelegate controller_removed = {
|
|||||||
|
|
||||||
static int WGI_JoystickInit(void)
|
static int WGI_JoystickInit(void)
|
||||||
{
|
{
|
||||||
typedef HRESULT(WINAPI * WindowsCreateStringReference_t)(PCWSTR sourceString, UINT32 length, HSTRING_HEADER * hstringHeader, HSTRING * string);
|
|
||||||
typedef HRESULT(WINAPI * RoGetActivationFactory_t)(HSTRING activatableClassId, REFIID iid, void **factory);
|
|
||||||
|
|
||||||
WindowsCreateStringReference_t WindowsCreateStringReferenceFunc = NULL;
|
|
||||||
RoGetActivationFactory_t RoGetActivationFactoryFunc = NULL;
|
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
|
if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_WGI, SDL_TRUE)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (FAILED(WIN_RoInitialize())) {
|
if (FAILED(WIN_RoInitialize())) {
|
||||||
return SDL_SetError("RoInitialize() failed");
|
return SDL_SetError("RoInitialize() failed");
|
||||||
}
|
}
|
||||||
@@ -511,71 +630,7 @@ static int WGI_JoystickInit(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __WINRT__
|
WGI_LoadRawGameControllerStatics();
|
||||||
WindowsCreateStringReferenceFunc = WindowsCreateStringReference;
|
|
||||||
RoGetActivationFactoryFunc = RoGetActivationFactory;
|
|
||||||
#else
|
|
||||||
{
|
|
||||||
WindowsCreateStringReferenceFunc = (WindowsCreateStringReference_t)WIN_LoadComBaseFunction("WindowsCreateStringReference");
|
|
||||||
RoGetActivationFactoryFunc = (RoGetActivationFactory_t)WIN_LoadComBaseFunction("RoGetActivationFactory");
|
|
||||||
}
|
|
||||||
#endif /* __WINRT__ */
|
|
||||||
if (WindowsCreateStringReferenceFunc && RoGetActivationFactoryFunc) {
|
|
||||||
PCWSTR pNamespace;
|
|
||||||
HSTRING_HEADER hNamespaceStringHeader;
|
|
||||||
HSTRING hNamespaceString;
|
|
||||||
|
|
||||||
pNamespace = L"Windows.Gaming.Input.RawGameController";
|
|
||||||
hr = WindowsCreateStringReferenceFunc(pNamespace, (UINT32)SDL_wcslen(pNamespace), &hNamespaceStringHeader, &hNamespaceString);
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
hr = RoGetActivationFactoryFunc(hNamespaceString, &IID_IRawGameControllerStatics, (void **)&wgi.statics);
|
|
||||||
if (!SUCCEEDED(hr)) {
|
|
||||||
SDL_SetError("Couldn't find IRawGameControllerStatics: 0x%lx", hr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pNamespace = L"Windows.Gaming.Input.ArcadeStick";
|
|
||||||
hr = WindowsCreateStringReferenceFunc(pNamespace, (UINT32)SDL_wcslen(pNamespace), &hNamespaceStringHeader, &hNamespaceString);
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
hr = RoGetActivationFactoryFunc(hNamespaceString, &IID_IArcadeStickStatics, (void **)&wgi.arcade_stick_statics);
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_QueryInterface(wgi.arcade_stick_statics, &IID_IArcadeStickStatics2, (void **)&wgi.arcade_stick_statics2);
|
|
||||||
} else {
|
|
||||||
SDL_SetError("Couldn't find IID_IArcadeStickStatics: 0x%lx", hr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pNamespace = L"Windows.Gaming.Input.FlightStick";
|
|
||||||
hr = WindowsCreateStringReferenceFunc(pNamespace, (UINT32)SDL_wcslen(pNamespace), &hNamespaceStringHeader, &hNamespaceString);
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
hr = RoGetActivationFactoryFunc(hNamespaceString, &IID_IFlightStickStatics, (void **)&wgi.flight_stick_statics);
|
|
||||||
if (!SUCCEEDED(hr)) {
|
|
||||||
SDL_SetError("Couldn't find IID_IFlightStickStatics: 0x%lx", hr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pNamespace = L"Windows.Gaming.Input.Gamepad";
|
|
||||||
hr = WindowsCreateStringReferenceFunc(pNamespace, (UINT32)SDL_wcslen(pNamespace), &hNamespaceStringHeader, &hNamespaceString);
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
hr = RoGetActivationFactoryFunc(hNamespaceString, &IID_IGamepadStatics, (void **)&wgi.gamepad_statics);
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_QueryInterface(wgi.gamepad_statics, &IID_IGamepadStatics2, (void **)&wgi.gamepad_statics2);
|
|
||||||
} else {
|
|
||||||
SDL_SetError("Couldn't find IGamepadStatics: 0x%lx", hr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pNamespace = L"Windows.Gaming.Input.RacingWheel";
|
|
||||||
hr = WindowsCreateStringReferenceFunc(pNamespace, (UINT32)SDL_wcslen(pNamespace), &hNamespaceStringHeader, &hNamespaceString);
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
hr = RoGetActivationFactoryFunc(hNamespaceString, &IID_IRacingWheelStatics, (void **)&wgi.racing_wheel_statics);
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_QueryInterface(wgi.racing_wheel_statics, &IID_IRacingWheelStatics2, (void **)&wgi.racing_wheel_statics2);
|
|
||||||
} else {
|
|
||||||
SDL_SetError("Couldn't find IRacingWheelStatics: 0x%lx", hr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wgi.statics) {
|
if (wgi.statics) {
|
||||||
__FIVectorView_1_Windows__CGaming__CInput__CRawGameController *controllers;
|
__FIVectorView_1_Windows__CGaming__CInput__CRawGameController *controllers;
|
||||||
|
|||||||
@@ -134,7 +134,8 @@ static void GuessXInputDevice(Uint8 userid, Uint16 *pVID, Uint16 *pPID, Uint16 *
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetRawInputDeviceList(devices, &device_count, sizeof(RAWINPUTDEVICELIST)) == -1) {
|
device_count = GetRawInputDeviceList(devices, &device_count, sizeof(RAWINPUTDEVICELIST));
|
||||||
|
if (device_count == (UINT)-1) {
|
||||||
SDL_free(devices);
|
SDL_free(devices);
|
||||||
return; /* oh well. */
|
return; /* oh well. */
|
||||||
}
|
}
|
||||||
@@ -235,6 +236,20 @@ static void AddXInputDevice(Uint8 userid, BYTE SubType, JoyStick_DeviceData **pC
|
|||||||
JoyStick_DeviceData *pPrevJoystick = NULL;
|
JoyStick_DeviceData *pPrevJoystick = NULL;
|
||||||
JoyStick_DeviceData *pNewJoystick = *pContext;
|
JoyStick_DeviceData *pNewJoystick = *pContext;
|
||||||
|
|
||||||
|
#ifdef SDL_JOYSTICK_RAWINPUT
|
||||||
|
if (RAWINPUT_IsEnabled()) {
|
||||||
|
/* The raw input driver handles more than 4 controllers, so prefer that when available */
|
||||||
|
/* We do this check here rather than at the top of SDL_XINPUT_JoystickDetect() because
|
||||||
|
we need to check XInput state before RAWINPUT gets a hold of the device, otherwise
|
||||||
|
when a controller is connected via the wireless adapter, it will shut down at the
|
||||||
|
first subsequent XInput call. This seems like a driver stack bug?
|
||||||
|
|
||||||
|
Reference: https://github.com/libsdl-org/SDL/issues/3468
|
||||||
|
*/
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (SDL_XInputUseOldJoystickMapping() && SubType != XINPUT_DEVSUBTYPE_GAMEPAD) {
|
if (SDL_XInputUseOldJoystickMapping() && SubType != XINPUT_DEVSUBTYPE_GAMEPAD) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -322,13 +337,6 @@ void SDL_XINPUT_JoystickDetect(JoyStick_DeviceData **pContext)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SDL_JOYSTICK_RAWINPUT
|
|
||||||
if (RAWINPUT_IsEnabled()) {
|
|
||||||
/* The raw input driver handles more than 4 controllers, so prefer that when available */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* iterate in reverse, so these are in the final list in ascending numeric order. */
|
/* iterate in reverse, so these are in the final list in ascending numeric order. */
|
||||||
for (iuserid = XUSER_MAX_COUNT - 1; iuserid >= 0; iuserid--) {
|
for (iuserid = XUSER_MAX_COUNT - 1; iuserid >= 0; iuserid--) {
|
||||||
const Uint8 userid = (Uint8)iuserid;
|
const Uint8 userid = (Uint8)iuserid;
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ int console_wmain(int argc, wchar_t *wargv[], wchar_t *wenvp)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* This is where execution begins [windowed apps] */
|
/* This is where execution begins [windowed apps] */
|
||||||
int WINAPI
|
int WINAPI MINGW32_FORCEALIGN
|
||||||
WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) /* NOLINT(readability-inconsistent-declaration-parameter-name) */
|
WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) /* NOLINT(readability-inconsistent-declaration-parameter-name) */
|
||||||
{
|
{
|
||||||
return main_getcmdline();
|
return main_getcmdline();
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
|||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 2,28,0,0
|
FILEVERSION 2,28,5,0
|
||||||
PRODUCTVERSION 2,28,0,0
|
PRODUCTVERSION 2,28,5,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
FILEFLAGS 0x0L
|
FILEFLAGS 0x0L
|
||||||
FILEOS 0x40004L
|
FILEOS 0x40004L
|
||||||
@@ -23,12 +23,12 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "\0"
|
VALUE "CompanyName", "\0"
|
||||||
VALUE "FileDescription", "SDL\0"
|
VALUE "FileDescription", "SDL\0"
|
||||||
VALUE "FileVersion", "2, 28, 0, 0\0"
|
VALUE "FileVersion", "2, 28, 5, 0\0"
|
||||||
VALUE "InternalName", "SDL\0"
|
VALUE "InternalName", "SDL\0"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2023 Sam Lantinga\0"
|
VALUE "LegalCopyright", "Copyright (C) 2023 Sam Lantinga\0"
|
||||||
VALUE "OriginalFilename", "SDL2.dll\0"
|
VALUE "OriginalFilename", "SDL2.dll\0"
|
||||||
VALUE "ProductName", "Simple DirectMedia Layer\0"
|
VALUE "ProductName", "Simple DirectMedia Layer\0"
|
||||||
VALUE "ProductVersion", "2, 28, 0, 0\0"
|
VALUE "ProductVersion", "2, 28, 5, 0\0"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|||||||
@@ -23,13 +23,11 @@
|
|||||||
|
|
||||||
#include <emscripten/emscripten.h>
|
#include <emscripten/emscripten.h>
|
||||||
|
|
||||||
|
EM_JS_DEPS(sdlsysurl, "$UTF8ToString");
|
||||||
|
|
||||||
int SDL_SYS_OpenURL(const char *url)
|
int SDL_SYS_OpenURL(const char *url)
|
||||||
{
|
{
|
||||||
EM_ASM({
|
EM_ASM(window.open(UTF8ToString($0), "_blank"), url);
|
||||||
window.open(UTF8ToString($0), "_blank");
|
|
||||||
},
|
|
||||||
url);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,18 @@ int SDL_SYS_OpenURL(const char *url)
|
|||||||
{
|
{
|
||||||
const pid_t pid1 = fork();
|
const pid_t pid1 = fork();
|
||||||
if (pid1 == 0) { /* child process */
|
if (pid1 == 0) { /* child process */
|
||||||
|
#ifdef USE_POSIX_SPAWN
|
||||||
|
pid_t pid2;
|
||||||
|
const char *args[] = { "xdg-open", url, NULL };
|
||||||
|
/* Clear LD_PRELOAD so Chrome opens correctly when this application is launched by Steam */
|
||||||
|
unsetenv("LD_PRELOAD");
|
||||||
|
if (posix_spawnp(&pid2, args[0], NULL, NULL, (char **)args, environ) == 0) {
|
||||||
|
/* Child process doesn't wait for possibly-blocking grandchild. */
|
||||||
|
_exit(EXIT_SUCCESS);
|
||||||
|
} else {
|
||||||
|
_exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
#else
|
||||||
pid_t pid2;
|
pid_t pid2;
|
||||||
/* Clear LD_PRELOAD so Chrome opens correctly when this application is launched by Steam */
|
/* Clear LD_PRELOAD so Chrome opens correctly when this application is launched by Steam */
|
||||||
unsetenv("LD_PRELOAD");
|
unsetenv("LD_PRELOAD");
|
||||||
@@ -46,6 +58,7 @@ int SDL_SYS_OpenURL(const char *url)
|
|||||||
/* Child process doesn't wait for possibly-blocking grandchild. */
|
/* Child process doesn't wait for possibly-blocking grandchild. */
|
||||||
_exit(EXIT_SUCCESS);
|
_exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
#endif /* USE_POSIX_SPAWN */
|
||||||
} else if (pid1 < 0) {
|
} else if (pid1 < 0) {
|
||||||
return SDL_SetError("fork() failed: %s", strerror(errno));
|
return SDL_SetError("fork() failed: %s", strerror(errno));
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -2481,7 +2481,7 @@ int SDL_RenderSetClipRect(SDL_Renderer *renderer, const SDL_Rect *rect)
|
|||||||
int retval;
|
int retval;
|
||||||
CHECK_RENDERER_MAGIC(renderer, -1)
|
CHECK_RENDERER_MAGIC(renderer, -1)
|
||||||
|
|
||||||
if (rect && rect->w > 0 && rect->h > 0) {
|
if (rect && rect->w >= 0 && rect->h >= 0) {
|
||||||
renderer->clipping_enabled = SDL_TRUE;
|
renderer->clipping_enabled = SDL_TRUE;
|
||||||
renderer->clip_rect.x = (double)rect->x * renderer->scale.x;
|
renderer->clip_rect.x = (double)rect->x * renderer->scale.x;
|
||||||
renderer->clip_rect.y = (double)rect->y * renderer->scale.y;
|
renderer->clip_rect.y = (double)rect->y * renderer->scale.y;
|
||||||
|
|||||||
@@ -2143,7 +2143,7 @@ static int D3D11_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect,
|
|||||||
D3D11_BOX srcBox;
|
D3D11_BOX srcBox;
|
||||||
D3D11_MAPPED_SUBRESOURCE textureMemory;
|
D3D11_MAPPED_SUBRESOURCE textureMemory;
|
||||||
|
|
||||||
ID3D11DeviceContext_OMGetRenderTargets(data->d3dContext, 1, &renderTargetView, NULL);
|
renderTargetView = D3D11_GetCurrentRenderTargetView(renderer);
|
||||||
if (renderTargetView == NULL) {
|
if (renderTargetView == NULL) {
|
||||||
SDL_SetError("%s, ID3D11DeviceContext::OMGetRenderTargets failed", __FUNCTION__);
|
SDL_SetError("%s, ID3D11DeviceContext::OMGetRenderTargets failed", __FUNCTION__);
|
||||||
goto done;
|
goto done;
|
||||||
|
|||||||
@@ -2609,6 +2609,7 @@ static int D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
|
|||||||
case SDL_RENDERCMD_SETCLIPRECT:
|
case SDL_RENDERCMD_SETCLIPRECT:
|
||||||
{
|
{
|
||||||
const SDL_Rect *rect = &cmd->data.cliprect.rect;
|
const SDL_Rect *rect = &cmd->data.cliprect.rect;
|
||||||
|
SDL_Rect viewport_cliprect;
|
||||||
if (rendererData->currentCliprectEnabled != cmd->data.cliprect.enabled) {
|
if (rendererData->currentCliprectEnabled != cmd->data.cliprect.enabled) {
|
||||||
rendererData->currentCliprectEnabled = cmd->data.cliprect.enabled;
|
rendererData->currentCliprectEnabled = cmd->data.cliprect.enabled;
|
||||||
rendererData->cliprectDirty = SDL_TRUE;
|
rendererData->cliprectDirty = SDL_TRUE;
|
||||||
@@ -2616,7 +2617,11 @@ static int D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
|
|||||||
if (!rendererData->currentCliprectEnabled) {
|
if (!rendererData->currentCliprectEnabled) {
|
||||||
/* If the clip rect is disabled, then the scissor rect should be the whole viewport,
|
/* If the clip rect is disabled, then the scissor rect should be the whole viewport,
|
||||||
since direct3d12 doesn't allow disabling the scissor rectangle */
|
since direct3d12 doesn't allow disabling the scissor rectangle */
|
||||||
rect = &rendererData->currentViewport;
|
viewport_cliprect.x = 0;
|
||||||
|
viewport_cliprect.y = 0;
|
||||||
|
viewport_cliprect.w = rendererData->currentViewport.w;
|
||||||
|
viewport_cliprect.h = rendererData->currentViewport.h;
|
||||||
|
rect = &viewport_cliprect;
|
||||||
}
|
}
|
||||||
if (SDL_memcmp(&rendererData->currentCliprect, rect, sizeof(*rect)) != 0) {
|
if (SDL_memcmp(&rendererData->currentCliprect, rect, sizeof(*rect)) != 0) {
|
||||||
SDL_copyp(&rendererData->currentCliprect, rect);
|
SDL_copyp(&rendererData->currentCliprect, rect);
|
||||||
|
|||||||
@@ -1654,8 +1654,22 @@ static SDL_Renderer *METAL_CreateRenderer(SDL_Window * window, Uint32 flags)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// !!! FIXME: MTLCopyAllDevices() can find other GPUs on macOS...
|
#ifdef __MACOSX__
|
||||||
mtldevice = MTLCreateSystemDefaultDevice();
|
if (SDL_GetHintBoolean(SDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE, SDL_TRUE)) {
|
||||||
|
NSArray<id<MTLDevice>> *devices = MTLCopyAllDevices();
|
||||||
|
|
||||||
|
for (id<MTLDevice> device in devices) {
|
||||||
|
if (device.isLowPower) {
|
||||||
|
mtldevice = device;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (mtldevice == nil) {
|
||||||
|
mtldevice = MTLCreateSystemDefaultDevice();
|
||||||
|
}
|
||||||
|
|
||||||
if (mtldevice == nil) {
|
if (mtldevice == nil) {
|
||||||
SDL_free(renderer);
|
SDL_free(renderer);
|
||||||
|
|||||||
@@ -980,8 +980,12 @@ static void SW_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
|||||||
|
|
||||||
static void SW_DestroyRenderer(SDL_Renderer *renderer)
|
static void SW_DestroyRenderer(SDL_Renderer *renderer)
|
||||||
{
|
{
|
||||||
|
SDL_Window *window = renderer->window;
|
||||||
SW_RenderData *data = (SW_RenderData *)renderer->driverdata;
|
SW_RenderData *data = (SW_RenderData *)renderer->driverdata;
|
||||||
|
|
||||||
|
if (window) {
|
||||||
|
SDL_DestroyWindowSurface(window);
|
||||||
|
}
|
||||||
SDL_free(data);
|
SDL_free(data);
|
||||||
SDL_free(renderer);
|
SDL_free(renderer);
|
||||||
}
|
}
|
||||||
@@ -1035,8 +1039,6 @@ SDL_Renderer *SW_CreateRendererForSurface(SDL_Surface *surface)
|
|||||||
renderer->info = SW_RenderDriver.info;
|
renderer->info = SW_RenderDriver.info;
|
||||||
renderer->driverdata = data;
|
renderer->driverdata = data;
|
||||||
|
|
||||||
SW_ActivateRenderer(renderer);
|
|
||||||
|
|
||||||
return renderer;
|
return renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -339,12 +339,7 @@ int SDL_SW_FillTriangle(SDL_Surface *dst, SDL_Point *d0, SDL_Point *d1, SDL_Poin
|
|||||||
if (is_uniform) {
|
if (is_uniform) {
|
||||||
Uint32 color;
|
Uint32 color;
|
||||||
if (tmp) {
|
if (tmp) {
|
||||||
if (dst->format->Amask) {
|
color = SDL_MapRGBA(tmp->format, c0.r, c0.g, c0.b, c0.a);
|
||||||
color = SDL_MapRGBA(tmp->format, c0.r, c0.g, c0.b, c0.a);
|
|
||||||
} else {
|
|
||||||
// color = SDL_MapRGB(tmp->format, c0.r, c0.g, c0.b);
|
|
||||||
color = SDL_MapRGBA(tmp->format, c0.r, c0.g, c0.b, c0.a);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
color = SDL_MapRGBA(dst->format, c0.r, c0.g, c0.b, c0.a);
|
color = SDL_MapRGBA(dst->format, c0.r, c0.g, c0.b, c0.a);
|
||||||
}
|
}
|
||||||
@@ -789,15 +784,20 @@ static void SDL_BlitTriangle_Slow(SDL_BlitInfo *info,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (FORMAT_HAS_ALPHA(dstfmt_val)) {
|
if ((flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL))) {
|
||||||
DISEMBLE_RGBA(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, dstB, dstA);
|
if (FORMAT_HAS_ALPHA(dstfmt_val)) {
|
||||||
} else if (FORMAT_HAS_NO_ALPHA(dstfmt_val)) {
|
DISEMBLE_RGBA(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, dstB, dstA);
|
||||||
DISEMBLE_RGB(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, dstB);
|
} else if (FORMAT_HAS_NO_ALPHA(dstfmt_val)) {
|
||||||
dstA = 0xFF;
|
DISEMBLE_RGB(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, dstB);
|
||||||
|
dstA = 0xFF;
|
||||||
|
} else {
|
||||||
|
/* SDL_PIXELFORMAT_ARGB2101010 */
|
||||||
|
dstpixel = *((Uint32 *) (dst));
|
||||||
|
RGBA_FROM_ARGB2101010(dstpixel, dstR, dstG, dstB, dstA);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* SDL_PIXELFORMAT_ARGB2101010 */
|
/* don't care */
|
||||||
dstpixel = *((Uint32 *)(dst));
|
dstR = dstG = dstB = dstA = 0;
|
||||||
RGBA_FROM_ARGB2101010(dstpixel, dstR, dstG, dstB, dstA);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_uniform) {
|
if (!is_uniform) {
|
||||||
|
|||||||
+6
-10
@@ -795,17 +795,13 @@ char *SDL_iconv_string(const char *tocode, const char *fromcode, const char *inb
|
|||||||
size_t outbytesleft;
|
size_t outbytesleft;
|
||||||
size_t retCode = 0;
|
size_t retCode = 0;
|
||||||
|
|
||||||
cd = SDL_iconv_open(tocode, fromcode);
|
if (tocode == NULL || !*tocode) {
|
||||||
if (cd == (SDL_iconv_t)-1) {
|
tocode = "UTF-8";
|
||||||
/* See if we can recover here (fixes iconv on Solaris 11) */
|
|
||||||
if (tocode == NULL || !*tocode) {
|
|
||||||
tocode = "UTF-8";
|
|
||||||
}
|
|
||||||
if (fromcode == NULL || !*fromcode) {
|
|
||||||
fromcode = "UTF-8";
|
|
||||||
}
|
|
||||||
cd = SDL_iconv_open(tocode, fromcode);
|
|
||||||
}
|
}
|
||||||
|
if (fromcode == NULL || !*fromcode) {
|
||||||
|
fromcode = "UTF-8";
|
||||||
|
}
|
||||||
|
cd = SDL_iconv_open(tocode, fromcode);
|
||||||
if (cd == (SDL_iconv_t)-1) {
|
if (cd == (SDL_iconv_t)-1) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
+75
-3
@@ -1114,6 +1114,39 @@ int SDL_vsscanf(const char *text, const char *fmt, va_list ap)
|
|||||||
return vsscanf(text, fmt, ap);
|
return vsscanf(text, fmt, ap);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
static SDL_bool CharacterMatchesSet(char c, const char *set, size_t set_len)
|
||||||
|
{
|
||||||
|
SDL_bool invert = SDL_FALSE;
|
||||||
|
SDL_bool result = SDL_FALSE;
|
||||||
|
|
||||||
|
if (*set == '^') {
|
||||||
|
invert = SDL_TRUE;
|
||||||
|
++set;
|
||||||
|
--set_len;
|
||||||
|
}
|
||||||
|
while (set_len > 0 && !result) {
|
||||||
|
if (set_len >= 3 && set[1] == '-') {
|
||||||
|
char low_char = SDL_min(set[0], set[2]);
|
||||||
|
char high_char = SDL_max(set[0], set[2]);
|
||||||
|
if (c >= low_char && c <= high_char) {
|
||||||
|
result = SDL_TRUE;
|
||||||
|
}
|
||||||
|
set += 3;
|
||||||
|
set_len -= 3;
|
||||||
|
} else {
|
||||||
|
if (c == *set) {
|
||||||
|
result = SDL_TRUE;
|
||||||
|
}
|
||||||
|
++set;
|
||||||
|
--set_len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (invert) {
|
||||||
|
result = result ? SDL_FALSE : SDL_TRUE;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/* NOLINTNEXTLINE(readability-non-const-parameter) */
|
/* NOLINTNEXTLINE(readability-non-const-parameter) */
|
||||||
int SDL_vsscanf(const char *text, const char *fmt, va_list ap)
|
int SDL_vsscanf(const char *text, const char *fmt, va_list ap)
|
||||||
{
|
{
|
||||||
@@ -1190,7 +1223,9 @@ int SDL_vsscanf(const char *text, const char *fmt, va_list ap)
|
|||||||
suppress = SDL_TRUE;
|
suppress = SDL_TRUE;
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
if (inttype > DO_SHORT) {
|
if (inttype == DO_INT) {
|
||||||
|
inttype = DO_SHORT;
|
||||||
|
} else if (inttype > DO_SHORT) {
|
||||||
++inttype;
|
++inttype;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1385,6 +1420,44 @@ int SDL_vsscanf(const char *text, const char *fmt, va_list ap)
|
|||||||
}
|
}
|
||||||
done = SDL_TRUE;
|
done = SDL_TRUE;
|
||||||
break;
|
break;
|
||||||
|
case '[':
|
||||||
|
{
|
||||||
|
const char *set = fmt + 1;
|
||||||
|
while (*fmt && *fmt != ']') {
|
||||||
|
++fmt;
|
||||||
|
}
|
||||||
|
if (*fmt) {
|
||||||
|
size_t set_len = (fmt - set);
|
||||||
|
if (suppress) {
|
||||||
|
while (CharacterMatchesSet(*text, set, set_len)) {
|
||||||
|
++text;
|
||||||
|
if (count) {
|
||||||
|
if (--count == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SDL_bool had_match = SDL_FALSE;
|
||||||
|
char *valuep = va_arg(ap, char *);
|
||||||
|
while (CharacterMatchesSet(*text, set, set_len)) {
|
||||||
|
had_match = SDL_TRUE;
|
||||||
|
*valuep++ = *text++;
|
||||||
|
if (count) {
|
||||||
|
if (--count == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*valuep = '\0';
|
||||||
|
if (had_match) {
|
||||||
|
++retval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
done = SDL_TRUE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
done = SDL_TRUE;
|
done = SDL_TRUE;
|
||||||
break;
|
break;
|
||||||
@@ -1916,6 +1989,7 @@ int SDL_vasprintf(char **strp, const char *fmt, va_list ap)
|
|||||||
|
|
||||||
/* Check error code */
|
/* Check error code */
|
||||||
if (retval < 0) {
|
if (retval < 0) {
|
||||||
|
SDL_free(p);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1937,5 +2011,3 @@ int SDL_vasprintf(char **strp, const char *fmt, va_list ap)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
||||||
@@ -36,6 +36,25 @@
|
|||||||
/* Counter for _CompareSurface calls; used for filename creation when comparisons fail */
|
/* Counter for _CompareSurface calls; used for filename creation when comparisons fail */
|
||||||
static int _CompareSurfaceCount = 0;
|
static int _CompareSurfaceCount = 0;
|
||||||
|
|
||||||
|
static Uint32
|
||||||
|
GetPixel(Uint8 *p, size_t bytes_per_pixel)
|
||||||
|
{
|
||||||
|
Uint32 ret = 0;
|
||||||
|
|
||||||
|
SDL_assert(bytes_per_pixel <= sizeof(ret));
|
||||||
|
|
||||||
|
/* Fill the appropriate number of least-significant bytes of ret,
|
||||||
|
* leaving the most-significant bytes set to zero, so that ret can
|
||||||
|
* be decoded with SDL_GetRGBA afterwards. */
|
||||||
|
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
|
||||||
|
SDL_memcpy(((Uint8 *) &ret) + (sizeof(ret) - bytes_per_pixel), p, bytes_per_pixel);
|
||||||
|
#else
|
||||||
|
SDL_memcpy(&ret, p, bytes_per_pixel);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Compare surfaces */
|
/* Compare surfaces */
|
||||||
int SDLTest_CompareSurfaces(SDL_Surface *surface, SDL_Surface *referenceSurface, int allowable_error)
|
int SDLTest_CompareSurfaces(SDL_Surface *surface, SDL_Surface *referenceSurface, int allowable_error)
|
||||||
{
|
{
|
||||||
@@ -74,11 +93,14 @@ int SDLTest_CompareSurfaces(SDL_Surface *surface, SDL_Surface *referenceSurface,
|
|||||||
/* Compare image - should be same format. */
|
/* Compare image - should be same format. */
|
||||||
for (j = 0; j < surface->h; j++) {
|
for (j = 0; j < surface->h; j++) {
|
||||||
for (i = 0; i < surface->w; i++) {
|
for (i = 0; i < surface->w; i++) {
|
||||||
|
Uint32 pixel;
|
||||||
p = (Uint8 *)surface->pixels + j * surface->pitch + i * bpp;
|
p = (Uint8 *)surface->pixels + j * surface->pitch + i * bpp;
|
||||||
p_reference = (Uint8 *)referenceSurface->pixels + j * referenceSurface->pitch + i * bpp_reference;
|
p_reference = (Uint8 *)referenceSurface->pixels + j * referenceSurface->pitch + i * bpp_reference;
|
||||||
|
|
||||||
SDL_GetRGBA(*(Uint32 *)p, surface->format, &R, &G, &B, &A);
|
pixel = GetPixel(p, bpp);
|
||||||
SDL_GetRGBA(*(Uint32 *)p_reference, referenceSurface->format, &Rd, &Gd, &Bd, &Ad);
|
SDL_GetRGBA(pixel, surface->format, &R, &G, &B, &A);
|
||||||
|
pixel = GetPixel(p_reference, bpp_reference);
|
||||||
|
SDL_GetRGBA(pixel, referenceSurface->format, &Rd, &Gd, &Bd, &Ad);
|
||||||
|
|
||||||
dist = 0;
|
dist = 0;
|
||||||
dist += (R - Rd) * (R - Rd);
|
dist += (R - Rd) * (R - Rd);
|
||||||
|
|||||||
@@ -471,7 +471,9 @@ char *SDLTest_RandomAsciiStringWithMaximumLength(int maxLength)
|
|||||||
}
|
}
|
||||||
|
|
||||||
size = (SDLTest_RandomUint32() % (maxLength + 1));
|
size = (SDLTest_RandomUint32() % (maxLength + 1));
|
||||||
|
if (size == 0) {
|
||||||
|
size = 1;
|
||||||
|
}
|
||||||
return SDLTest_RandomAsciiStringOfSize(size);
|
return SDLTest_RandomAsciiStringOfSize(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <timer_alarm.h>
|
#include <kernel_util.h>
|
||||||
|
|
||||||
#include "SDL_error.h"
|
#include "SDL_error.h"
|
||||||
#include "SDL_thread.h"
|
#include "SDL_thread.h"
|
||||||
@@ -38,11 +38,6 @@ struct SDL_semaphore
|
|||||||
s32 semid;
|
s32 semid;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void usercb(struct timer_alarm_t *alarm, void *arg)
|
|
||||||
{
|
|
||||||
iReleaseWaitThread((int)arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create a semaphore */
|
/* Create a semaphore */
|
||||||
SDL_sem *SDL_CreateSemaphore(Uint32 initial_value)
|
SDL_sem *SDL_CreateSemaphore(Uint32 initial_value)
|
||||||
{
|
{
|
||||||
@@ -85,8 +80,8 @@ void SDL_DestroySemaphore(SDL_sem *sem)
|
|||||||
int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout)
|
int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct timer_alarm_t alarm;
|
u64 timeout_usec;
|
||||||
InitializeTimerAlarm(&alarm);
|
u64 *timeout_ptr;
|
||||||
|
|
||||||
if (sem == NULL) {
|
if (sem == NULL) {
|
||||||
return SDL_InvalidParamError("sem");
|
return SDL_InvalidParamError("sem");
|
||||||
@@ -99,12 +94,14 @@ int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
timeout_ptr = NULL;
|
||||||
|
|
||||||
if (timeout != SDL_MUTEX_MAXWAIT) {
|
if (timeout != SDL_MUTEX_MAXWAIT) {
|
||||||
SetTimerAlarm(&alarm, MSec2TimerBusClock(timeout), &usercb, (void *)GetThreadId());
|
timeout_usec = timeout * 1000;
|
||||||
|
timeout_ptr = &timeout_usec;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = WaitSema(sem->semid);
|
ret = WaitSemaEx(sem->semid, 1, timeout_ptr);
|
||||||
StopTimerAlarm(&alarm);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return SDL_MUTEX_TIMEDOUT;
|
return SDL_MUTEX_TIMEDOUT;
|
||||||
|
|||||||
@@ -71,10 +71,8 @@ static SDL_mutex *SDL_CreateMutex_srw(void)
|
|||||||
|
|
||||||
static void SDL_DestroyMutex_srw(SDL_mutex *mutex)
|
static void SDL_DestroyMutex_srw(SDL_mutex *mutex)
|
||||||
{
|
{
|
||||||
if (mutex != NULL) {
|
/* There are no kernel allocated resources */
|
||||||
/* There are no kernel allocated resources */
|
SDL_free(mutex);
|
||||||
SDL_free(mutex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int SDL_LockMutex_srw(SDL_mutex *_mutex) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */
|
static int SDL_LockMutex_srw(SDL_mutex *_mutex) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */
|
||||||
@@ -82,10 +80,6 @@ static int SDL_LockMutex_srw(SDL_mutex *_mutex) SDL_NO_THREAD_SAFETY_ANALYSIS /*
|
|||||||
SDL_mutex_srw *mutex = (SDL_mutex_srw *)_mutex;
|
SDL_mutex_srw *mutex = (SDL_mutex_srw *)_mutex;
|
||||||
DWORD this_thread;
|
DWORD this_thread;
|
||||||
|
|
||||||
if (mutex == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this_thread = GetCurrentThreadId();
|
this_thread = GetCurrentThreadId();
|
||||||
if (mutex->owner == this_thread) {
|
if (mutex->owner == this_thread) {
|
||||||
++mutex->count;
|
++mutex->count;
|
||||||
@@ -108,10 +102,6 @@ static int SDL_TryLockMutex_srw(SDL_mutex *_mutex)
|
|||||||
DWORD this_thread;
|
DWORD this_thread;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
if (mutex == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this_thread = GetCurrentThreadId();
|
this_thread = GetCurrentThreadId();
|
||||||
if (mutex->owner == this_thread) {
|
if (mutex->owner == this_thread) {
|
||||||
++mutex->count;
|
++mutex->count;
|
||||||
@@ -131,10 +121,6 @@ static int SDL_UnlockMutex_srw(SDL_mutex *_mutex) SDL_NO_THREAD_SAFETY_ANALYSIS
|
|||||||
{
|
{
|
||||||
SDL_mutex_srw *mutex = (SDL_mutex_srw *)_mutex;
|
SDL_mutex_srw *mutex = (SDL_mutex_srw *)_mutex;
|
||||||
|
|
||||||
if (mutex == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mutex->owner == GetCurrentThreadId()) {
|
if (mutex->owner == GetCurrentThreadId()) {
|
||||||
if (--mutex->count == 0) {
|
if (--mutex->count == 0) {
|
||||||
mutex->owner = 0;
|
mutex->owner = 0;
|
||||||
@@ -185,19 +171,15 @@ static SDL_mutex *SDL_CreateMutex_cs(void)
|
|||||||
static void SDL_DestroyMutex_cs(SDL_mutex *mutex_)
|
static void SDL_DestroyMutex_cs(SDL_mutex *mutex_)
|
||||||
{
|
{
|
||||||
SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_;
|
SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_;
|
||||||
if (mutex != NULL) {
|
|
||||||
DeleteCriticalSection(&mutex->cs);
|
DeleteCriticalSection(&mutex->cs);
|
||||||
SDL_free(mutex);
|
SDL_free(mutex);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Lock the mutex */
|
/* Lock the mutex */
|
||||||
static int SDL_LockMutex_cs(SDL_mutex *mutex_) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */
|
static int SDL_LockMutex_cs(SDL_mutex *mutex_) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */
|
||||||
{
|
{
|
||||||
SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_;
|
SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_;
|
||||||
if (mutex == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
EnterCriticalSection(&mutex->cs);
|
EnterCriticalSection(&mutex->cs);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -208,9 +190,6 @@ static int SDL_TryLockMutex_cs(SDL_mutex *mutex_)
|
|||||||
{
|
{
|
||||||
SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_;
|
SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
if (mutex == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TryEnterCriticalSection(&mutex->cs) == 0) {
|
if (TryEnterCriticalSection(&mutex->cs) == 0) {
|
||||||
retval = SDL_MUTEX_TIMEDOUT;
|
retval = SDL_MUTEX_TIMEDOUT;
|
||||||
@@ -222,9 +201,6 @@ static int SDL_TryLockMutex_cs(SDL_mutex *mutex_)
|
|||||||
static int SDL_UnlockMutex_cs(SDL_mutex *mutex_) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */
|
static int SDL_UnlockMutex_cs(SDL_mutex *mutex_) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */
|
||||||
{
|
{
|
||||||
SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_;
|
SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_;
|
||||||
if (mutex == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
LeaveCriticalSection(&mutex->cs);
|
LeaveCriticalSection(&mutex->cs);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -277,21 +253,35 @@ SDL_mutex *SDL_CreateMutex(void)
|
|||||||
|
|
||||||
void SDL_DestroyMutex(SDL_mutex *mutex)
|
void SDL_DestroyMutex(SDL_mutex *mutex)
|
||||||
{
|
{
|
||||||
SDL_mutex_impl_active.Destroy(mutex);
|
if (mutex) {
|
||||||
|
SDL_mutex_impl_active.Destroy(mutex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int SDL_LockMutex(SDL_mutex *mutex)
|
int SDL_LockMutex(SDL_mutex *mutex)
|
||||||
{
|
{
|
||||||
|
if (mutex == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return SDL_mutex_impl_active.Lock(mutex);
|
return SDL_mutex_impl_active.Lock(mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
int SDL_TryLockMutex(SDL_mutex *mutex)
|
int SDL_TryLockMutex(SDL_mutex *mutex)
|
||||||
{
|
{
|
||||||
|
if (mutex == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return SDL_mutex_impl_active.TryLock(mutex);
|
return SDL_mutex_impl_active.TryLock(mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
int SDL_UnlockMutex(SDL_mutex *mutex)
|
int SDL_UnlockMutex(SDL_mutex *mutex)
|
||||||
{
|
{
|
||||||
|
if (mutex == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return SDL_mutex_impl_active.Unlock(mutex);
|
return SDL_mutex_impl_active.Unlock(mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,12 +55,12 @@ static DWORD RunThread(void *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DWORD WINAPI RunThreadViaCreateThread(LPVOID data)
|
static DWORD WINAPI MINGW32_FORCEALIGN RunThreadViaCreateThread(LPVOID data)
|
||||||
{
|
{
|
||||||
return RunThread(data);
|
return RunThread(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned __stdcall RunThreadViaBeginThreadEx(void *data)
|
static unsigned __stdcall MINGW32_FORCEALIGN RunThreadViaBeginThreadEx(void *data)
|
||||||
{
|
{
|
||||||
return (unsigned)RunThread(data);
|
return (unsigned)RunThread(data);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,15 +106,20 @@ void SDL_Blit_Slow(SDL_BlitInfo *info)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (FORMAT_HAS_ALPHA(dstfmt_val)) {
|
if ((flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL))) {
|
||||||
DISEMBLE_RGBA(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, dstB, dstA);
|
if (FORMAT_HAS_ALPHA(dstfmt_val)) {
|
||||||
} else if (FORMAT_HAS_NO_ALPHA(dstfmt_val)) {
|
DISEMBLE_RGBA(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, dstB, dstA);
|
||||||
DISEMBLE_RGB(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, dstB);
|
} else if (FORMAT_HAS_NO_ALPHA(dstfmt_val)) {
|
||||||
dstA = 0xFF;
|
DISEMBLE_RGB(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, dstB);
|
||||||
|
dstA = 0xFF;
|
||||||
|
} else {
|
||||||
|
/* SDL_PIXELFORMAT_ARGB2101010 */
|
||||||
|
dstpixel = *((Uint32 *) (dst));
|
||||||
|
RGBA_FROM_ARGB2101010(dstpixel, dstR, dstG, dstB, dstA);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* SDL_PIXELFORMAT_ARGB2101010 */
|
/* don't care */
|
||||||
dstpixel = *((Uint32 *)(dst));
|
dstR = dstG = dstB = dstA = 0;
|
||||||
RGBA_FROM_ARGB2101010(dstpixel, dstR, dstG, dstB, dstA);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & SDL_COPY_MODULATE_COLOR) {
|
if (flags & SDL_COPY_MODULATE_COLOR) {
|
||||||
|
|||||||
@@ -852,6 +852,10 @@ void SDL_DetectPalette(SDL_Palette *pal, SDL_bool *is_opaque, SDL_bool *has_alph
|
|||||||
/* Find the opaque pixel value corresponding to an RGB triple */
|
/* Find the opaque pixel value corresponding to an RGB triple */
|
||||||
Uint32 SDL_MapRGB(const SDL_PixelFormat *format, Uint8 r, Uint8 g, Uint8 b)
|
Uint32 SDL_MapRGB(const SDL_PixelFormat *format, Uint8 r, Uint8 g, Uint8 b)
|
||||||
{
|
{
|
||||||
|
if (!format) {
|
||||||
|
SDL_InvalidParamError("format");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
if (format->palette == NULL) {
|
if (format->palette == NULL) {
|
||||||
return (r >> format->Rloss) << format->Rshift | (g >> format->Gloss) << format->Gshift | (b >> format->Bloss) << format->Bshift | format->Amask;
|
return (r >> format->Rloss) << format->Rshift | (g >> format->Gloss) << format->Gshift | (b >> format->Bloss) << format->Bshift | format->Amask;
|
||||||
} else {
|
} else {
|
||||||
@@ -862,6 +866,10 @@ Uint32 SDL_MapRGB(const SDL_PixelFormat *format, Uint8 r, Uint8 g, Uint8 b)
|
|||||||
/* Find the pixel value corresponding to an RGBA quadruple */
|
/* Find the pixel value corresponding to an RGBA quadruple */
|
||||||
Uint32 SDL_MapRGBA(const SDL_PixelFormat *format, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
|
Uint32 SDL_MapRGBA(const SDL_PixelFormat *format, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
|
||||||
{
|
{
|
||||||
|
if (!format) {
|
||||||
|
SDL_InvalidParamError("format");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
if (format->palette == NULL) {
|
if (format->palette == NULL) {
|
||||||
return (r >> format->Rloss) << format->Rshift | (g >> format->Gloss) << format->Gshift | (b >> format->Bloss) << format->Bshift | ((Uint32)(a >> format->Aloss) << format->Ashift & format->Amask);
|
return (r >> format->Rloss) << format->Rshift | (g >> format->Gloss) << format->Gshift | (b >> format->Bloss) << format->Bshift | ((Uint32)(a >> format->Aloss) << format->Ashift & format->Amask);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+12
-5
@@ -18,6 +18,7 @@
|
|||||||
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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../SDL_internal.h"
|
#include "../SDL_internal.h"
|
||||||
|
|
||||||
/* The high-level video driver subsystem */
|
/* The high-level video driver subsystem */
|
||||||
@@ -127,15 +128,15 @@ static VideoBootStrap *bootstrap[] = {
|
|||||||
#if SDL_VIDEO_DRIVER_QNX
|
#if SDL_VIDEO_DRIVER_QNX
|
||||||
&QNX_bootstrap,
|
&QNX_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
#if SDL_VIDEO_DRIVER_OFFSCREEN
|
#if SDL_VIDEO_DRIVER_OS2
|
||||||
&OFFSCREEN_bootstrap,
|
&OS2DIVE_bootstrap,
|
||||||
|
&OS2VMAN_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
#if SDL_VIDEO_DRIVER_NGAGE
|
#if SDL_VIDEO_DRIVER_NGAGE
|
||||||
&NGAGE_bootstrap,
|
&NGAGE_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
#if SDL_VIDEO_DRIVER_OS2
|
#if SDL_VIDEO_DRIVER_OFFSCREEN
|
||||||
&OS2DIVE_bootstrap,
|
&OFFSCREEN_bootstrap,
|
||||||
&OS2VMAN_bootstrap,
|
|
||||||
#endif
|
#endif
|
||||||
#if SDL_VIDEO_DRIVER_DUMMY
|
#if SDL_VIDEO_DRIVER_DUMMY
|
||||||
&DUMMY_bootstrap,
|
&DUMMY_bootstrap,
|
||||||
@@ -824,6 +825,9 @@ void SDL_SetCurrentDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode
|
|||||||
|
|
||||||
void SDL_SetDesktopDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
|
void SDL_SetDesktopDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
|
||||||
{
|
{
|
||||||
|
if (display->desktop_mode.driverdata) {
|
||||||
|
SDL_free(display->desktop_mode.driverdata);
|
||||||
|
}
|
||||||
SDL_memcpy(&display->desktop_mode, mode, sizeof(*mode));
|
SDL_memcpy(&display->desktop_mode, mode, sizeof(*mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1398,6 +1402,9 @@ static int SDL_UpdateFullscreenMode(SDL_Window *window, SDL_bool fullscreen)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
display = SDL_GetDisplayForWindow(window);
|
display = SDL_GetDisplayForWindow(window);
|
||||||
|
if (display == NULL) { /* No display connected, nothing to do. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (fullscreen) {
|
if (fullscreen) {
|
||||||
/* Hide any other fullscreen windows */
|
/* Hide any other fullscreen windows */
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ static void android_egl_context_restore(SDL_Window *window)
|
|||||||
if (window) {
|
if (window) {
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
|
SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
|
||||||
|
SDL_GL_MakeCurrent(window, NULL);
|
||||||
if (SDL_GL_MakeCurrent(window, (SDL_GLContext)data->egl_context) < 0) {
|
if (SDL_GL_MakeCurrent(window, (SDL_GLContext)data->egl_context) < 0) {
|
||||||
/* The context is no longer valid, create a new one */
|
/* The context is no longer valid, create a new one */
|
||||||
data->egl_context = (EGLContext)SDL_GL_CreateContext(window);
|
data->egl_context = (EGLContext)SDL_GL_CreateContext(window);
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ typedef struct {
|
|||||||
/* What location we last saw the cursor move to. */
|
/* What location we last saw the cursor move to. */
|
||||||
CGFloat lastMoveX;
|
CGFloat lastMoveX;
|
||||||
CGFloat lastMoveY;
|
CGFloat lastMoveY;
|
||||||
|
/* If we just turned on relative mode, and should skip a single mouse motion event. */
|
||||||
|
SDL_bool justEnabledRelative;
|
||||||
} SDL_MouseData;
|
} SDL_MouseData;
|
||||||
|
|
||||||
@interface NSCursor (InvisibleCursor)
|
@interface NSCursor (InvisibleCursor)
|
||||||
|
|||||||
@@ -293,8 +293,11 @@ static int Cocoa_SetRelativeMouseMode(SDL_bool enabled)
|
|||||||
if (enabled) {
|
if (enabled) {
|
||||||
if (window) {
|
if (window) {
|
||||||
/* make sure the mouse isn't at the corner of the window, as this can confuse things if macOS thinks a window resize is happening on the first click. */
|
/* make sure the mouse isn't at the corner of the window, as this can confuse things if macOS thinks a window resize is happening on the first click. */
|
||||||
|
SDL_MouseData *mousedriverdata = (SDL_MouseData*)SDL_GetMouse()->driverdata;
|
||||||
const CGPoint point = CGPointMake((float)(window->x + (window->w / 2)), (float)(window->y + (window->h / 2)));
|
const CGPoint point = CGPointMake((float)(window->x + (window->w / 2)), (float)(window->y + (window->h / 2)));
|
||||||
Cocoa_HandleMouseWarp(point.x, point.y);
|
if (mousedriverdata) {
|
||||||
|
mousedriverdata->justEnabledRelative = SDL_TRUE;
|
||||||
|
}
|
||||||
CGWarpMouseCursorPosition(point);
|
CGWarpMouseCursorPosition(point);
|
||||||
}
|
}
|
||||||
DLog("Turning on.");
|
DLog("Turning on.");
|
||||||
@@ -465,6 +468,11 @@ void Cocoa_HandleMouseEvent(_THIS, NSEvent *event)
|
|||||||
seenWarp = driverdata->seenWarp;
|
seenWarp = driverdata->seenWarp;
|
||||||
driverdata->seenWarp = NO;
|
driverdata->seenWarp = NO;
|
||||||
|
|
||||||
|
if (driverdata->justEnabledRelative) {
|
||||||
|
driverdata->justEnabledRelative = SDL_FALSE;
|
||||||
|
return; // dump the first event back.
|
||||||
|
}
|
||||||
|
|
||||||
location = [NSEvent mouseLocation];
|
location = [NSEvent mouseLocation];
|
||||||
lastMoveX = driverdata->lastMoveX;
|
lastMoveX = driverdata->lastMoveX;
|
||||||
lastMoveY = driverdata->lastMoveY;
|
lastMoveY = driverdata->lastMoveY;
|
||||||
|
|||||||
@@ -31,6 +31,15 @@
|
|||||||
|
|
||||||
#include "../../events/SDL_mouse_c.h"
|
#include "../../events/SDL_mouse_c.h"
|
||||||
|
|
||||||
|
/* older Emscriptens don't have this, but we need to for wasm64 compatibility. */
|
||||||
|
#ifndef MAIN_THREAD_EM_ASM_PTR
|
||||||
|
#ifdef __wasm64__
|
||||||
|
#error You need to upgrade your Emscripten compiler to support wasm64
|
||||||
|
#else
|
||||||
|
#define MAIN_THREAD_EM_ASM_PTR MAIN_THREAD_EM_ASM_INT
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
static SDL_Cursor *Emscripten_CreateCursorFromString(const char *cursor_str, SDL_bool is_custom)
|
static SDL_Cursor *Emscripten_CreateCursorFromString(const char *cursor_str, SDL_bool is_custom)
|
||||||
{
|
{
|
||||||
SDL_Cursor *cursor;
|
SDL_Cursor *cursor;
|
||||||
@@ -60,6 +69,8 @@ static SDL_Cursor *Emscripten_CreateDefaultCursor()
|
|||||||
return Emscripten_CreateCursorFromString("default", SDL_FALSE);
|
return Emscripten_CreateCursorFromString("default", SDL_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EM_JS_DEPS(sdlmouse, "$stringToUTF8,$UTF8ToString");
|
||||||
|
|
||||||
static SDL_Cursor *Emscripten_CreateCursor(SDL_Surface *surface, int hot_x, int hot_y)
|
static SDL_Cursor *Emscripten_CreateCursor(SDL_Surface *surface, int hot_x, int hot_y)
|
||||||
{
|
{
|
||||||
const char *cursor_url = NULL;
|
const char *cursor_url = NULL;
|
||||||
@@ -72,7 +83,7 @@ static SDL_Cursor *Emscripten_CreateCursor(SDL_Surface *surface, int hot_x, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* *INDENT-OFF* */ /* clang-format off */
|
/* *INDENT-OFF* */ /* clang-format off */
|
||||||
cursor_url = (const char *)MAIN_THREAD_EM_ASM_INT({
|
cursor_url = (const char *)MAIN_THREAD_EM_ASM_PTR({
|
||||||
var w = $0;
|
var w = $0;
|
||||||
var h = $1;
|
var h = $1;
|
||||||
var hot_x = $2;
|
var hot_x = $2;
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
Loaded 100 of 128 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user