Compare commits

..

3 Commits

Author SHA1 Message Date
Ty Lamontagne
37555e3048 CDVD | CHD: Account for pre/post gap offsets when filling TOC
This will fix discs with tracks with both an INDEX 00 and INDEX 01
2024-11-27 15:55:11 -05:00
Ty Lamontagne
d8f18a3318 CDVD: Byte swap hack. CHD CD audio with OSDSYS is working 2024-11-27 15:54:56 -05:00
Ty Lamontagne
47a732d0fe CDVD: CHD cue support for audio CDs
experimental and will blow out your ears
2024-11-27 15:25:59 -05:00
40 changed files with 839 additions and 874 deletions

View File

@@ -20,7 +20,7 @@ LIBPNG=1.6.44
LIBWEBP=1.4.0
LZ4=b8fd2d15309dd4e605070bd4486e26b6ef814e29
SDL=SDL2-2.30.9
QT=6.8.1
QT=6.8.0
ZSTD=1.5.6
SHADERC=2024.1
@@ -39,12 +39,12 @@ fd6f417fe9e3a071cf1424a5152d926a34c4a3c5070745470be6cf12a404ed79 $LIBBACKTRACE.
0728800155f3ed0a0c87e03addbd30ecbe374f7b080678bbca1506051d50dec3 $LZ4.tar.gz
24b574f71c87a763f50704bbb630cbe38298d544a1f890f099a4696b1d6beba4 $SDL.tar.gz
8c29e06cf42aacc1eafc4077ae2ec6c6fcb96a626157e0593d5e82a34fd403c1 zstd-$ZSTD.tar.gz
40b14562ef3bd779bc0e0418ea2ae08fa28235f8ea6e8c0cb3bce1d6ad58dcaf qtbase-everywhere-src-$QT.tar.xz
138cc2909aa98f5ff7283e36eb3936eb5e625d3ca3b4febae2ca21d8903dd237 qtimageformats-everywhere-src-$QT.tar.xz
3d0de73596e36b2daa7c48d77c4426bb091752856912fba720215f756c560dd0 qtsvg-everywhere-src-$QT.tar.xz
9d43d409be08b8681a0155a9c65114b69c9a3fc11aef6487bb7fdc5b283c432d qttools-everywhere-src-$QT.tar.xz
635a6093e99152243b807de51077485ceadd4786d4acb135b9340b2303035a4a qttranslations-everywhere-src-$QT.tar.xz
2226fbde4e2ddd12f8bf4b239c8f38fd706a54e789e63467dfddc77129eca203 qtwayland-everywhere-src-$QT.tar.xz
1bad481710aa27f872de6c9f72651f89a6107f0077003d0ebfcc9fd15cba3c75 qtbase-everywhere-src-$QT.tar.xz
595bf8557b91e1f8ebc726f1e09868a3c7e610ff5045068f2d4ea2428c49a5d4 qtimageformats-everywhere-src-$QT.tar.xz
cf7a593d5e520f8177240610d9e55d5b75b0887fe5f385554ff64377f1646199 qtsvg-everywhere-src-$QT.tar.xz
403115d8268503c6cc6e43310c8ae28eb9e605072a5d04e4a2de8b6af39981f7 qttools-everywhere-src-$QT.tar.xz
84bf2b67c243cd0c50a08acd7bfa9df2b1965028511815c1b6b65a0687437cb6 qttranslations-everywhere-src-$QT.tar.xz
175758591638ebf1c6fbb66ac11c7fa0eb8d4ed52e9243cc59075d06a6a2060a qtwayland-everywhere-src-$QT.tar.xz
eb3b5f0c16313d34f208d90c2fa1e588a23283eed63b101edd5422be6165d528 shaderc-$SHADERC.tar.gz
aa27e4454ce631c5a17924ce0624eac736da19fc6f5a2ab15a6c58da7b36950f shaderc-glslang-$SHADERC_GLSLANG.tar.gz
5d866ce34a4b6908e262e5ebfffc0a5e11dd411640b5f24c85a80ad44c0d4697 shaderc-spirv-headers-$SHADERC_SPIRVHEADERS.tar.gz

View File

@@ -47,7 +47,7 @@ set HARFBUZZ=10.0.1
set LIBJPEG=9f
set LIBPNG=1643
set LZ4=b8fd2d15309dd4e605070bd4486e26b6ef814e29
set QT=6.8.1
set QT=6.8.0
set QTMINOR=6.8
set SDL=SDL2-2.30.9
set WEBP=1.4.0
@@ -67,11 +67,11 @@ call :downloadfile "jpegsr%LIBJPEG%.zip" https://ijg.org/files/jpegsr%LIBJPEG%.z
call :downloadfile "libwebp-%WEBP%.tar.gz" "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-%WEBP%.tar.gz" 61f873ec69e3be1b99535634340d5bde750b2e4447caa1db9f61be3fd49ab1e5 || goto error
call :downloadfile "lz4-%LZ4%.zip" "https://github.com/lz4/lz4/archive/%LZ4%.zip" 0c33119688d6b180c7e760b0acd70059222389cfd581632623784bee27e51a31 || goto error
call :downloadfile "%SDL%.zip" "https://libsdl.org/release/%SDL%.zip" ec855bcd815b4b63d0c958c42c2923311c656227d6e0c1ae1e721406d346444b || goto error
call :downloadfile "qtbase-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtbase-everywhere-src-%QT%.zip" e22d997bd15b795a176c8da62c8c1da0a674eb534e02f7c01ca507bf11bce0c3 || goto error
call :downloadfile "qtimageformats-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtimageformats-everywhere-src-%QT%.zip" 247a0a58039275a5a4fb499a600a90f66dc6e00321bb6f86a9b8d8020344d853 || goto error
call :downloadfile "qtsvg-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtsvg-everywhere-src-%QT%.zip" 57bd332e5550ff70a852560c591b786b6ba587c5e41cb5ef91038d82db137ab9 || goto error
call :downloadfile "qttools-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qttools-everywhere-src-%QT%.zip" c65a89140f5d68137ffec67d631ec97002fb37077d9b4eb4ee45cbec39b1c38a || goto error
call :downloadfile "qttranslations-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qttranslations-everywhere-src-%QT%.zip" 30a8e7773e1f274557e049a97f158b808f344247da03ae5240e4956c81d51cd5 || goto error
call :downloadfile "qtbase-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtbase-everywhere-src-%QT%.zip" c3b41915341d853b6374cf93f1fcced2c8e4be9360f29c656960e1d0d15046a3 || goto error
call :downloadfile "qtimageformats-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtimageformats-everywhere-src-%QT%.zip" 809081a7bdf7e48262fbe9437e4e756df6ad2649433e803c4040026e650d7c91 || goto error
call :downloadfile "qtsvg-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtsvg-everywhere-src-%QT%.zip" 89f1ef4595f68c3d34c63a7c1c4ce475e701e103f0473f3fd0718a2e5234de6e || goto error
call :downloadfile "qttools-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qttools-everywhere-src-%QT%.zip" 3f813f49d6d28c532dc4b104084f60ff382337f184698fcd6e70ab9efad977c1 || goto error
call :downloadfile "qttranslations-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qttranslations-everywhere-src-%QT%.zip" 91c33d9946279c9c613b02e52a33df610cc01d13ea6e321b4c4d8ee708b9a03e || goto error
call :downloadfile "zlib%ZLIBSHORT%.zip" "https://zlib.net/zlib%ZLIBSHORT%.zip" 72af66d44fcc14c22013b46b814d5d2514673dda3d115e64b690c1ad636e7b17 || goto error
call :downloadfile "zstd-%ZSTD%.zip" "https://github.com/facebook/zstd/archive/refs/tags/v%ZSTD%.zip" 3b1c3b46e416d36931efd34663122d7f51b550c87f74de2d38249516fe7d8be5 || goto error
call :downloadfile "zstd-fd5f8106a58601a963ee816e6a57aa7c61fafc53.patch" https://github.com/facebook/zstd/commit/fd5f8106a58601a963ee816e6a57aa7c61fafc53.patch 8df152f4969b308546306c074628de761f0b80265de7de534e3822fab22d7535 || goto error

View File

@@ -45,7 +45,7 @@ set HARFBUZZ=10.0.1
set LIBJPEG=9f
set LIBPNG=1643
set LZ4=b8fd2d15309dd4e605070bd4486e26b6ef814e29
set QT=6.8.1
set QT=6.8.0
set QTMINOR=6.8
set SDL=SDL2-2.30.9
set WEBP=1.4.0
@@ -65,11 +65,11 @@ call :downloadfile "jpegsr%LIBJPEG%.zip" https://ijg.org/files/jpegsr%LIBJPEG%.z
call :downloadfile "libwebp-%WEBP%.tar.gz" "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-%WEBP%.tar.gz" 61f873ec69e3be1b99535634340d5bde750b2e4447caa1db9f61be3fd49ab1e5 || goto error
call :downloadfile "lz4-%LZ4%.zip" "https://github.com/lz4/lz4/archive/%LZ4%.zip" 0c33119688d6b180c7e760b0acd70059222389cfd581632623784bee27e51a31 || goto error
call :downloadfile "%SDL%.zip" "https://libsdl.org/release/%SDL%.zip" ec855bcd815b4b63d0c958c42c2923311c656227d6e0c1ae1e721406d346444b || goto error
call :downloadfile "qtbase-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtbase-everywhere-src-%QT%.zip" e22d997bd15b795a176c8da62c8c1da0a674eb534e02f7c01ca507bf11bce0c3 || goto error
call :downloadfile "qtimageformats-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtimageformats-everywhere-src-%QT%.zip" 247a0a58039275a5a4fb499a600a90f66dc6e00321bb6f86a9b8d8020344d853 || goto error
call :downloadfile "qtsvg-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtsvg-everywhere-src-%QT%.zip" 57bd332e5550ff70a852560c591b786b6ba587c5e41cb5ef91038d82db137ab9 || goto error
call :downloadfile "qttools-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qttools-everywhere-src-%QT%.zip" c65a89140f5d68137ffec67d631ec97002fb37077d9b4eb4ee45cbec39b1c38a || goto error
call :downloadfile "qttranslations-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qttranslations-everywhere-src-%QT%.zip" 30a8e7773e1f274557e049a97f158b808f344247da03ae5240e4956c81d51cd5 || goto error
call :downloadfile "qtbase-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtbase-everywhere-src-%QT%.zip" c3b41915341d853b6374cf93f1fcced2c8e4be9360f29c656960e1d0d15046a3 || goto error
call :downloadfile "qtimageformats-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtimageformats-everywhere-src-%QT%.zip" 809081a7bdf7e48262fbe9437e4e756df6ad2649433e803c4040026e650d7c91 || goto error
call :downloadfile "qtsvg-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtsvg-everywhere-src-%QT%.zip" 89f1ef4595f68c3d34c63a7c1c4ce475e701e103f0473f3fd0718a2e5234de6e || goto error
call :downloadfile "qttools-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qttools-everywhere-src-%QT%.zip" 3f813f49d6d28c532dc4b104084f60ff382337f184698fcd6e70ab9efad977c1 || goto error
call :downloadfile "qttranslations-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qttranslations-everywhere-src-%QT%.zip" 91c33d9946279c9c613b02e52a33df610cc01d13ea6e321b4c4d8ee708b9a03e || goto error
call :downloadfile "zlib%ZLIBSHORT%.zip" "https://zlib.net/zlib%ZLIBSHORT%.zip" 72af66d44fcc14c22013b46b814d5d2514673dda3d115e64b690c1ad636e7b17 || goto error
call :downloadfile "zstd-%ZSTD%.zip" "https://github.com/facebook/zstd/archive/refs/tags/v%ZSTD%.zip" 3b1c3b46e416d36931efd34663122d7f51b550c87f74de2d38249516fe7d8be5 || goto error
call :downloadfile "zstd-fd5f8106a58601a963ee816e6a57aa7c61fafc53.patch" https://github.com/facebook/zstd/commit/fd5f8106a58601a963ee816e6a57aa7c61fafc53.patch 8df152f4969b308546306c074628de761f0b80265de7de534e3822fab22d7535 || goto error

View File

@@ -176,8 +176,8 @@
030000004f04000020b3000000000000,Dual Trigger,a:b0,b:b2,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:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,
03000000bd12000002e0000000000000,Dual Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows,
03000000ff1100003133000000000000,DualForce,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:a4,start:b9,x:b0,y:b1,platform:Windows,
030000008f0e00000910000000000000,Sony DualShock 2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows,
03000000317300000100000000000000,Sony DualShock 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,
030000008f0e00000910000000000000,DualShock 2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows,
03000000317300000100000000000000,DualShock 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,
030000006f0e00003001000000000000,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,platform:Windows,
03000000fc0400000250000000000000,Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,
03000000bc2000000091000000000000,EasySMX Controller,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,platform:Windows,
@@ -273,8 +273,8 @@
030000000d0f00005100000000000000,Hori Fighting Commander PS3,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:a5,start:b9,x:b0,y:b3,platform:Windows,
030000000d0f00008600000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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,platform:Windows,
030000000d0f0000ba00000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
030000000d0f00008800000000000000,Hori Fighting Stick mini 4 PS3,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows,
030000000d0f00008700000000000000,Hori Fighting Stick mini 4 PS4,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,touchpad:b13,x:b0,y:b3,platform:Windows,
030000000d0f00008800000000000000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows,
030000000d0f00008700000000000000,Hori Fighting Stick mini 4 (PS4),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,touchpad:b13,x:b0,y:b3,platform:Windows,
030000000d0f00001000000000000000,Hori Fightstick,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:a5,start:b9,x:b0,y:b3,platform:Windows,
030000000d0f00003200000000000000,Hori Fightstick 3W,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:a5,start:b9,x:b0,y:b3,platform:Windows,
030000000d0f0000c000000000000000,Hori Fightstick 4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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,platform:Windows,
@@ -489,13 +489,13 @@
030000006f0e00000901000000000000,PDP PS3 Versus Fighting,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,platform:Windows,
030000006f0e00008901000000000000,PDP Realmz Nintendo Switch 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,platform:Windows,
030000008f0e00004100000000000000,PlaySega,a:b1,b:b0,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b4,y:b3,platform:Windows,
03000000666600006706000000000000,Sony PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows,
03000000e30500009605000000000000,Sony PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,
030000004c050000da0c000000000000,Sony PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,
03000000632500002306000000000000,Sony PlayStation Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,
03000000f0250000c183000000000000,Sony PlayStation 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,platform:Windows,
03000000d9040000160f000000000000,Sony PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,
030000004c0500003713000000000000,Sony PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,
03000000666600006706000000000000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows,
03000000e30500009605000000000000,PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,
030000004c050000da0c000000000000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,
03000000632500002306000000000000,PlayStation Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,
03000000f0250000c183000000000000,PlayStation 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,platform:Windows,
03000000d9040000160f000000000000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,
030000004c0500003713000000000000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,
03000000d620000011a7000000000000,PowerA Core 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,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
03000000dd62000015a7000000000000,PowerA Fusion Nintendo Switch Arcade Stick,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,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
03000000d620000012a7000000000000,PowerA Fusion Nintendo Switch Fight 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:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
@@ -691,7 +691,7 @@
03000000380700001722000000000000,Speedlink Competition Pro,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,x:b2,y:b3,platform:Windows,
030000008f0e00000800000000000000,Speedlink Strike FX,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,platform:Windows,
03000000c01100000591000000000000,Speedlink Torid,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,platform:Windows,
03000000d11800000094000000000000,Google Stadia Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b11,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows,
03000000d11800000094000000000000,Stadia Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b11,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows,
03000000de280000fc11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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,platform:Windows,
03000000de280000ff11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
03000000120c0000160e000000000000,Steel Play Metaltech PS4 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,touchpad:b13,x:b0,y:b3,platform:Windows,
@@ -721,12 +721,12 @@
03000000591c00002600000000000000,THEGamepad,a:b2,b:b1,back:b6,leftx:a0,lefty:a1,start:b7,x:b3,y:b0,platform:Windows,
030000004f04000015b3000000000000,Thrustmaster Dual Analog 4,a:b0,b:b2,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:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,
030000004f04000023b3000000000000,Thrustmaster Dual Trigger PlayStation Controller,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:a5,start:b9,x:b0,y:b3,platform:Windows,
030000004f0400000ed0000000000000,Thrustmaster eSwap Pro 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,platform:Windows,
030000004f04000008d0000000000000,Thrustmaster Ferrari 150 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
030000004f0400000ed0000000000000,ThrustMaster eSwap Pro 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,platform:Windows,
030000004f04000008d0000000000000,ThrustMaster Ferrari 150 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Windows,
030000004f04000004b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,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:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,
030000004f04000003d0000000000000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:a3,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:a4,rightstick:b11,righttrigger:b5,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
030000004f04000009d0000000000000,Thrustmaster Run N Drive PlayStation Controller,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,platform:Windows,
030000004f04000003d0000000000000,ThrustMaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:a3,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:a4,rightstick:b11,righttrigger:b5,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
030000004f04000009d0000000000000,ThrustMaster Run N Drive PlayStation Controller,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,platform:Windows,
030000006d04000088ca000000000000,Thunderpad,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,
03000000666600000288000000000000,TigerGame PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,
03000000666600000488000000000000,TigerGame PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,
@@ -931,8 +931,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000000d0f00008400000000010000,Hori Fighting Commander PS3,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,platform:Mac OS X,
030000000d0f00008500000000010000,Hori Fighting Commander PS3,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,platform:Mac OS X,
03000000341a00000302000014010000,Hori Fighting Stick Mini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00008800000000010000,Hori Fighting Stick mini 4 PS3,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,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00008700000000010000,Hori Fighting Stick mini 4 PS4,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,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
030000000d0f00008800000000010000,Hori Fighting Stick mini 4 (PS3),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,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
030000000d0f00008700000000010000,Hori Fighting Stick mini 4 (PS4),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,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
030000000d0f00004d00000000000000,Hori Gem Pad 3,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,platform:Mac OS X,
030000000d0f00003801000008010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Mac OS X,
030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
@@ -998,9 +998,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000004b120000014d000000010000,Nyko Airflo EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Mac OS X,
030000006f0e00000901000002010000,PDP PS3 Versus Fighting,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,platform:Mac OS X,
030000008f0e00000300000000000000,Piranha Xtreme PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X,
03000000666600006706000088020000,Sony PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Mac OS X,
030000004c050000da0c000000010000,Sony PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X,
030000004c0500003713000000010000,Sony PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X,
03000000666600006706000088020000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Mac OS X,
030000004c050000da0c000000010000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X,
030000004c0500003713000000010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X,
03000000d620000011a7000000020000,PowerA Core Plus Gamecube Controller,a:b1,b:b0,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:b2,y:b3,platform:Mac OS X,
03000000d620000011a7000010050000,PowerA Nintendo Switch 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,platform:Mac OS X,
03000000d62000006dca000000010000,PowerA Pro Ex,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,platform:Mac OS X,
@@ -1018,7 +1018,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
050000004c050000e60c000000010000,PS5 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,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
050000004c050000f20d000000010000,PS5 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,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
030000005e040000e002000001000000,PXN P30 Pro Mobile,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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,platform:Mac OS X,
03000000222c00000225000000010000,Qanba Dragon Arcade Joystick PS3,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,platform:Mac OS X,
03000000222c00000225000000010000,Qanba Dragon Arcade Joystick (PS3),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,platform:Mac OS X,
03000000222c00000020000000010000,Qanba Drone Arcade Stick,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,platform:Mac OS X,
030000009b2800005600000020020000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Mac OS X,
030000009b2800008000000022020000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Mac OS X,
@@ -1053,7 +1053,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
0300000000f00000f100000000000000,SNES RetroPort,a:b2,b:b3,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,rightshoulder:b7,start:b6,x:b0,y:b1,platform:Mac OS X,
030000004c050000a00b000000000000,Sony DualShock 4 Adapter,a:b1,b:b2,back:b13,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,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,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,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
03000000d11800000094000000010000,Google Stadia 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:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X,
03000000d11800000094000000010000,Stadia 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:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X,
030000005e0400008e02000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
03000000110100002014000000000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X,
03000000110100002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X,
@@ -1072,7 +1072,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000591c00002400000021000000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Mac OS X,
03000000591c00002600000021000000,THEGamepad,a:b2,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Mac OS X,
030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,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:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X,
030000004f0400000ed0000000020000,Thrustmaster eSwap Pro 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,platform:Mac OS X,
030000004f0400000ed0000000020000,ThrustMaster eSwap Pro 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,platform:Mac OS X,
030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X,
03000000571d00002100000021000000,Tomee NES Controller Adapter,a:b1,b:b0,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,start:b3,platform:Mac OS X,
03000000bd12000015d0000000010000,Tomee Retro Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X,
@@ -1285,7 +1285,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
190000004b4800000011000000010000,GO-Super Controller,a:b1,b:b0,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b2,y:b3,platform:Linux,
03000000f0250000c183000010010000,Goodbetterbest 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,platform:Linux,
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,platform:Linux,
030000005e0400008e02000001010000,GPD Win Max 2 6800U 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,platform:Linux,
030000005e0400008e02000001010000,GPD Win Max 2 (6800U) 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,platform:Linux,
030000007d0400000540000000010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
03000000280400000140000000010000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000008f0e00000610000000010000,GreenAsia Electronics Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Linux,
@@ -1303,8 +1303,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000000d0f00008500000010010000,Hori Fighting Commander PS3,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,platform:Linux,
030000000d0f00008600000002010000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
030000000d0f00003701000013010000,Hori Fighting Stick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b3,y:b2,platform:Linux,
030000000d0f00008800000011010000,Hori Fighting Stick mini 4 PS3,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,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00008700000011010000,Hori Fighting Stick mini 4 PS4,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,rightshoulder:b5,rightstick:b11,righttrigger:a4,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
030000000d0f00008800000011010000,Hori Fighting Stick mini 4 (PS3),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,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000000d0f00008700000011010000,Hori Fighting Stick mini 4 (PS4),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,rightshoulder:b5,rightstick:b11,righttrigger:a4,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
030000000d0f00001000000011010000,Hori Fightstick 3,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,platform:Linux,
03000000ad1b000003f5000033050000,Hori Fightstick VX,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b8,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux,
030000000d0f00004d00000011010000,Hori Gem Pad 3,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,platform:Linux,
@@ -1382,7 +1382,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000380700001647000010040000,Mad Catz Xbox 360 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,platform:Linux,
03000000380700003847000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
03000000ad1b000016f0000090040000,Mad Catz Xbox 360 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,platform:Linux,
03000000120c00000500000000010000,Manta DualShock 2,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:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
03000000120c00000500000000010000,Manta Dualshock 2,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:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
030000008f0e00001330000010010000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Linux,
03000000790000004318000010010000,Mayflash GameCube Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b0,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:b2,y:b3,platform:Linux,
@@ -1468,8 +1468,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
050000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b8,start:b10,x:b3,y:b2,platform:Linux,
050000007e0500001720000001800000,NSO SNES Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux,
03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
03000000550900001472000011010000,NVIDIA Controller,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,
05000000550900001472000001000000,NVIDIA Controller,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,
03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,
05000000550900001472000001000000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,
030000004b120000014d000000010000,NYKO Airflo EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
03000000451300000830000010010000,NYKO CORE,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:a5,start:b9,x:b0,y:b3,platform:Linux,
19000000010000000100000001010000,ODROID Go 2,a:b1,b:b0,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,guide:b10,leftshoulder:b4,leftstick:b12,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b14,start:b15,x:b2,y:b3,platform:Linux,
@@ -1494,10 +1494,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000006f0e0000a702000023020000,PDP Xbox One Raven Black,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,platform:Linux,
030000006f0e0000d802000006640000,PDP Xbox Series 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,platform:Linux,
030000006f0e0000ef02000007640000,PDP Xbox Series Kinetic Wired 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,platform:Linux,
03000000666600006706000000010000,Sony PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux,
030000004c050000da0c000011010000,Sony PlayStation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
03000000d9040000160f000000010000,Sony PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
030000004c0500003713000011010000,Sony PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux,
03000000666600006706000000010000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux,
030000004c050000da0c000011010000,PlayStation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
03000000d9040000160f000000010000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
030000004c0500003713000011010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux,
03000000c62400000053000000010000,PowerA,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,platform:Linux,
03000000c62400003a54000001010000,PowerA 1428124-01,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,platform:Linux,
03000000d620000011a7000011010000,PowerA Core 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,platform:Linux,
@@ -1556,14 +1556,14 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
050000004c050000e60c000000810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
050000004c050000f20d000000010000,PS5 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,touchpad:b13,x:b0,y:b3,platform:Linux,
03000000300f00001211000011010000,Qanba Arcade Joystick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux,
03000000222c00000225000011010000,Qanba Dragon Arcade Joystick PS3,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,platform:Linux,
03000000222c00000025000011010000,Qanba Dragon Arcade Joystick PS4,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,touchpad:b13,x:b0,y:b3,platform:Linux,
03000000222c00001220000011010000,Qanba Drone 2 Arcade Joystick PS4,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:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000222c00001020000011010000,Qanba Drone 2 Arcade Joystick PS5,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:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000222c00000225000011010000,Qanba Dragon Arcade Joystick (PS3),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,platform:Linux,
03000000222c00000025000011010000,Qanba Dragon Arcade Joystick (PS4),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,touchpad:b13,x:b0,y:b3,platform:Linux,
03000000222c00001220000011010000,Qanba Drone 2 Arcade Joystick (PS4),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:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000222c00001020000011010000,Qanba Drone 2 Arcade Joystick (PS5),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:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000222c00000020000011010000,Qanba Drone Arcade PS4 Joystick,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,rightshoulder:b5,righttrigger:a4,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
03000000300f00001210000010010000,Qanba Joystick Plus,a:b0,b:b1,back:b8,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,start:b9,x:b2,y:b3,platform:Linux,
03000000222c00000223000011010000,Qanba Obsidian Arcade Joystick PS3,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,platform:Linux,
03000000222c00000023000011010000,Qanba Obsidian Arcade Joystick PS4,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,touchpad:b13,x:b0,y:b3,platform:Linux,
03000000222c00000223000011010000,Qanba Obsidian Arcade Joystick (PS3),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,platform:Linux,
03000000222c00000023000011010000,Qanba Obsidian Arcade Joystick (PS4),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,touchpad:b13,x:b0,y:b3,platform:Linux,
030000009b2800000300000001010000,Raphnet 4nes4snes,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux,
030000009b2800004200000001010000,Raphnet Dual NES Adapter,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Linux,
0300132d9b2800006500000000000000,Raphnet GameCube Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,
@@ -1603,7 +1603,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000006f0e00001e01000011010000,Rock Candy 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,platform:Linux,
03000000c6240000fefa000000010000,Rock Candy Xbox 360 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,platform:Linux,
030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,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,platform:Linux,
03000000a306000023f6000011010000,Saitek Cyborg PlayStation 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:a4,start:b9,x:b0,y:b3,platform:Linux,
03000000a306000023f6000011010000,Saitek Cyborg V1 PlayStation 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:a4,start:b9,x:b0,y:b3,platform:Linux,
03000000a30600001005000000010000,Saitek P150,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b2,righttrigger:b5,x:b3,y:b4,platform:Linux,
03000000a30600000701000000010000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Linux,
03000000a30600000cff000010010000,Saitek P2500 Force Rumble,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b0,y:b1,platform:Linux,
@@ -1635,8 +1635,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000250900000500000000010000,Sony PS2 pad with SmartJoy Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,
030000005e0400008e02000073050000,Speedlink Torid,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,platform:Linux,
030000005e0400008e02000020200000,SpeedLink Xeox Pro Analog,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,platform:Linux,
03000000d11800000094000011010000,Google Stadia 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:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
05000000d11800000094000000010000,Google Stadia 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:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
03000000d11800000094000011010000,Stadia 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:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
05000000d11800000094000000010000,Stadia 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:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
03000000de2800000112000001000000,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,platform:Linux,
03000000de2800000112000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:+a5,dpleft:-a4,dpright:+a4,dpup:-a5,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,paddle1:b15,paddle2:b16,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux,
03000000de2800000211000001000000,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,platform:Linux,
@@ -1732,7 +1732,6 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000005e040000ea02000011050000,Xbox One S 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,platform:Linux,
060000005e040000ea0200000b050000,Xbox One S 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,platform:Linux,
060000005e040000ea0200000d050000,Xbox One S 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,platform:Linux,
030000005e040000ea02000015050000,Xbox One S Controller,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
060000005e040000ea02000016050000,Xbox One S 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,platform:Linux,
030000005e040000120b000001050000,Xbox Series 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,platform:Linux,
030000005e040000120b000005050000,Xbox Series 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,platform:Linux,

View File

@@ -1225,12 +1225,7 @@ bool FileSystem::RecursiveDeleteDirectory(const char* path)
{
for (const FILESYSTEM_FIND_DATA& fd : results)
{
if (IsSymbolicLink(fd.FileName.c_str()))
{
if (!DeleteSymbolicLink(fd.FileName.c_str()))
return false;
}
else if ((fd.Attributes & FILESYSTEM_FILE_ATTRIBUTE_DIRECTORY))
if (fd.Attributes & FILESYSTEM_FILE_ATTRIBUTE_DIRECTORY)
{
if (!RecursiveDeleteDirectory(fd.FileName.c_str()))
return false;
@@ -1655,6 +1650,21 @@ bool FileSystem::DirectoryExists(const char* path)
return false;
}
bool FileSystem::IsRealDirectory(const char* path)
{
// convert to wide string
const std::wstring wpath = GetWin32Path(path);
if (wpath.empty())
return false;
// determine attributes for the path. if it's a directory, things have to be handled differently..
const DWORD fileAttributes = GetFileAttributesW(wpath.c_str());
if (fileAttributes == INVALID_FILE_ATTRIBUTES)
return false;
return ((fileAttributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT)) != FILE_ATTRIBUTE_DIRECTORY);
}
bool FileSystem::DirectoryIsEmpty(const char* path)
{
std::wstring wpath = GetWin32Path(path);
@@ -1925,52 +1935,6 @@ bool FileSystem::SetPathCompression(const char* path, bool enable)
return result;
}
bool FileSystem::IsSymbolicLink(const char* path)
{
// convert to wide string
const std::wstring wpath = GetWin32Path(path);
if (wpath.empty())
return false;
// determine attributes for the path
const DWORD fileAttributes = GetFileAttributesW(wpath.c_str());
if (fileAttributes == INVALID_FILE_ATTRIBUTES)
return false;
return fileAttributes & FILE_ATTRIBUTE_REPARSE_POINT;
}
bool FileSystem::DeleteSymbolicLink(const char* path, Error* error)
{
// convert to wide string
const std::wstring wpath = GetWin32Path(path);
if (wpath.empty())
{
Error::SetStringView(error, "Invalid path.");
return false;
}
// delete the symbolic link
if (DirectoryExists(path))
{
if (!RemoveDirectoryW(wpath.c_str()))
{
Error::SetWin32(error, "RemoveDirectoryW() failed: ", GetLastError());
return false;
}
}
else
{
if (!DeleteFileW(wpath.c_str()))
{
Error::SetWin32(error, "DeleteFileW() failed: ", GetLastError());
return false;
}
}
return true;
}
#else
// No 32-bit file offsets breaking stuff please.
@@ -2252,6 +2216,15 @@ bool FileSystem::DirectoryExists(const char* path)
return false;
}
bool FileSystem::IsRealDirectory(const char* path)
{
struct stat sysStatData;
if (lstat(path, &sysStatData) < 0)
return false;
return (S_ISDIR(sysStatData.st_mode) && !S_ISLNK(sysStatData.st_mode));
}
bool FileSystem::DirectoryIsEmpty(const char* path)
{
DIR* pDir = opendir(path);
@@ -2505,26 +2478,6 @@ bool FileSystem::SetPathCompression(const char* path, bool enable)
return false;
}
bool FileSystem::IsSymbolicLink(const char* path)
{
struct stat sysStatData;
if (lstat(path, &sysStatData) < 0)
return false;
return S_ISLNK(sysStatData.st_mode);
}
bool FileSystem::DeleteSymbolicLink(const char* path, Error* error)
{
if (unlink(path) != 0)
{
Error::SetErrno(error, "unlink() failed: ", errno);
return false;
}
return true;
}
FileSystem::POSIXLock::POSIXLock(int fd)
{
if (lockf(fd, F_LOCK, 0) == 0)

View File

@@ -84,6 +84,7 @@ namespace FileSystem
/// Directory exists?
bool DirectoryExists(const char* path);
bool IsRealDirectory(const char* path);
/// Directory does not contain any files?
bool DirectoryIsEmpty(const char* path);
@@ -169,12 +170,6 @@ namespace FileSystem
/// Does nothing and returns false on non-Windows platforms.
bool SetPathCompression(const char* path, bool enable);
/// Checks if a file or directory is a symbolic link.
bool IsSymbolicLink(const char* path);
/// Deletes a symbolic link (either a file or directory).
bool DeleteSymbolicLink(const char* path, Error* error = nullptr);
#ifdef _WIN32
// Path limit remover, but also converts to a wide string at the same time.
bool GetWin32Path(std::wstring* dest, std::string_view str);

View File

@@ -27,7 +27,7 @@
</widget>
<widget class="QToolBar" name="toolBar">
<property name="contextMenuPolicy">
<enum>Qt::ContextMenuPolicy::PreventContextMenu</enum>
<enum>Qt::PreventContextMenu</enum>
</property>
<property name="movable">
<bool>false</bool>
@@ -39,7 +39,7 @@
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonStyle::ToolButtonTextBesideIcon</enum>
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="floatable">
<bool>false</bool>
@@ -59,7 +59,8 @@
</widget>
<action name="actionRun">
<property name="icon">
<iconset theme="play-line"/>
<iconset theme="play-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Run</string>
@@ -67,7 +68,8 @@
</action>
<action name="actionStepInto">
<property name="icon">
<iconset theme="debug-step-into-line"/>
<iconset theme="debug-step-into-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Step Into</string>
@@ -78,7 +80,8 @@
</action>
<action name="actionStepOver">
<property name="icon">
<iconset theme="debug-step-over-line"/>
<iconset theme="debug-step-over-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Step Over</string>
@@ -89,7 +92,8 @@
</action>
<action name="actionStepOut">
<property name="icon">
<iconset theme="debug-step-out-line"/>
<iconset theme="debug-step-out-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Step Out</string>
@@ -103,7 +107,8 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset theme="pin-filled"/>
<iconset theme="pin-filled">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Always On Top</string>
@@ -114,7 +119,8 @@
</action>
<action name="actionAnalyse">
<property name="icon">
<iconset theme="magnifier-line"/>
<iconset theme="restart-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Analyze</string>

View File

@@ -780,16 +780,11 @@ QColor DisassemblyWidget::GetAddressFunctionColor(u32 address)
};
}
// Use the address to pick the colour since the value of the handle may
// change from run to run.
ccc::Address function_address =
m_cpu->GetSymbolGuardian().FunctionOverlappingAddress(address).address;
if (!function_address.valid())
ccc::FunctionHandle handle = m_cpu->GetSymbolGuardian().FunctionOverlappingAddress(address).handle;
if (!handle.valid())
return palette().text().color();
// Chop off the first few bits of the address since functions will be
// aligned in memory.
return colors[(function_address.value >> 4) % colors.size()];
return colors[handle.value % colors.size()];
}
QString DisassemblyWidget::FetchSelectionInfo(SelectionInfo selInfo)

View File

@@ -31,7 +31,7 @@
<x>0</x>
<y>0</y>
<width>1050</width>
<height>27</height>
<height>22</height>
</rect>
</property>
<widget class="QMenu" name="menuSystem">
@@ -40,10 +40,11 @@
</property>
<widget class="QMenu" name="menuChangeDisc">
<property name="title">
<string>&amp;Change Disc</string>
<string>Change Disc</string>
</property>
<property name="icon">
<iconset theme="disc-eject-line"/>
<iconset theme="disc-eject-line">
<normaloff>.</normaloff>.</iconset>
</property>
<actiongroup name="actionGroupChangeDiscSubImages"/>
<addaction name="actionChangeDiscFromFile"/>
@@ -54,18 +55,20 @@
</widget>
<widget class="QMenu" name="menuLoadState">
<property name="title">
<string>&amp;Load State</string>
<string>Load State</string>
</property>
<property name="icon">
<iconset theme="floppy-out-line"/>
<iconset theme="floppy-out-line">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
<widget class="QMenu" name="menuSaveState">
<property name="title">
<string>Sa&amp;ve State</string>
<string>Save State</string>
</property>
<property name="icon">
<iconset theme="floppy-in-line"/>
<iconset theme="floppy-in-line">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
<addaction name="actionStartFile"/>
@@ -80,7 +83,6 @@
<addaction name="menuChangeDisc"/>
<addaction name="separator"/>
<addaction name="actionScreenshot"/>
<addaction name="actionVideoCapture"/>
<addaction name="separator"/>
<addaction name="menuLoadState"/>
<addaction name="menuSaveState"/>
@@ -90,7 +92,7 @@
</widget>
<widget class="QMenu" name="menuSettings">
<property name="title">
<string>Setti&amp;ngs</string>
<string>S&amp;ettings</string>
</property>
<addaction name="actionViewGameProperties"/>
<addaction name="separator"/>
@@ -130,10 +132,11 @@
</property>
<widget class="QMenu" name="menuDebugSwitchRenderer">
<property name="title">
<string>&amp;Switch Renderer</string>
<string>Switch Renderer</string>
</property>
<property name="icon">
<iconset theme="brush-line"/>
<iconset theme="brush-line">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
<addaction name="menuDebugSwitchRenderer"/>
@@ -155,7 +158,8 @@
<string>&amp;Window Size</string>
</property>
<property name="icon">
<iconset theme="window-2-line"/>
<iconset theme="window-2-line">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
<addaction name="actionViewToolbar"/>
@@ -181,10 +185,11 @@
</property>
<widget class="QMenu" name="menuInputRecording">
<property name="title">
<string>&amp;Input Recording</string>
<string>Input Recording</string>
</property>
<property name="icon">
<iconset theme="keyboard-line"/>
<iconset theme="keyboard-line">
<normaloff>.</normaloff>.</iconset>
</property>
<addaction name="actionInputRecNew"/>
<addaction name="actionInputRecPlay"/>
@@ -197,13 +202,14 @@
</widget>
<addaction name="actionOpenDataDirectory"/>
<addaction name="actionCoverDownloader"/>
<addaction name="actionToggleSoftwareRendering"/>
<addaction name="separator"/>
<addaction name="actionEditCheats"/>
<addaction name="actionEditPatches"/>
<addaction name="actionReloadPatches"/>
<addaction name="separator"/>
<addaction name="actionToggleSoftwareRendering"/>
<addaction name="menuInputRecording"/>
<addaction name="actionVideoCapture"/>
<addaction name="separator"/>
<addaction name="actionEnableSystemConsole"/>
<addaction name="actionEnableDebugConsole"/>
@@ -236,7 +242,7 @@
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonStyle::ToolButtonTextUnderIcon</enum>
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
@@ -268,7 +274,8 @@
<widget class="QStatusBar" name="statusBar"/>
<action name="actionStartFile">
<property name="icon">
<iconset theme="file-line"/>
<iconset theme="file-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Start &amp;File...</string>
@@ -276,7 +283,8 @@
</action>
<action name="actionToolbarStartFile">
<property name="icon">
<iconset theme="file-line"/>
<iconset theme="file-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string comment="In Toolbar">Start File</string>
@@ -284,15 +292,17 @@
</action>
<action name="actionStartDisc">
<property name="icon">
<iconset theme="disc-2-line"/>
<iconset theme="disc-2-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Start D&amp;isc...</string>
<string>Start &amp;Disc...</string>
</property>
</action>
<action name="actionToolbarStartDisc">
<property name="icon">
<iconset theme="disc-2-line"/>
<iconset theme="disc-2-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string comment="In Toolbar">Start Disc</string>
@@ -300,7 +310,8 @@
</action>
<action name="actionStartBios">
<property name="icon">
<iconset theme="chip-line"/>
<iconset theme="chip-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Start &amp;BIOS</string>
@@ -308,7 +319,8 @@
</action>
<action name="actionToolbarStartBios">
<property name="icon">
<iconset theme="chip-line"/>
<iconset theme="chip-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string comment="In Toolbar">Start BIOS</string>
@@ -316,7 +328,8 @@
</action>
<action name="actionScanForNewGames">
<property name="icon">
<iconset theme="file-search-line"/>
<iconset theme="file-search-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Scan For New Games</string>
@@ -324,7 +337,8 @@
</action>
<action name="actionRescanAllGames">
<property name="icon">
<iconset theme="refresh-line"/>
<iconset theme="refresh-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Rescan All Games</string>
@@ -332,7 +346,8 @@
</action>
<action name="actionPowerOff">
<property name="icon">
<iconset theme="shut-down-line"/>
<iconset theme="shut-down-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Shut &amp;Down</string>
@@ -340,7 +355,8 @@
</action>
<action name="actionToolbarPowerOff">
<property name="icon">
<iconset theme="shut-down-line"/>
<iconset theme="shut-down-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string comment="In Toolbar">Shut Down</string>
@@ -348,7 +364,8 @@
</action>
<action name="actionPowerOffWithoutSaving">
<property name="icon">
<iconset theme="close-line"/>
<iconset theme="close-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Shut Down &amp;Without Saving</string>
@@ -356,7 +373,8 @@
</action>
<action name="actionReset">
<property name="icon">
<iconset theme="restart-line"/>
<iconset theme="restart-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Reset</string>
@@ -364,7 +382,8 @@
</action>
<action name="actionToolbarReset">
<property name="icon">
<iconset theme="restart-line"/>
<iconset theme="restart-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string comment="In Toolbar">Reset</string>
@@ -375,7 +394,8 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset theme="pause-line"/>
<iconset theme="pause-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Pause</string>
@@ -386,7 +406,8 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset theme="pause-line"/>
<iconset theme="pause-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string comment="In Toolbar">Pause</string>
@@ -394,7 +415,8 @@
</action>
<action name="actionToolbarLoadState">
<property name="icon">
<iconset theme="floppy-out-line"/>
<iconset theme="floppy-out-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string comment="In Toolbar">Load State</string>
@@ -402,7 +424,8 @@
</action>
<action name="actionToolbarSaveState">
<property name="icon">
<iconset theme="floppy-in-line"/>
<iconset theme="floppy-in-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string comment="In Toolbar">Save State</string>
@@ -410,7 +433,8 @@
</action>
<action name="actionExit">
<property name="icon">
<iconset theme="door-open-line"/>
<iconset theme="door-open-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>E&amp;xit</string>
@@ -418,7 +442,8 @@
</action>
<action name="actionBIOSSettings">
<property name="icon">
<iconset theme="chip-line"/>
<iconset theme="chip-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;BIOS</string>
@@ -426,15 +451,17 @@
</action>
<action name="actionEmulationSettings">
<property name="icon">
<iconset theme="emulation-line"/>
<iconset theme="emulation-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Emulation</string>
<string>Emulation</string>
</property>
</action>
<action name="actionControllerSettings">
<property name="icon">
<iconset theme="controller-line"/>
<iconset theme="controller-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Controllers</string>
@@ -442,7 +469,8 @@
</action>
<action name="actionToolbarControllerSettings">
<property name="icon">
<iconset theme="controller-line"/>
<iconset theme="controller-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string comment="In Toolbar">Controllers</string>
@@ -450,7 +478,8 @@
</action>
<action name="actionHotkeySettings">
<property name="icon">
<iconset theme="keyboard-line"/>
<iconset theme="keyboard-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Hotkeys</string>
@@ -458,7 +487,8 @@
</action>
<action name="actionGraphicsSettings">
<property name="icon">
<iconset theme="image-fill"/>
<iconset theme="image-fill">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Graphics</string>
@@ -466,10 +496,11 @@
</action>
<action name="actionAchievementSettings">
<property name="icon">
<iconset theme="trophy-line"/>
<iconset theme="trophy-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Achie&amp;vements</string>
<string>A&amp;chievements</string>
</property>
</action>
<action name="actionPostProcessingSettings">
@@ -479,15 +510,17 @@
</action>
<action name="actionFullscreen">
<property name="icon">
<iconset theme="fullscreen-line"/>
<iconset theme="fullscreen-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Fullscreen</string>
<string>Fullscreen</string>
</property>
</action>
<action name="actionToolbarFullscreen">
<property name="icon">
<iconset theme="fullscreen-line"/>
<iconset theme="fullscreen-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string comment="In Toolbar">Fullscreen</string>
@@ -500,7 +533,8 @@
</action>
<action name="actionGitHubRepository">
<property name="icon">
<iconset theme="github"/>
<iconset theme="github">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;GitHub Repository...</string>
@@ -508,7 +542,8 @@
</action>
<action name="actionSupportForums">
<property name="icon">
<iconset theme="at"/>
<iconset theme="at">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Support &amp;Forums...</string>
@@ -516,7 +551,8 @@
</action>
<action name="actionDiscordServer">
<property name="icon">
<iconset theme="discord"/>
<iconset theme="discord">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Discord Server...</string>
@@ -524,7 +560,8 @@
</action>
<action name="actionCheckForUpdates">
<property name="icon">
<iconset theme="download-2-line"/>
<iconset theme="download-2-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Check for &amp;Updates...</string>
@@ -550,7 +587,8 @@
</action>
<action name="actionToolbarChangeDisc">
<property name="icon">
<iconset theme="disc-eject-line"/>
<iconset theme="disc-eject-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string comment="In Toolbar">Change Disc...</string>
@@ -558,7 +596,8 @@
</action>
<action name="actionAudioSettings">
<property name="icon">
<iconset theme="volume-up-line"/>
<iconset theme="volume-up-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Audio</string>
@@ -566,68 +605,73 @@
</action>
<action name="actionGameListSettings">
<property name="icon">
<iconset theme="folder-open-line"/>
<iconset theme="folder-open-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Game &amp;List</string>
<string>Game List</string>
</property>
</action>
<action name="actionInterfaceSettings">
<property name="icon">
<iconset theme="interface-line"/>
<iconset theme="interface-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Interface</string>
<string>Interface</string>
</property>
</action>
<action name="actionAddGameDirectory">
<property name="icon">
<iconset theme="folder-add-line"/>
<iconset theme="folder-add-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Add Game &amp;Directory...</string>
<string>Add Game Directory...</string>
</property>
</action>
<action name="actionSettings">
<property name="icon">
<iconset theme="settings-3-line"/>
<iconset theme="settings-3-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>S&amp;ettings</string>
<string>&amp;Settings</string>
</property>
<property name="menuRole">
<enum>QAction::MenuRole::PreferencesRole</enum>
<enum>QAction::PreferencesRole</enum>
</property>
</action>
<action name="actionToolbarSettings">
<property name="icon">
<iconset theme="settings-3-line"/>
<iconset theme="settings-3-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string comment="In Toolbar">Settings</string>
</property>
<property name="menuRole">
<enum>QAction::MenuRole::PreferencesRole</enum>
<enum>QAction::PreferencesRole</enum>
</property>
</action>
<action name="actionChangeDiscFromFile">
<property name="text">
<string>&amp;From File...</string>
<string>From File...</string>
</property>
</action>
<action name="actionChangeDiscFromDevice">
<property name="text">
<string>From &amp;Device...</string>
<string>From Device...</string>
</property>
</action>
<action name="actionChangeDiscFromGameList">
<property name="text">
<string>From &amp;Game List...</string>
<string>From Game List...</string>
</property>
</action>
<action name="actionRemoveDisc">
<property name="text">
<string>&amp;Remove Disc</string>
<string>Remove Disc</string>
</property>
</action>
<action name="actionGlobal_State">
@@ -637,7 +681,8 @@
</action>
<action name="actionScreenshot">
<property name="icon">
<iconset theme="screenshot-2-line"/>
<iconset theme="screenshot-2-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Screenshot</string>
@@ -645,7 +690,8 @@
</action>
<action name="actionToolbarScreenshot">
<property name="icon">
<iconset theme="screenshot-2-line"/>
<iconset theme="screenshot-2-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string comment="In Toolbar">Screenshot</string>
@@ -653,7 +699,8 @@
</action>
<action name="actionMemoryCardSettings">
<property name="icon">
<iconset theme="memcard-line"/>
<iconset theme="memcard-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Memory Cards</string>
@@ -661,7 +708,8 @@
</action>
<action name="actionDEV9Settings">
<property name="icon">
<iconset theme="global-line"/>
<iconset theme="global-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Network &amp;&amp; HDD</string>
@@ -669,7 +717,8 @@
</action>
<action name="actionFolderSettings">
<property name="icon">
<iconset theme="folder-settings-line"/>
<iconset theme="folder-settings-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Folders</string>
@@ -694,7 +743,7 @@
<bool>false</bool>
</property>
<property name="text">
<string>Loc&amp;k Toolbar</string>
<string>Lock Toolbar</string>
</property>
</action>
<action name="actionViewStatusBar">
@@ -716,12 +765,13 @@
<bool>true</bool>
</property>
<property name="text">
<string>&amp;Verbose Status</string>
<string>Verbose Status</string>
</property>
</action>
<action name="actionViewGameList">
<property name="icon">
<iconset theme="list-check"/>
<iconset theme="list-check">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Game &amp;List</string>
@@ -732,7 +782,8 @@
<bool>false</bool>
</property>
<property name="icon">
<iconset theme="tv-2-line"/>
<iconset theme="tv-2-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string extracomment="This grayed-out at first option will become available while there is a game emulated and the game list is displayed over the actual emulation, to let users display the system emulation once more.">System &amp;Display</string>
@@ -743,7 +794,8 @@
<bool>false</bool>
</property>
<property name="icon">
<iconset theme="file-settings-line"/>
<iconset theme="file-settings-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Game &amp;Properties</string>
@@ -751,7 +803,8 @@
</action>
<action name="actionViewGameGrid">
<property name="icon">
<iconset theme="function-line"/>
<iconset theme="function-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Game &amp;Grid</string>
@@ -764,16 +817,14 @@
<property name="checked">
<bool>true</bool>
</property>
<property name="icon">
<iconset theme="price-tag-3-line"/>
</property>
<property name="text">
<string>Show Titl&amp;es (Grid View)</string>
<string>Show Titles (Grid View)</string>
</property>
</action>
<action name="actionGridViewZoomIn">
<property name="icon">
<iconset theme="zoom-in-line"/>
<iconset theme="zoom-in-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Zoom &amp;In (Grid View)</string>
@@ -784,7 +835,8 @@
</action>
<action name="actionGridViewZoomOut">
<property name="icon">
<iconset theme="zoom-out-line"/>
<iconset theme="zoom-out-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Zoom &amp;Out (Grid View)</string>
@@ -795,7 +847,8 @@
</action>
<action name="actionGridViewRefreshCovers">
<property name="icon">
<iconset theme="refresh-line"/>
<iconset theme="refresh-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Refresh &amp;Covers (Grid View)</string>
@@ -803,7 +856,8 @@
</action>
<action name="actionOpen_Memory_Card_Directory">
<property name="icon">
<iconset theme="memcard-line"/>
<iconset theme="memcard-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Open Memory Card Directory...</string>
@@ -811,34 +865,38 @@
</action>
<action name="actionOpenDataDirectory">
<property name="icon">
<iconset theme="folder-open-line"/>
<iconset theme="folder-open-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Open Data Directory...</string>
<string>Open Data Directory...</string>
</property>
</action>
<action name="actionToggleSoftwareRendering">
<property name="icon">
<iconset theme="brush-line"/>
<iconset theme="brush-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Toggle Software Rendering</string>
<string>Toggle Software Rendering</string>
</property>
</action>
<action name="actionDebugger">
<property name="icon">
<iconset theme="heart-circle-line"/>
<iconset theme="heart-circle-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Open Debugger</string>
<string>Open Debugger</string>
</property>
</action>
<action name="actionReloadPatches">
<property name="icon">
<iconset theme="refresh-line"/>
<iconset theme="refresh-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Reload Cheats/Patches</string>
<string>Reload Cheats/Patches</string>
</property>
</action>
<action name="actionEnableSystemConsole">
@@ -846,7 +904,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>E&amp;nable System Console</string>
<string>Enable System Console</string>
</property>
</action>
<action name="actionEnableDebugConsole">
@@ -854,7 +912,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Enable &amp;Debug Console</string>
<string>Enable Debug Console</string>
</property>
</action>
<action name="actionEnableLogWindow">
@@ -862,7 +920,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Enable &amp;Log Window</string>
<string>Enable Log Window</string>
</property>
</action>
<action name="actionEnableVerboseLogging">
@@ -870,7 +928,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Enable &amp;Verbose Logging</string>
<string>Enable Verbose Logging</string>
</property>
</action>
<action name="actionEnableEEConsoleLogging">
@@ -878,7 +936,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Enable EE Console &amp;Logging</string>
<string>Enable EE Console Logging</string>
</property>
</action>
<action name="actionEnableIOPConsoleLogging">
@@ -886,15 +944,16 @@
<bool>true</bool>
</property>
<property name="text">
<string>Enable &amp;IOP Console Logging</string>
<string>Enable IOP Console Logging</string>
</property>
</action>
<action name="actionSaveGSDump">
<property name="icon">
<iconset theme="save-3-line"/>
<iconset theme="save-3-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Save Single Frame &amp;GS Dump</string>
<string>Save Single Frame GS Dump</string>
</property>
</action>
<action name="actionInputRecNew">
@@ -902,7 +961,7 @@
<bool>false</bool>
</property>
<property name="text">
<string extracomment="This section refers to the Input Recording submenu.">&amp;New</string>
<string extracomment="This section refers to the Input Recording submenu.">New</string>
</property>
</action>
<action name="actionInputRecPlay">
@@ -910,7 +969,7 @@
<bool>false</bool>
</property>
<property name="text">
<string extracomment="This section refers to the Input Recording submenu.">&amp;Play</string>
<string extracomment="This section refers to the Input Recording submenu.">Play</string>
</property>
</action>
<action name="actionInputRecStop">
@@ -918,7 +977,7 @@
<bool>false</bool>
</property>
<property name="text">
<string extracomment="This section refers to the Input Recording submenu.">&amp;Stop</string>
<string extracomment="This section refers to the Input Recording submenu.">Stop</string>
</property>
</action>
<action name="actionRecording_Console_Logs">
@@ -931,7 +990,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>&amp;Controller Logs</string>
<string>Controller Logs</string>
</property>
</action>
<action name="actionInputRecConsoleLogs">
@@ -939,7 +998,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>&amp;Input Recording Logs</string>
<string>Input Recording Logs</string>
</property>
</action>
<action name="actionEnableFileLogging">
@@ -955,7 +1014,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Enable &amp;CDVD Read Logging</string>
<string>Enable CDVD Read Logging</string>
</property>
</action>
<action name="actionSaveBlockDump">
@@ -963,7 +1022,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Save CDVD &amp;Block Dump</string>
<string>Save CDVD Block Dump</string>
</property>
</action>
<action name="actionEnableLogTimestamps">
@@ -971,20 +1030,22 @@
<bool>true</bool>
</property>
<property name="text">
<string>&amp;Enable Log Timestamps</string>
<string>Enable Log Timestamps</string>
</property>
</action>
<action name="actionStartFullscreenUI">
<property name="icon">
<iconset theme="tv-2-line"/>
<iconset theme="tv-2-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Start Big Picture &amp;Mode</string>
<string>Start Big Picture Mode</string>
</property>
</action>
<action name="actionToolbarStartFullscreenUI">
<property name="icon">
<iconset theme="tv-2-line"/>
<iconset theme="tv-2-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string comment="In Toolbar">Big Picture</string>
@@ -992,10 +1053,11 @@
</action>
<action name="actionCoverDownloader">
<property name="icon">
<iconset theme="artboard-2-line"/>
<iconset theme="artboard-2-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Cover Downloader...</string>
<string>Cover Downloader...</string>
</property>
</action>
<action name="actionShowAdvancedSettings">
@@ -1003,39 +1065,42 @@
<bool>true</bool>
</property>
<property name="text">
<string>&amp;Show Advanced Settings</string>
<string>Show Advanced Settings</string>
</property>
</action>
<action name="actionInputRecOpenViewer">
<property name="text">
<string>&amp;Recording Viewer</string>
<string>Recording Viewer</string>
</property>
</action>
<action name="actionVideoCapture">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset theme="camera-video"/>
</property>
<property name="text">
<string>&amp;Video Capture</string>
<string>Video Capture</string>
</property>
<property name="icon">
<iconset theme="camera-video">
<normaloff>.</normaloff>.</iconset>
</property>
</action>
<action name="actionEditCheats">
<property name="icon">
<iconset theme="pencil-line"/>
</property>
<property name="text">
<string>&amp;Edit Cheats...</string>
<string>Edit Cheats...</string>
</property>
<property name="icon">
<iconset theme="pencil-line">
<normaloff>.</normaloff>.</iconset>
</property>
</action>
<action name="actionEditPatches">
<property name="icon">
<iconset theme="pencil-line"/>
</property>
<property name="text">
<string>Edit &amp;Patches...</string>
<string>Edit Patches...</string>
</property>
<property name="icon">
<iconset theme="pencil-line">
<normaloff>.</normaloff>.</iconset>
</property>
</action>
</widget>

View File

@@ -998,7 +998,7 @@ void EmuThread::updatePerformanceMetrics(bool force)
QString gs_stat;
if (THREAD_VU1)
{
gs_stat = tr("Slot: %1 | Volume: %2% | %3 | EE: %4% | VU: %5% | GS: %6%")
gs_stat = tr("Slot: %1 | Volume: %2% | %3 |EE: %4% | VU: %5% | GS: %6%")
.arg(SaveStateSelectorUI::GetCurrentSlot())
.arg(SPU2::GetOutputVolume())
.arg(gs_stat_str.c_str())
@@ -1008,7 +1008,7 @@ void EmuThread::updatePerformanceMetrics(bool force)
}
else
{
gs_stat = tr("Slot: %1 | Volume: %2% | %3 | EE: %4% | GS: %5%")
gs_stat = tr("Slot: %1 | Volume: %2% | 3% | EE: %4% | GS: %5%")
.arg(SaveStateSelectorUI::GetCurrentSlot())
.arg(SPU2::GetOutputVolume())
.arg(gs_stat_str.c_str())

View File

@@ -4792,53 +4792,53 @@ Do you want to overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="65"/>
<location filename="../Debugger/DebuggerWindow.ui" line="66"/>
<location filename="../Debugger/DebuggerWindow.cpp" line="76"/>
<source>Run</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="73"/>
<location filename="../Debugger/DebuggerWindow.ui" line="75"/>
<source>Step Into</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="76"/>
<location filename="../Debugger/DebuggerWindow.ui" line="78"/>
<source>F11</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="84"/>
<location filename="../Debugger/DebuggerWindow.ui" line="87"/>
<source>Step Over</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="87"/>
<location filename="../Debugger/DebuggerWindow.ui" line="90"/>
<source>F10</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="95"/>
<location filename="../Debugger/DebuggerWindow.ui" line="99"/>
<source>Step Out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="98"/>
<location filename="../Debugger/DebuggerWindow.ui" line="102"/>
<source>Shift+F11</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="109"/>
<location filename="../Debugger/DebuggerWindow.ui" line="114"/>
<source>Always On Top</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="112"/>
<location filename="../Debugger/DebuggerWindow.ui" line="117"/>
<source>Show this window on top</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="120"/>
<location filename="../Debugger/DebuggerWindow.ui" line="126"/>
<source>Analyze</source>
<translation type="unfinished"></translation>
</message>
@@ -5036,7 +5036,7 @@ Do you want to overwrite?</source>
<name>EmuThread</name>
<message>
<location filename="../QtHost.cpp" line="1001"/>
<source>Slot: %1 | Volume: %2% | %3 | EE: %4% | VU: %5% | GS: %6%</source>
<source>Slot: %1 | Volume: %2% | %3 |EE: %4% | VU: %5% | GS: %6%</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -15422,586 +15422,566 @@ Right click to clear binding</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="43"/>
<location filename="../MainWindow.cpp" line="1406"/>
<location filename="../MainWindow.cpp" line="1467"/>
<source>Change Disc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="58"/>
<location filename="../MainWindow.cpp" line="2785"/>
<source>Load State</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="596"/>
<location filename="../MainWindow.ui" line="67"/>
<source>Save State</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="95"/>
<source>S&amp;ettings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="116"/>
<location filename="../MainWindow.ui" line="118"/>
<source>&amp;Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="129"/>
<location filename="../MainWindow.ui" line="131"/>
<source>&amp;Debug</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="151"/>
<location filename="../MainWindow.ui" line="135"/>
<source>Switch Renderer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="154"/>
<source>&amp;View</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="155"/>
<location filename="../MainWindow.ui" line="158"/>
<source>&amp;Window Size</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="180"/>
<location filename="../MainWindow.ui" line="184"/>
<source>&amp;Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="230"/>
<location filename="../MainWindow.ui" line="188"/>
<source>Input Recording</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="236"/>
<source>Toolbar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="274"/>
<location filename="../MainWindow.ui" line="281"/>
<source>Start &amp;File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="306"/>
<location filename="../MainWindow.ui" line="299"/>
<source>Start &amp;Disc...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="317"/>
<source>Start &amp;BIOS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="322"/>
<location filename="../MainWindow.ui" line="335"/>
<source>&amp;Scan For New Games</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="330"/>
<location filename="../MainWindow.ui" line="344"/>
<source>&amp;Rescan All Games</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="338"/>
<location filename="../MainWindow.ui" line="353"/>
<source>Shut &amp;Down</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="354"/>
<location filename="../MainWindow.ui" line="371"/>
<source>Shut Down &amp;Without Saving</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="362"/>
<location filename="../MainWindow.ui" line="380"/>
<source>&amp;Reset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="381"/>
<location filename="../MainWindow.ui" line="401"/>
<source>&amp;Pause</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="416"/>
<location filename="../MainWindow.ui" line="440"/>
<source>E&amp;xit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="424"/>
<location filename="../MainWindow.ui" line="449"/>
<source>&amp;BIOS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="440"/>
<location filename="../MainWindow.ui" line="458"/>
<source>Emulation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="467"/>
<source>&amp;Controllers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="456"/>
<location filename="../MainWindow.ui" line="485"/>
<source>&amp;Hotkeys</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="464"/>
<location filename="../MainWindow.ui" line="494"/>
<source>&amp;Graphics</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="477"/>
<location filename="../MainWindow.ui" line="503"/>
<source>A&amp;chievements</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="508"/>
<source>&amp;Post-Processing Settings...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="498"/>
<location filename="../MainWindow.ui" line="517"/>
<source>Fullscreen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="531"/>
<source>Resolution Scale</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="506"/>
<location filename="../MainWindow.ui" line="540"/>
<source>&amp;GitHub Repository...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="514"/>
<location filename="../MainWindow.ui" line="549"/>
<source>Support &amp;Forums...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="522"/>
<location filename="../MainWindow.ui" line="558"/>
<source>&amp;Discord Server...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="530"/>
<location filename="../MainWindow.ui" line="567"/>
<source>Check for &amp;Updates...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="539"/>
<location filename="../MainWindow.ui" line="576"/>
<source>About &amp;Qt...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="548"/>
<location filename="../MainWindow.ui" line="585"/>
<source>&amp;About PCSX2...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="493"/>
<location filename="../MainWindow.ui" line="526"/>
<source>Fullscreen</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="556"/>
<location filename="../MainWindow.ui" line="594"/>
<source>Change Disc...</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="564"/>
<location filename="../MainWindow.ui" line="603"/>
<source>&amp;Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="635"/>
<location filename="../MainWindow.ui" line="612"/>
<source>Game List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="621"/>
<source>Interface</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="630"/>
<source>Add Game Directory...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="639"/>
<source>&amp;Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="659"/>
<source>From File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="664"/>
<source>From Device...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="669"/>
<source>From Game List...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="674"/>
<source>Remove Disc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="679"/>
<source>Global State</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="643"/>
<location filename="../MainWindow.ui" line="688"/>
<source>&amp;Screenshot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="282"/>
<location filename="../MainWindow.ui" line="290"/>
<source>Start File</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="43"/>
<source>&amp;Change Disc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="57"/>
<source>&amp;Load State</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="65"/>
<source>Sa&amp;ve State</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="93"/>
<source>Setti&amp;ngs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="133"/>
<source>&amp;Switch Renderer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="184"/>
<source>&amp;Input Recording</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="290"/>
<source>Start D&amp;isc...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="298"/>
<location filename="../MainWindow.ui" line="308"/>
<source>Start Disc</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="314"/>
<location filename="../MainWindow.ui" line="326"/>
<source>Start BIOS</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="346"/>
<location filename="../MainWindow.ui" line="362"/>
<source>Shut Down</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="370"/>
<location filename="../MainWindow.ui" line="389"/>
<source>Reset</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="392"/>
<location filename="../MainWindow.ui" line="413"/>
<source>Pause</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="400"/>
<location filename="../MainWindow.ui" line="422"/>
<source>Load State</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="408"/>
<location filename="../MainWindow.ui" line="431"/>
<source>Save State</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="432"/>
<source>&amp;Emulation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="448"/>
<location filename="../MainWindow.ui" line="476"/>
<source>Controllers</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="472"/>
<source>Achie&amp;vements</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="485"/>
<source>&amp;Fullscreen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="580"/>
<source>&amp;Interface</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="588"/>
<source>Add Game &amp;Directory...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="607"/>
<location filename="../MainWindow.ui" line="651"/>
<source>Settings</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="615"/>
<source>&amp;From File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="620"/>
<source>From &amp;Device...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="625"/>
<source>From &amp;Game List...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="630"/>
<source>&amp;Remove Disc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="651"/>
<location filename="../MainWindow.ui" line="697"/>
<source>Screenshot</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="659"/>
<location filename="../MainWindow.ui" line="706"/>
<source>&amp;Memory Cards</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="667"/>
<location filename="../MainWindow.ui" line="715"/>
<source>&amp;Network &amp;&amp; HDD</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="675"/>
<location filename="../MainWindow.ui" line="724"/>
<source>&amp;Folders</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="686"/>
<location filename="../MainWindow.ui" line="735"/>
<source>&amp;Toolbar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="771"/>
<source>Show Titl&amp;es (Grid View)</source>
<location filename="../MainWindow.ui" line="746"/>
<source>Lock Toolbar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="817"/>
<source>&amp;Open Data Directory...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="825"/>
<source>&amp;Toggle Software Rendering</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="833"/>
<source>&amp;Open Debugger</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="841"/>
<source>&amp;Reload Cheats/Patches</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="849"/>
<source>E&amp;nable System Console</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="857"/>
<source>Enable &amp;Debug Console</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="865"/>
<source>Enable &amp;Log Window</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="873"/>
<source>Enable &amp;Verbose Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="881"/>
<source>Enable EE Console &amp;Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="889"/>
<source>Enable &amp;IOP Console Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="897"/>
<source>Save Single Frame &amp;GS Dump</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="905"/>
<source>&amp;New</source>
<extracomment>This section refers to the Input Recording submenu.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="913"/>
<source>&amp;Play</source>
<extracomment>This section refers to the Input Recording submenu.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="921"/>
<source>&amp;Stop</source>
<extracomment>This section refers to the Input Recording submenu.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="934"/>
<source>&amp;Controller Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="942"/>
<source>&amp;Input Recording Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="958"/>
<source>Enable &amp;CDVD Read Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="966"/>
<source>Save CDVD &amp;Block Dump</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="974"/>
<source>&amp;Enable Log Timestamps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="982"/>
<source>Start Big Picture &amp;Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="998"/>
<source>&amp;Cover Downloader...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1006"/>
<source>&amp;Show Advanced Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1011"/>
<source>&amp;Recording Viewer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1022"/>
<source>&amp;Video Capture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1030"/>
<source>&amp;Edit Cheats...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1038"/>
<source>Edit &amp;Patches...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="708"/>
<location filename="../MainWindow.ui" line="757"/>
<source>&amp;Status Bar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="572"/>
<location filename="../MainWindow.ui" line="727"/>
<location filename="../MainWindow.ui" line="768"/>
<source>Verbose Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="777"/>
<source>Game &amp;List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="697"/>
<source>Loc&amp;k Toolbar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="719"/>
<source>&amp;Verbose Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="738"/>
<location filename="../MainWindow.ui" line="789"/>
<source>System &amp;Display</source>
<extracomment>This grayed-out at first option will become available while there is a game emulated and the game list is displayed over the actual emulation, to let users display the system emulation once more.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="749"/>
<location filename="../MainWindow.ui" line="801"/>
<source>Game &amp;Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="757"/>
<location filename="../MainWindow.ui" line="810"/>
<source>Game &amp;Grid</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="779"/>
<location filename="../MainWindow.ui" line="821"/>
<source>Show Titles (Grid View)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="830"/>
<source>Zoom &amp;In (Grid View)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="782"/>
<location filename="../MainWindow.ui" line="833"/>
<source>Ctrl++</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="790"/>
<location filename="../MainWindow.ui" line="842"/>
<source>Zoom &amp;Out (Grid View)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="793"/>
<location filename="../MainWindow.ui" line="845"/>
<source>Ctrl+-</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="801"/>
<location filename="../MainWindow.ui" line="854"/>
<source>Refresh &amp;Covers (Grid View)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="809"/>
<location filename="../MainWindow.ui" line="863"/>
<source>Open Memory Card Directory...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="926"/>
<location filename="../MainWindow.ui" line="872"/>
<source>Open Data Directory...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="881"/>
<source>Toggle Software Rendering</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="890"/>
<source>Open Debugger</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="899"/>
<source>Reload Cheats/Patches</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="907"/>
<source>Enable System Console</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="915"/>
<source>Enable Debug Console</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="923"/>
<source>Enable Log Window</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="931"/>
<source>Enable Verbose Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="939"/>
<source>Enable EE Console Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="947"/>
<source>Enable IOP Console Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="956"/>
<source>Save Single Frame GS Dump</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="964"/>
<source>New</source>
<extracomment>This section refers to the Input Recording submenu.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="972"/>
<source>Play</source>
<extracomment>This section refers to the Input Recording submenu.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="980"/>
<source>Stop</source>
<extracomment>This section refers to the Input Recording submenu.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="985"/>
<location filename="../MainWindow.ui" line="1001"/>
<source>Input Recording Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="950"/>
<location filename="../MainWindow.ui" line="993"/>
<source>Controller Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1009"/>
<source>Enable &amp;File Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1017"/>
<source>Enable CDVD Read Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1025"/>
<source>Save CDVD Block Dump</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1033"/>
<source>Enable Log Timestamps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1042"/>
<location filename="../MainWindow.cpp" line="1510"/>
<source>Start Big Picture Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="990"/>
<location filename="../MainWindow.ui" line="1051"/>
<location filename="../MainWindow.cpp" line="1511"/>
<source>Big Picture</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1060"/>
<source>Cover Downloader...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1068"/>
<location filename="../MainWindow.cpp" line="673"/>
<source>Show Advanced Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1073"/>
<source>Recording Viewer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1081"/>
<location filename="../MainWindow.cpp" line="742"/>
<source>Video Capture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1090"/>
<source>Edit Cheats...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1099"/>
<source>Edit Patches...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="251"/>
<source>Internal Resolution</source>
@@ -18470,7 +18450,7 @@ Ejecting {3} and replacing it with {2}.</source>
<context>
<name>SaveState</name>
<message>
<location filename="../../pcsx2/SaveState.cpp" line="1098"/>
<location filename="../../pcsx2/SaveState.cpp" line="1095"/>
<source>This save state is outdated and is no longer compatible with the current version of PCSX2.
If you have any unsaved progress on this save state, you can download the compatible version (PCSX2 {}) from pcsx2.net, load the save state, and save your progress to the memory card.</source>

View File

@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg
fill="#FFFFFF"
width="800px"
height="800px"
viewBox="0 0 512 512"
version="1.1"
id="svg1"
sodipodi:docname="magnifier-line.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="true"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.005"
inkscape:cx="250.24876"
inkscape:cy="399.50249"
inkscape:window-width="1920"
inkscape:window-height="1008"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"
id="path1"
style="fill:#000000" />
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,40 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg
fill="#FFFFFF"
width="800px"
height="800px"
viewBox="0 0 512 512"
version="1.1"
id="svg1"
sodipodi:docname="search2.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="true"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.005"
inkscape:cx="250.24876"
inkscape:cy="399.50249"
inkscape:window-width="1920"
inkscape:window-height="1008"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"
id="path1" />
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -63,7 +63,6 @@
<file>icons/black/svg/lightbulb-line.svg</file>
<file>icons/black/svg/list-check.svg</file>
<file>icons/black/svg/login-box-line.svg</file>
<file>icons/black/svg/magnifier-line.svg</file>
<file>icons/black/svg/memcard-line.svg</file>
<file>icons/black/svg/mic-line.svg</file>
<file>icons/black/svg/minus-line.svg</file>
@@ -167,7 +166,6 @@
<file>icons/white/svg/lightbulb-line.svg</file>
<file>icons/white/svg/list-check.svg</file>
<file>icons/white/svg/login-box-line.svg</file>
<file>icons/white/svg/magnifier-line.svg</file>
<file>icons/white/svg/memcard-line.svg</file>
<file>icons/white/svg/mic-line.svg</file>
<file>icons/white/svg/minus-line.svg</file>

View File

@@ -2008,7 +2008,7 @@ void Achievements::DrawGameOverlays()
s_active_progress_indicator.reset();
}
position.y -= image_size.y + padding * 3.0f;
position.y -= image_size.y - padding * 3.0f;
}
if (!s_active_leaderboard_trackers.empty())
@@ -2058,7 +2058,7 @@ void Achievements::DrawGameOverlays()
}
// Uncomment if there are any other overlays above this one.
//position.y -= image_size.y + padding * 3.0f;
//position.y -= image_size.y - padding * 3.0f;
}
}

View File

@@ -66,6 +66,14 @@ struct cdvdTN
u8 etrack; //number of the last track
};
struct toc_entry
{
u32 lba;
u8 track;
u8 adr : 4;
u8 control : 4;
};
// SpindleCtrl Masks
#define CDVD_SPINDLE_SPEED 0x7 // Speed ranges from 0-3 (1, 2, 3, 4x for DVD) and 0-5 (1, 2, 4, 12, 24x for CD)
#define CDVD_SPINDLE_NOMINAL 0x40 // Changes the speed to be constant (CLV) based on current speed

View File

@@ -21,14 +21,6 @@ class Error;
extern int curDiskType;
extern int curTrayStatus;
struct toc_entry
{
u32 lba;
u8 track;
u8 adr : 4;
u8 control : 4;
};
class IOCtlSrc
{
IOCtlSrc(const IOCtlSrc&) = delete;

View File

@@ -18,6 +18,44 @@ static int pmode, cdtype;
static s32 layer1start = -1;
static bool layer1searched = false;
static void ISOParseTOC()
{
tracks.fill(cdvdTrack{});
if (iso.GetType() != ISOTYPE_AUDIO)
{
strack = 1;
etrack = 1;
return;
}
strack = 0xFF;
etrack = 0;
// Audio CD
for (const auto& entry : iso.ReadTOC())
{
const u8 track = entry.track;
if (track < 1 || track >= tracks.size())
{
Console.Warning("CDVD: Invalid track index %u, ignoring\n", track);
continue;
}
strack = std::min(strack, track);
etrack = std::max(etrack, track);
tracks[track].start_lba = entry.lba;
if ((entry.control & 0x0C) == 0x04)
{
Console.Warning("CDVD: Unsupported data track reading. Assuming MODE1?\n");
tracks[track].type = CDVD_MODE1_TRACK;
}
else
{
tracks[track].type = CDVD_AUDIO_TRACK;
}
}
}
static void ISOclose()
{
iso.Close();
@@ -49,6 +87,8 @@ static bool ISOopen(std::string filename, Error* error)
break;
}
ISOParseTOC();
layer1start = -1;
layer1searched = false;
@@ -60,34 +100,56 @@ static bool ISOprecache(ProgressCallback* progress, Error* error)
return iso.Precache(progress, error);
}
static void lsn_to_msf(u8* minute, u8* second, u8* frame, u32 lsn)
{
*frame = itob(lsn % 75);
lsn /= 75;
*second = itob(lsn % 60);
lsn /= 60;
*minute = itob(lsn % 100);
}
static s32 ISOreadSubQ(u32 lsn, cdvdSubQ* subq)
{
// fake it
u8 min, sec, frm;
subq->ctrl = 4;
subq->adr = 1;
subq->trackNum = itob(1);
subq->trackIndex = itob(1);
lba_to_msf(lsn, &min, &sec, &frm);
subq->trackM = itob(min);
subq->trackS = itob(sec);
subq->trackF = itob(frm);
memset(subq, 0, sizeof(cdvdSubQ));
subq->pad = 0;
lsn_to_msf(&subq->discM, &subq->discS, &subq->discF, lsn + 150);
lba_to_msf(lsn + (2 * 75), &min, &sec, &frm);
subq->discM = itob(min);
subq->discS = itob(sec);
subq->discF = itob(frm);
// FIXME: Verify this is correct for ISOTYPE_CD :S
if (iso.GetType() != ISOTYPE_AUDIO && iso.GetType() != ISOTYPE_CD)
{
subq->ctrl = 4;
subq->adr = 1;
subq->trackNum = itob(1);
subq->trackIndex = itob(1);
}
else
{
u8 i = strack;
while (i < etrack && lsn >= tracks[i + 1].start_lba)
++i;
lsn -= tracks[i].start_lba;
subq->ctrl = 1;
subq->adr = 1;
subq->trackNum = i;
subq->trackIndex = 1; // FIXME ???
}
lsn_to_msf(&subq->trackM, &subq->trackS, &subq->trackF, lsn);
Console.Warning("CDVD: SubQ M %02x S %02x F %02x\n", subq->trackM, subq->trackS, subq->trackF);
return 0;
}
static s32 ISOgetTN(cdvdTN* Buffer)
{
Buffer->strack = 1;
Buffer->etrack = 1;
Buffer->strack = strack;
Buffer->etrack = etrack;
return 0;
}
@@ -97,13 +159,15 @@ static s32 ISOgetTD(u8 Track, cdvdTD* Buffer)
if (Track == 0)
{
Buffer->lsn = iso.GetBlockCount();
Buffer->type = 0;
return 0;
}
else
{
Buffer->type = CDVD_MODE1_TRACK;
Buffer->lsn = 0;
}
if (Track < strack || Track > etrack)
return -1;
Buffer->lsn = tracks[Track].start_lba;
Buffer->type = tracks[Track].type;
return 0;
}
@@ -299,11 +363,12 @@ static s32 ISOgetTOC(void* toc)
{
err = ISOgetTD(i, &trackInfo);
lba_to_msf(trackInfo.lsn, &min, &sec, &frm);
tocBuff[i * 10 + 30] = trackInfo.type;
tocBuff[i * 10 + 32] = err == -1 ? 0 : itob(i); //number
tocBuff[i * 10 + 37] = itob(min);
tocBuff[i * 10 + 38] = itob(sec);
tocBuff[i * 10 + 39] = itob(frm);
const u8 tocIndex = i - diskInfo.strack;
tocBuff[tocIndex * 10 + 30] = trackInfo.type;
tocBuff[tocIndex * 10 + 32] = err == -1 ? 0 : itob(i); //number
tocBuff[tocIndex * 10 + 37] = itob(min);
tocBuff[tocIndex * 10 + 38] = itob(sec);
tocBuff[tocIndex * 10 + 39] = itob(frm);
}
}
else

View File

@@ -176,8 +176,9 @@ bool ChdFileReader::Open2(std::string filename, Error* error)
// The file size in the header is incorrect, each track gets padded to a multiple of 4 frames.
// (see chdman.cpp from MAME). Instead, we pull the real frame count from the TOC.
std::vector<toc_entry> entries;
u64 total_frames;
if (ParseTOC(&total_frames))
if (ParseTOC(&total_frames, entries))
{
file_size = total_frames * static_cast<u64>(chd_header->unitbytes);
}
@@ -216,6 +217,21 @@ bool ChdFileReader::Precache2(ProgressCallback* progress, Error* error)
return true;
}
std::vector<toc_entry> ChdFileReader::ReadTOC()
{
u64 total_frames;
std::vector<toc_entry> entries;
if (ParseTOC(&total_frames, entries))
{
return entries;
}
else
{
Console.Warning("Failed to parse CHD TOC, file size may be incorrect.");
return {};
}
}
ThreadedFileReader::Chunk ChdFileReader::ChunkForOffset(u64 offset)
{
Chunk chunk = {0};
@@ -261,11 +277,11 @@ u32 ChdFileReader::GetBlockCount() const
return (file_size - m_dataoffset) / m_internalBlockSize;
}
bool ChdFileReader::ParseTOC(u64* out_frame_count)
bool ChdFileReader::ParseTOC(u64* out_frame_count, std::vector<toc_entry>& entries)
{
u64 total_frames = 0;
int max_found_track = -1;
u64 total_gap_frames = 0;
for (int search_index = 0;; search_index++)
{
char metadata_str[256];
@@ -305,17 +321,28 @@ bool ChdFileReader::ParseTOC(u64* out_frame_count)
}
}
DevCon.WriteLn(fmt::format("CHD Track {}: frames:{} pregap:{} postgap:{} type:{} sub:{} pgtype:{} pgsub:{}",
Console.WriteLn(fmt::format("CHD Track {}: frames:{} pregap:{} postgap:{} type:{} sub:{} pgtype:{} pgsub:{}",
track_num, frames, pregap_frames, postgap_frames, type_str, subtype_str, pgtype_str, pgsub_str));
// PCSX2 doesn't currently support multiple tracks for CDs.
if (track_num != 1)
if (track_num != 0)
{
Console.Warning(fmt::format(" Ignoring track {} in CHD.", track_num, frames));
continue;
toc_entry entry{};
entry.lba = static_cast<u32>(total_frames) - total_gap_frames;
entry.track = static_cast<u8>(track_num);
entry.adr = 1;
entry.control = 0;
//FIXME: DATA track?
if (strncmp(type_str, "AUDIO", 5) != 0)
entry.control |= 0x04;
entries.push_back(entry);
}
total_frames += static_cast<u64>(pregap_frames) + static_cast<u64>(frames) + static_cast<u64>(postgap_frames);
// I have not found a CHD with an audio track with a postgap, consider that untested
total_gap_frames += static_cast<u64>(pregap_frames) + static_cast<u64>(postgap_frames);
total_frames += total_gap_frames + static_cast<u64>(frames);
max_found_track = std::max(max_found_track, track_num);
}

View File

@@ -19,6 +19,8 @@ public:
bool Precache2(ProgressCallback* progress, Error* error) override;
std::vector<toc_entry> ReadTOC() override;
Chunk ChunkForOffset(u64 offset) override;
int ReadChunk(void* dst, s64 blockID) override;
@@ -26,7 +28,7 @@ public:
uint GetBlockCount(void) const override;
private:
bool ParseTOC(u64* out_frame_count);
bool ParseTOC(u64* out_frame_count, std::vector<toc_entry>& entries);
chd_file* ChdFile = nullptr;
u64 file_size = 0;

View File

@@ -160,9 +160,31 @@ int InputIsoFile::FinishRead3(u8* dst, uint mode)
dst[diff - 9] = 2;
}
// Seems like CHD data ends up being the wrong endianess for audio
// Confidence is about 50% on this one, but it seems to work
// (CHD is the only file with a TOC anyways, so who cares about the other formats)
if (m_type == ISOTYPE_AUDIO && mode == CDVD_MODE_2352)
{
for (int i = 0; i < 2352; i += 2)
{
std::swap(dst[diff + i], dst[diff + i + 1]);
}
}
return 0;
}
std::vector<toc_entry> InputIsoFile::ReadTOC() const
{
std::vector<toc_entry> toc;
if (m_type == ISOTYPE_ILLEGAL)
return toc;
toc = m_reader->ReadTOC();
return toc;
}
InputIsoFile::InputIsoFile()
{
_init();
@@ -271,7 +293,7 @@ bool InputIsoFile::tryIsoType(u32 size, u32 offset, u32 blockofs)
// Returns true if the image is valid/known/supported, or false if not (type == ISOTYPE_ILLEGAL).
bool InputIsoFile::Detect(bool readType)
{
m_type = ISOTYPE_ILLEGAL;
m_type = ISOTYPE_ILLEGAL;
// First sanity check: no sane CD image has less than 16 sectors, since that's what
// we need simply to contain a TOC. So if the file size is not large enough to

View File

@@ -3,6 +3,7 @@
#pragma once
#include "CDVDcommon.h"
#include "CDVD/CDVD.h"
#include "CDVD/ThreadedFileReader.h"
#include <memory>
@@ -75,6 +76,8 @@ public:
void BeginRead2(uint lsn);
int FinishRead3(u8* dest, uint mode);
std::vector<toc_entry> ReadTOC() const;
protected:
void _init();

View File

@@ -264,6 +264,12 @@ bool ThreadedFileReader::Precache2(ProgressCallback* progress, Error* error)
return false;
}
std::vector<toc_entry> ThreadedFileReader::ReadTOC()
{
return {};
}
bool ThreadedFileReader::CheckAvailableMemoryForPrecaching(u64 required_size, Error* error)
{
// Don't allow precaching to use more than 50% of system memory.

View File

@@ -4,6 +4,7 @@
#pragma once
#include "common/Pcsx2Defs.h"
#include "CDVDcommon.h"
#include <thread>
#include <mutex>
@@ -117,6 +118,7 @@ public:
bool Open(std::string filename, Error* error);
bool Precache(ProgressCallback* progress, Error* error);
virtual std::vector<toc_entry> ReadTOC();
int ReadSync(void* pBuffer, u32 sector, u32 count);
void BeginRead(void* pBuffer, u32 sector, u32 count);
int FinishRead();

View File

@@ -384,8 +384,7 @@ std::vector<IP_Address> AdapterUtils::GetGateways(const Adapter* adapter)
if (ReadAddressFamily(address->Address.lpSockaddr) == AF_INET)
{
const sockaddr_in* sockaddr = reinterpret_cast<sockaddr_in*>(address->Address.lpSockaddr);
if (sockaddr->sin_addr.S_un.S_addr != 0)
collection.push_back(std::bit_cast<IP_Address>(sockaddr->sin_addr));
collection.push_back(std::bit_cast<IP_Address>(sockaddr->sin_addr));
}
address = address->Next;
}

View File

@@ -4,7 +4,6 @@
#include "IP_Packet.h"
#include "DEV9/PacketReader/NetLib.h"
#include "common/BitUtils.h"
#include "common/Console.h"
namespace PacketReader::IP
@@ -18,7 +17,7 @@ namespace PacketReader::IP
{
return (dscp >> 2) & 0x3F;
}
void IP_Packet::SetDscpValue(u8 value)
void IP_Packet::GetDscpValue(u8 value)
{
dscp = (dscp & ~(0x3F << 2)) | ((value & 0x3F) << 2);
}
@@ -210,8 +209,8 @@ namespace PacketReader::IP
for (size_t i = 0; i < options.size(); i++)
opOffset += options[i]->GetLength();
//needs to be a whole number of 32bits
headerLength = Common::AlignUpPow2(opOffset, 4);
opOffset += opOffset % 4; //needs to be a whole number of 32bits
headerLength = opOffset;
}
void IP_Packet::CalculateChecksum()

View File

@@ -86,7 +86,7 @@ namespace PacketReader::IP
* bit0: Set to zero
*/
u8 GetDscpValue();
void SetDscpValue(u8 value);
void GetDscpValue(u8 value);
/* 2 bits
* In TOS, defined as follows

View File

@@ -4,7 +4,6 @@
#include "TCP_Packet.h"
#include "DEV9/PacketReader/NetLib.h"
#include "common/BitUtils.h"
#include "common/Console.h"
namespace PacketReader::IP::TCP
@@ -233,8 +232,8 @@ namespace PacketReader::IP::TCP
for (size_t i = 0; i < options.size(); i++)
opOffset += options[i]->GetLength();
//needs to be a whole number of 32bits
headerLength = Common::AlignUpPow2(opOffset, 4);
opOffset += opOffset % 4; //needs to be a whole number of 32bits
headerLength = opOffset;
//Also write into dataOffsetAndNS_Flag
u8 ns = dataOffsetAndNS_Flag & 1;

View File

@@ -43,5 +43,9 @@ namespace PacketReader::IP::UDP::DNS
virtual void WriteBytes(u8* buffer, int* offset);
virtual ~DNS_ResponseEntry(){};
private:
void ReadDNSString(u8* buffer, int* offset, std::string* value);
void WriteDNSString(u8* buffer, int* offset, std::string value);
};
} // namespace PacketReader::IP::UDP::DNS

View File

@@ -785,28 +785,11 @@ namespace Sessions
Console.Error("DEV9: ICMP: Malformed ICMP Packet");
int off = 1;
while ((icmpPayload->data[off] & 0xF0) != (4 << 4))
{
off += 1;
// Require space for the IP Header and source/dest port of a UDP/TCP packet
// We don't generate packets with IP options, so IP header is always 20 bytes
if (icmpPayload->GetLength() - off - 24 < 0)
{
off = -1;
break;
}
}
if (off == -1)
{
Console.Error("DEV9: ICMP: Unable To Recover Data");
Console.Error("DEV9: ICMP: Failed To Reset Rejected Connection");
break;
}
Console.Error("DEV9: ICMP: Payload delayed %d bytes", off);
retPkt = std::make_unique<IP_Packet>(&icmpPayload->data[off], icmpPayload->GetLength() - off, true);
retPkt = std::make_unique<IP_Packet>(&icmpPayload->data[off], icmpPayload->GetLength(), true);
}
const IP_Address srvIP = retPkt->sourceIP;

View File

@@ -225,18 +225,10 @@ namespace Sessions
void UDP_FixedPort::Reset()
{
// Reseting a session may cause that session to close itself,
// when that happens, the connections vector gets modified via our close handler.
// Duplicate the vector to avoid iterating over a modified collection,
// this also avoids the issue of recursive locking when our close handler takes a lock.
std::vector<UDP_BaseSession*> connectionsCopy;
{
std::lock_guard numberlock(connectionSentry);
connectionsCopy = connections;
}
std::lock_guard numberlock(connectionSentry);
for (size_t i = 0; i < connectionsCopy.size(); i++)
connectionsCopy[i]->Reset();
for (size_t i = 0; i < connections.size(); i++)
connections[i]->Reset();
}
UDP_Session* UDP_FixedPort::NewClientSession(ConnectionKey parNewKey, bool parIsBrodcast, bool parIsMulticast)

View File

@@ -37,10 +37,10 @@ public:
map[key] = value;
}
bool Remove(Key key)
void Remove(Key key)
{
std::unique_lock modifyLock(accessMutex);
return map.erase(key) == 1;
map.erase(key);
}
void Clear()

View File

@@ -464,45 +464,55 @@ bool SocketAdapter::SendUDP(ConnectionKey Key, IP_Packet* ipPkt)
return false;
else
{
// Always bind the UDP source port
// PS2 software can run into issues if the source port is not preserved
UDP_FixedPort* fPort = nullptr;
BaseSession* fSession;
if (fixedUDPPorts.TryGetValue(udp.sourcePort, &fSession))
UDP_Session* s = nullptr;
if (abs(udp.sourcePort - udp.destinationPort) <= 10 || //Used for games that assume the destination/source port
ipPkt->destinationIP == dhcpServer.broadcastIP || //Broadcast packets
ipPkt->destinationIP == IP_Address{{{255, 255, 255, 255}}} || //Limited Broadcast packets
(ipPkt->destinationIP.bytes[0] & 0xF0) == 0xE0) //Multicast address start with 0b1110
{
fPort = static_cast<UDP_FixedPort*>(fSession);
UDP_FixedPort* fPort = nullptr;
BaseSession* fSession;
if (fixedUDPPorts.TryGetValue(udp.sourcePort, &fSession))
{
//DevCon.WriteLn("DEV9: Socket: Using Existing UDPFixedPort");
fPort = static_cast<UDP_FixedPort*>(fSession);
}
else
{
ConnectionKey fKey{};
fKey.protocol = (u8)IP_Type::UDP;
fKey.ps2Port = udp.sourcePort;
fKey.srvPort = 0;
Console.WriteLn("DEV9: Socket: Creating New UDPFixedPort with port %d", udp.sourcePort);
fPort = new UDP_FixedPort(fKey, adapterIP, udp.sourcePort);
fPort->AddConnectionClosedHandler([&](BaseSession* session) { HandleFixedPortClosed(session); });
fPort->destIP = {};
fPort->sourceIP = dhcpServer.ps2IP;
connections.Add(fKey, fPort);
fixedUDPPorts.Add(udp.sourcePort, fPort);
fPort->Init();
}
Console.WriteLn("DEV9: Socket: Creating New UDP Connection from FixedPort %d to %d", udp.sourcePort, udp.destinationPort);
s = fPort->NewClientSession(Key,
ipPkt->destinationIP == dhcpServer.broadcastIP || ipPkt->destinationIP == IP_Address{{{255, 255, 255, 255}}},
(ipPkt->destinationIP.bytes[0] & 0xF0) == 0xE0);
if (s == nullptr)
{
Console.Error("DEV9: Socket: Failed to Create New UDP Connection from FixedPort");
return false;
}
}
else
{
ConnectionKey fKey{};
fKey.protocol = static_cast<u8>(IP_Type::UDP);
fKey.ps2Port = udp.sourcePort;
fKey.srvPort = 0;
Console.WriteLn("DEV9: Socket: Binding UDP fixed port %d", udp.sourcePort);
fPort = new UDP_FixedPort(fKey, adapterIP, udp.sourcePort);
fPort->AddConnectionClosedHandler([&](BaseSession* session) { HandleFixedPortClosed(session); });
fPort->destIP = {};
fPort->sourceIP = dhcpServer.ps2IP;
connections.Add(fKey, fPort);
fixedUDPPorts.Add(udp.sourcePort, fPort);
fPort->Init();
}
Console.WriteLn("DEV9: Socket: Creating New UDP Connection from fixed port %d to %d", udp.sourcePort, udp.destinationPort);
UDP_Session* s = fPort->NewClientSession(Key,
ipPkt->destinationIP == dhcpServer.broadcastIP || ipPkt->destinationIP == IP_Address{{{255, 255, 255, 255}}},
(ipPkt->destinationIP.bytes[0] & 0xF0) == 0xE0);
// If we are unable to bind to the port, fall back to a dynamic port
if (s == nullptr)
{
Console.Error("DEV9: Socket: Failed to Create New UDP Connection from fixed port");
Console.WriteLn("DEV9: Socket: Retrying with dynamic port to %d", udp.destinationPort);
Console.WriteLn("DEV9: Socket: Creating New UDP Connection to %d", udp.destinationPort);
s = new UDP_Session(Key, adapterIP);
}
@@ -527,8 +537,7 @@ int SocketAdapter::SendFromConnection(ConnectionKey Key, IP_Packet* ipPkt)
void SocketAdapter::HandleConnectionClosed(BaseSession* sender)
{
const ConnectionKey key = sender->key;
if (!connections.Remove(key))
return;
connections.Remove(key);
// Defer deleting the connection untill we have left the calling session's callstack
if (std::this_thread::get_id() == sendThreadId)
@@ -559,8 +568,7 @@ void SocketAdapter::HandleConnectionClosed(BaseSession* sender)
void SocketAdapter::HandleFixedPortClosed(BaseSession* sender)
{
const ConnectionKey key = sender->key;
if (!connections.Remove(key))
return;
connections.Remove(key);
fixedUDPPorts.Remove(key.ps2Port);
// Defer deleting the connection untill we have left the calling session's callstack
@@ -569,7 +577,7 @@ void SocketAdapter::HandleFixedPortClosed(BaseSession* sender)
else
deleteQueueRecvThread.push_back(sender);
Console.WriteLn("DEV9: Socket: Unbound fixed port %d", key.ps2Port);
Console.WriteLn("DEV9: Socket: Closed Dead UDP Fixed Port to %d", key.ps2Port);
}
void SocketAdapter::close()

View File

@@ -103,7 +103,10 @@ public:
{
// Ignore control characters.
// Otherwise you get fun bells going off.
if (ch >= 0x20)
if (ch < 0x20)
continue;
if (ch != '\n')
m_buffer.push_back(ch);
if (ch == '\n' || m_buffer.size() >= 4096)

View File

@@ -2651,6 +2651,11 @@ bool GSTextureCache::PreloadTarget(GIFRegTEX0 TEX0, const GSVector2i& size, cons
GL_INS("RT double buffer copy from FBP 0x%x, %dx%d => %d,%d", t->m_TEX0.TBP0, copy_width, copy_height, 0, dst_offset_scaled_height);
pxAssert(copy_width <= dst->GetTexture()->GetWidth() && copy_height <= dst->GetTexture()->GetHeight() &&
copy_width <= t->GetTexture()->GetWidth() && copy_height <= t->GetTexture()->GetHeight());
pxAssert(dst_offset_scaled_height > 0);
// Clear the dirty first
t->Update();
dst->Update();

View File

@@ -1423,19 +1423,19 @@ namespace R3000A
bool SaveStateBase::handleFreeze()
{
if (!EmuConfig.HostFs) //if hostfs isn't enabled, skip loading/saving file handles
return IsOkay();
if (IsLoading())
R3000A::ioman::reset();
if (!FreezeTag("hostHandles"))
return false;
if (EmuConfig.HostFs && IsLoading())
R3000A::ioman::reset();
const int firstfd = R3000A::ioman::firstfd;
size_t handleCount = EmuConfig.HostFs ? R3000A::handles.size() : 0;
size_t handleCount = R3000A::handles.size();
Freeze(handleCount);
if (!EmuConfig.HostFs) //if hostfs isn't enabled, skip loading/saving file handles
return IsOkay();
for (size_t i = 0; i < handleCount; i++)
{
if (IsLoading())

View File

@@ -315,9 +315,6 @@ memLoadingState::memLoadingState(const VmStateBuffer& load_from)
// Loading of state data from a memory buffer...
void memLoadingState::FreezeMem( void* data, int size )
{
if (m_idx + size > m_memory.size())
m_error = true;
if (m_error)
{
std::memset(data, 0, size);

View File

@@ -25,7 +25,7 @@ enum class FreezeAction
// [SAVEVERSION+]
// This informs the auto updater that the users savestates will be invalidated.
static const u32 g_SaveVersion = (0x9A51 << 16) | 0x0000;
static const u32 g_SaveVersion = (0x9A50 << 16) | 0x0000;
// the freezing data between submodules and core

View File

@@ -1,6 +1,5 @@
add_pcsx2_test(common_test
byteswap_tests.cpp
filesystem_tests.cpp
path_tests.cpp
string_util_tests.cpp
)

View File

@@ -1,60 +0,0 @@
// SPDX-FileCopyrightText: 2002-2024 PCSX2 Dev Team
// SPDX-License-Identifier: GPL-3.0+
#include "common/FileSystem.h"
#include "common/Path.h"
#include <gtest/gtest.h>
#ifdef __linux__
#include <unistd.h>
static std::optional<std::string> create_test_directory()
{
for (u16 i = 0; i < UINT16_MAX; i++)
{
std::string path = std::string("/tmp/pcsx2_filesystem_test_") + std::to_string(i);
if (!FileSystem::DirectoryExists(path.c_str()))
{
if (!FileSystem::CreateDirectoryPath(path.c_str(), false))
break;
return path;
}
}
return std::nullopt;
}
TEST(FileSystem, RecursiveDeleteDirectoryDontFollowSymbolicLinks)
{
// Find a suitable location to write some test files.
std::optional<std::string> test_dir = create_test_directory();
ASSERT_TRUE(test_dir.has_value());
// Create a target directory containing a file that shouldn't be deleted.
std::string target_dir = Path::Combine(*test_dir, "target_dir");
ASSERT_TRUE(FileSystem::CreateDirectoryPath(target_dir.c_str(), false));
std::string file_path = Path::Combine(target_dir, "file.txt");
ASSERT_TRUE(FileSystem::WriteStringToFile(file_path.c_str(), "Lorem ipsum!"));
// Create a directory containing a symlink to the target directory.
std::string dir_to_delete = Path::Combine(*test_dir, "dir_to_delete");
ASSERT_TRUE(FileSystem::CreateDirectoryPath(dir_to_delete.c_str(), false));
std::string symlink_path = Path::Combine(dir_to_delete, "link");
ASSERT_EQ(symlink(target_dir.c_str(), symlink_path.c_str()), 0);
// Delete the directory containing the symlink.
ASSERT_TRUE(dir_to_delete.starts_with("/tmp/"));
ASSERT_TRUE(FileSystem::RecursiveDeleteDirectory(dir_to_delete.c_str()));
// Make sure the target file didn't get deleted.
ASSERT_TRUE(FileSystem::FileExists(file_path.c_str()));
// Clean up.
ASSERT_TRUE(FileSystem::DeleteFilePath(file_path.c_str()));
ASSERT_TRUE(FileSystem::DeleteDirectory(target_dir.c_str()));
ASSERT_TRUE(FileSystem::DeleteDirectory(test_dir->c_str()));
}
#endif