From 5f3f64c36d4ee714d8d9873acb1b168865cce24d Mon Sep 17 00:00:00 2001 From: Totto16 Date: Wed, 2 Oct 2024 21:00:28 +0200 Subject: [PATCH 01/19] ci: build, don't use arguments for buildtype and default_library --- .github/workflows/build.yml | 34 +++++++++------------------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cc5d651e..4b4b12ad 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,72 +15,56 @@ jobs: fail-fast: false matrix: config: - - name: Windows MSVC Release + - name: Windows MSVC os: windows os-version: 2022 environment: msvc - buildtype: release - library_type: static shell: pwsh - - name: Windows MingGW Release + - name: Windows MingGW os: windows os-version: 2022 environment: mingw architecture: x86_64 - buildtype: release - library_type: static shell: 'msys2 {0}' - - name: Windows UCRT Release + - name: Windows UCRT os: windows os-version: 2022 environment: ucrt architecture: ucrt-x86_64 - buildtype: release - library_type: static shell: 'msys2 {0}' - - name: Linux Release + - name: Linux os: ubuntu os-version: 24.04 - buildtype: release use-clang: false - library_type: shared shell: bash - - name: Linux Clang Release (libstdc++) + - name: Linux Clang (libstdc++) os: ubuntu os-version: 24.04 - buildtype: release use-clang: true use-clang_stdlib: false - library_type: shared shell: bash - - name: Linux Clang Release (libc++) + - name: Linux Clang (libc++) os: ubuntu os-version: 24.04 - buildtype: release use-clang: true use-clang_stdlib: true - library_type: shared shell: bash - - name: MacOS Release + - name: MacOS os: macos os-version: 13 arm: false - buildtype: release - library_type: shared shell: bash - - name: MacOS Release (Arm64) + - name: MacOS (Arm64) os: macos os-version: 14 arm: true - buildtype: release - library_type: shared shell: bash defaults: @@ -203,7 +187,7 @@ jobs: brew install sdl2 sdl2_ttf sdl2_mixer sdl2_image - name: Configure - run: meson setup build -Dbuildtype=${{ matrix.config.buildtype }} -Ddefault_library=${{ matrix.config.library_type }} -Dclang_libcpp=${{ ( ( matrix.config.os == 'ubuntu' && matrix.config.use-clang == true && matrix.config.use-clang_stdlib ) || matrix.config.os == 'macos' ) && 'enabled' || 'disabled' }} + run: meson setup build -Dbuildtype=release -Ddefault_library=shared -Dclang_libcpp=${{ ( ( matrix.config.os == 'ubuntu' && matrix.config.use-clang == true && matrix.config.use-clang_stdlib ) || matrix.config.os == 'macos' ) && 'enabled' || 'disabled' }} - name: Build run: meson compile -C build From e85fbe1e58154aa45664a38f1491cc169698b497 Mon Sep 17 00:00:00 2001 From: Totto16 Date: Wed, 2 Oct 2024 21:01:02 +0200 Subject: [PATCH 02/19] ci: installer, don't use matrix build, as it is only one config --- .github/workflows/installer.yml | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index e9972615..3e2958cd 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -8,23 +8,12 @@ on: jobs: installer: - name: ${{ matrix.config.name }} - runs-on: ${{ matrix.config.os }}-${{ matrix.config.os-version }} + name: Windows MSVC Installer + runs-on: windows-2022 - strategy: - fail-fast: false - matrix: - config: - - name: Windows MSVC Installer - os: windows - os-version: 2022 - msvc: true - buildtype: release - library_type: static - shell: pwsh defaults: run: - shell: ${{ matrix.config.shell }} + shell: pwsh steps: - uses: actions/checkout@v4 @@ -32,19 +21,17 @@ jobs: fetch-depth: '0' - name: Setup MSVC (Windows) - if: matrix.config.os == 'windows' && matrix.config.msvc == true uses: TheMrMilchmann/setup-msvc-dev@v3 with: arch: x64 toolset: '14.41' - name: Setup meson - if: matrix.config.os != 'macos' run: | pip install meson - name: Configure - run: meson setup build -Dbuildtype=${{ matrix.config.buildtype }} -Ddefault_library=${{ matrix.config.library_type }} -Dclang_libcpp=${{ ( ( matrix.config.os == 'ubuntu' && matrix.config.use-clang == true && matrix.config.use-clang_stdlib ) || matrix.config.os == 'macos' ) && 'enabled' || 'disabled' }} -Dbuild_installer=true + run: meson setup build -Dbuildtype=release -Ddefault_library=shared -Dbuild_installer=true - name: Build run: meson compile -C build @@ -65,7 +52,6 @@ jobs: - name: Upload artifacts - Windows uses: actions/upload-artifact@v4 - if: matrix.config.os == 'windows' with: - name: ${{ matrix.config.name }} + name: OOpetris Setup path: tools/installer/OOPetris Setup.exe From 493f0a9f5b95cc26fa69ecdd405cd00c906ad581 Mon Sep 17 00:00:00 2001 From: "Totto16 (Windows VM)" Date: Wed, 2 Oct 2024 22:40:44 +0200 Subject: [PATCH 03/19] windows: support dll library for oopertis-core add export or import declarations, to be able to build libraries as dll --- src/libs/core/game/mino.hpp | 15 +++++---- src/libs/core/game/mino_stack.hpp | 19 +++++++----- src/libs/core/game/tetromino_type.hpp | 5 +-- src/libs/core/hash-library/sha256.h | 23 +++++++++----- src/libs/core/helper/color.hpp | 24 +++++++++------ src/libs/core/helper/date.hpp | 11 ++++--- src/libs/core/helper/errors.hpp | 32 +++++++++++--------- src/libs/core/helper/meson.build | 1 + src/libs/core/helper/parse_json.hpp | 7 +++-- src/libs/core/helper/random.hpp | 16 ++++++---- src/libs/core/helper/sleep.hpp | 4 ++- src/libs/core/helper/string_manipulation.hpp | 15 +++++---- src/libs/core/helper/windows.hpp | 11 +++++++ src/libs/core/meson.build | 1 + 14 files changed, 116 insertions(+), 68 deletions(-) create mode 100644 src/libs/core/helper/windows.hpp diff --git a/src/libs/core/game/mino.hpp b/src/libs/core/game/mino.hpp index 016a9759..158b3738 100644 --- a/src/libs/core/game/mino.hpp +++ b/src/libs/core/game/mino.hpp @@ -2,6 +2,7 @@ #include "../helper/point.hpp" #include "../helper/types.hpp" +#include "../helper/windows.hpp" #include "./grid_properties.hpp" #include "./tetromino_type.hpp" @@ -16,15 +17,17 @@ struct Mino final { helper::TetrominoType m_type; public: - explicit constexpr Mino(GridPoint position, helper::TetrominoType type) : m_position{ position }, m_type{ type } { } + OOPETRIS_EXPORTED explicit constexpr Mino(GridPoint position, helper::TetrominoType type) + : m_position{ position }, + m_type{ type } { } - [[nodiscard]] helper::TetrominoType type() const; + OOPETRIS_EXPORTED [[nodiscard]] helper::TetrominoType type() const; - [[nodiscard]] const GridPoint& position() const; + OOPETRIS_EXPORTED [[nodiscard]] const GridPoint& position() const; - [[nodiscard]] GridPoint& position(); + OOPETRIS_EXPORTED [[nodiscard]] GridPoint& position(); - [[nodiscard]] bool operator==(const Mino& other) const; + OOPETRIS_EXPORTED [[nodiscard]] bool operator==(const Mino& other) const; - [[nodiscard]] bool operator!=(const Mino& other) const; + OOPETRIS_EXPORTED [[nodiscard]] bool operator!=(const Mino& other) const; }; diff --git a/src/libs/core/game/mino_stack.hpp b/src/libs/core/game/mino_stack.hpp index 161c74b9..be1543ea 100644 --- a/src/libs/core/game/mino_stack.hpp +++ b/src/libs/core/game/mino_stack.hpp @@ -1,6 +1,7 @@ #pragma once #include "../helper/types.hpp" +#include "../helper/windows.hpp" #include "./mino.hpp" #include @@ -13,17 +14,19 @@ struct MinoStack final { std::vector m_minos; public: - void clear_row_and_let_sink(u8 row); - [[nodiscard]] bool is_empty(GridPoint coordinates) const; - void set(GridPoint coordinates, helper::TetrominoType type); + OOPETRIS_EXPORTED void clear_row_and_let_sink(u8 row); - [[nodiscard]] u32 num_minos() const; + OOPETRIS_EXPORTED [[nodiscard]] bool is_empty(GridPoint coordinates) const; - [[nodiscard]] const std::vector& minos() const; + OOPETRIS_EXPORTED void set(GridPoint coordinates, helper::TetrominoType type); - [[nodiscard]] bool operator==(const MinoStack& other) const; + OOPETRIS_EXPORTED [[nodiscard]] u32 num_minos() const; - [[nodiscard]] bool operator!=(const MinoStack& other) const; + OOPETRIS_EXPORTED [[nodiscard]] const std::vector& minos() const; + + OOPETRIS_EXPORTED [[nodiscard]] bool operator==(const MinoStack& other) const; + + OOPETRIS_EXPORTED [[nodiscard]] bool operator!=(const MinoStack& other) const; }; -std::ostream& operator<<(std::ostream& ostream, const MinoStack& mino_stack); +OOPETRIS_EXPORTED std::ostream& operator<<(std::ostream& ostream, const MinoStack& mino_stack); diff --git a/src/libs/core/game/tetromino_type.hpp b/src/libs/core/game/tetromino_type.hpp index 5ed6e5c4..4ea38491 100644 --- a/src/libs/core/game/tetromino_type.hpp +++ b/src/libs/core/game/tetromino_type.hpp @@ -2,6 +2,7 @@ #include "../helper/color.hpp" #include "../helper/types.hpp" +#include "../helper/windows.hpp" namespace helper { @@ -16,8 +17,8 @@ namespace helper { LastType = Z, }; - [[nodiscard]] Color get_foreground_color(TetrominoType type, u8 alpha); + OOPETRIS_EXPORTED [[nodiscard]] Color get_foreground_color(TetrominoType type, u8 alpha); - [[nodiscard]] Color get_background_color(TetrominoType type, u8 alpha); + OOPETRIS_EXPORTED [[nodiscard]] Color get_background_color(TetrominoType type, u8 alpha); } // namespace helper diff --git a/src/libs/core/hash-library/sha256.h b/src/libs/core/hash-library/sha256.h index 0a388167..408361d5 100644 --- a/src/libs/core/hash-library/sha256.h +++ b/src/libs/core/hash-library/sha256.h @@ -17,9 +17,18 @@ typedef unsigned __int8 uint8_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; + +#if defined(HASH_LIBRARY_EXPORT) +#define HASH_LIBRARY_EXPORTED __declspec(dllexport) +#else +#define HASH_LIBRARY_EXPORTED __declspec(dllimport) +#endif + #else // GCC #include + +#define HASH_LIBRARY_EXPORTED #endif namespace hash_library { @@ -44,23 +53,23 @@ namespace hash_library { enum { BlockSize = 512 / 8, HashBytes = 32 }; /// same as reset() - SHA256(); + HASH_LIBRARY_EXPORTED SHA256(); /// compute SHA256 of a memory block - std::string operator()(const void* data, size_t numBytes); + HASH_LIBRARY_EXPORTED std::string operator()(const void* data, size_t numBytes); /// compute SHA256 of a string, excluding final zero - std::string operator()(const std::string& text); + HASH_LIBRARY_EXPORTED std::string operator()(const std::string& text); /// add arbitrary number of bytes - void add(const void* data, size_t numBytes); + HASH_LIBRARY_EXPORTED void add(const void* data, size_t numBytes); /// return latest hash as 64 hex characters - std::string getHash(); + HASH_LIBRARY_EXPORTED std::string getHash(); /// return latest hash as bytes - void getHash(unsigned char buffer[HashBytes]); + HASH_LIBRARY_EXPORTED void getHash(unsigned char buffer[HashBytes]); /// restart - void reset(); + HASH_LIBRARY_EXPORTED void reset(); private: /// process 64 bytes diff --git a/src/libs/core/helper/color.hpp b/src/libs/core/helper/color.hpp index 8b6e1f48..36fa90b1 100644 --- a/src/libs/core/helper/color.hpp +++ b/src/libs/core/helper/color.hpp @@ -4,6 +4,7 @@ #include "./expected.hpp" #include "./types.hpp" #include "./utils.hpp" +#include "./windows.hpp" #include #include @@ -61,17 +62,20 @@ struct HSVColor { constexpr HSVColor() : HSVColor{ 0.0, 0.0, 0.0, 0 } { } - [[nodiscard]] static helper::expected from_string(const std::string& value); + OOPETRIS_EXPORTED [[nodiscard]] static helper::expected from_string(const std::string& value + ); using InfoType = std::tuple; - [[nodiscard]] static helper::expected from_string_with_info(const std::string& value); + OOPETRIS_EXPORTED [[nodiscard]] static helper::expected from_string_with_info( + const std::string& value + ); - [[nodiscard]] Color to_rgb_color() const; + OOPETRIS_EXPORTED [[nodiscard]] Color to_rgb_color() const; - [[nodiscard]] std::string to_string(bool force_alpha = false) const; + OOPETRIS_EXPORTED [[nodiscard]] std::string to_string(bool force_alpha = false) const; - std::ostream& operator<<(std::ostream& os) const; + OOPETRIS_EXPORTED std::ostream& operator<<(std::ostream& os) const; }; namespace { //NOLINT(cert-dcl59-cpp,google-build-namespaces) @@ -135,14 +139,16 @@ struct Color { constexpr Color(u8 red, u8 green, u8 blue) : Color{ red, green, blue, 0xFF } { } - [[nodiscard]] static helper::expected from_string(const std::string& value); + OOPETRIS_EXPORTED [[nodiscard]] static helper::expected from_string(const std::string& value); using InfoType = std::tuple; - [[nodiscard]] static helper::expected from_string_with_info(const std::string& value); + OOPETRIS_EXPORTED [[nodiscard]] static helper::expected from_string_with_info( + const std::string& value + ); - [[nodiscard]] HSVColor to_hsv_color() const; + OOPETRIS_EXPORTED [[nodiscard]] HSVColor to_hsv_color() const; constexpr Color(const HSVColor& color) { //NOLINT(google-explicit-constructor) @@ -257,5 +263,5 @@ struct Color { [[nodiscard]] std::string to_string(color::SerializeMode mode = color::SerializeMode::RGB, bool force_alpha = false) const; - std::ostream& operator<<(std::ostream& os) const; + OOPETRIS_EXPORTED std::ostream& operator<<(std::ostream& os) const; }; diff --git a/src/libs/core/helper/date.hpp b/src/libs/core/helper/date.hpp index 36f50b47..818c4dd1 100644 --- a/src/libs/core/helper/date.hpp +++ b/src/libs/core/helper/date.hpp @@ -2,6 +2,7 @@ #include "./expected.hpp" #include "./types.hpp" +#include "./windows.hpp" #include #include @@ -17,14 +18,14 @@ namespace date { static constexpr const char* iso_8601_format_string = "%Y%m%dT%H%M%S"; public: - ISO8601Date(u64 value); + OOPETRIS_EXPORTED ISO8601Date(u64 value); - static ISO8601Date now(); - static helper::expected from_string(const std::string& input); + OOPETRIS_EXPORTED static ISO8601Date now(); + OOPETRIS_EXPORTED static helper::expected from_string(const std::string& input); - [[nodiscard]] helper::expected to_string() const; + OOPETRIS_EXPORTED [[nodiscard]] helper::expected to_string() const; - [[nodiscard]] u64 value() const; + OOPETRIS_EXPORTED [[nodiscard]] u64 value() const; private: [[nodiscard]] static helper::expected get_tm_struct(std::time_t value); diff --git a/src/libs/core/helper/errors.hpp b/src/libs/core/helper/errors.hpp index 1c66dfad..fce2c8b2 100644 --- a/src/libs/core/helper/errors.hpp +++ b/src/libs/core/helper/errors.hpp @@ -2,6 +2,8 @@ #pragma once +#include "./windows.hpp" + #include #include @@ -17,40 +19,40 @@ namespace helper { error::Severity m_severity; public: - GeneralError(const std::string& message, error::Severity severity) noexcept; + OOPETRIS_EXPORTED GeneralError(const std::string& message, error::Severity severity) noexcept; - GeneralError(std::string&& message, error::Severity severity) noexcept; + OOPETRIS_EXPORTED GeneralError(std::string&& message, error::Severity severity) noexcept; - ~GeneralError(); + OOPETRIS_EXPORTED ~GeneralError(); - GeneralError(const GeneralError& error) noexcept; + OOPETRIS_EXPORTED GeneralError(const GeneralError& error) noexcept; [[nodiscard]] GeneralError& operator=(const GeneralError& error) noexcept; - GeneralError(GeneralError&& error) noexcept; - [[nodiscard]] GeneralError& operator=(GeneralError&& error) noexcept; + OOPETRIS_EXPORTED GeneralError(GeneralError&& error) noexcept; + OOPETRIS_EXPORTED [[nodiscard]] GeneralError& operator=(GeneralError&& error) noexcept; - [[nodiscard]] const std::string& message() const; - [[nodiscard]] error::Severity severity() const; + OOPETRIS_EXPORTED [[nodiscard]] const std::string& message() const; + OOPETRIS_EXPORTED [[nodiscard]] error::Severity severity() const; - [[nodiscard]] const char* what() const noexcept override; + OOPETRIS_EXPORTED [[nodiscard]] const char* what() const noexcept override; }; struct FatalError : public GeneralError { - explicit FatalError(const std::string& message) noexcept; + OOPETRIS_EXPORTED explicit FatalError(const std::string& message) noexcept; - explicit FatalError(std::string&& message) noexcept; + OOPETRIS_EXPORTED explicit FatalError(std::string&& message) noexcept; }; struct MajorError : public GeneralError { - explicit MajorError(const std::string& message) noexcept; + OOPETRIS_EXPORTED explicit MajorError(const std::string& message) noexcept; - explicit MajorError(std::string&& message) noexcept; + OOPETRIS_EXPORTED explicit MajorError(std::string&& message) noexcept; }; struct MinorError : public GeneralError { - explicit MinorError(const std::string& message) noexcept; + OOPETRIS_EXPORTED explicit MinorError(const std::string& message) noexcept; - explicit MinorError(std::string&& message) noexcept; + OOPETRIS_EXPORTED explicit MinorError(std::string&& message) noexcept; }; using InitializationError = FatalError; diff --git a/src/libs/core/helper/meson.build b/src/libs/core/helper/meson.build index b0e2eecf..6c87202e 100644 --- a/src/libs/core/helper/meson.build +++ b/src/libs/core/helper/meson.build @@ -28,6 +28,7 @@ _header_files = files( 'types.hpp', 'utils.hpp', 'versions.hpp', + 'windows.hpp', ) core_header_files += _header_files diff --git a/src/libs/core/helper/parse_json.hpp b/src/libs/core/helper/parse_json.hpp index cd6923f2..d2cfeb88 100644 --- a/src/libs/core/helper/parse_json.hpp +++ b/src/libs/core/helper/parse_json.hpp @@ -9,7 +9,7 @@ #include #include "./expected.hpp" - +#include "./windows.hpp" #include #include @@ -130,9 +130,10 @@ namespace json { } - std::string get_json_type(const nlohmann::json::value_t& type); + OOPETRIS_EXPORTED std::string get_json_type(const nlohmann::json::value_t& type); - void check_for_no_additional_keys(const nlohmann::json& obj, const std::vector& keys); + OOPETRIS_EXPORTED void + check_for_no_additional_keys(const nlohmann::json& obj, const std::vector& keys); } // namespace json diff --git a/src/libs/core/helper/random.hpp b/src/libs/core/helper/random.hpp index 06c913ec..4925c2be 100644 --- a/src/libs/core/helper/random.hpp +++ b/src/libs/core/helper/random.hpp @@ -1,6 +1,7 @@ #pragma once #include "./utils.hpp" +#include "./windows.hpp" #include @@ -14,8 +15,8 @@ struct Random { std::uniform_real_distribution m_uniform_real_distribution; public: - Random(); - explicit Random(std::mt19937_64::result_type seed); + OOPETRIS_EXPORTED Random(); + OOPETRIS_EXPORTED explicit Random(std::mt19937_64::result_type seed); template [[nodiscard]] Integer random(const Integer upper_bound_exclusive) { @@ -23,8 +24,11 @@ struct Random { return distribution(m_generator); } - [[nodiscard]] double random(); - [[nodiscard]] Seed seed() const; - void seed(Seed seed); - static Seed generate_seed(); + OOPETRIS_EXPORTED [[nodiscard]] double random(); + + OOPETRIS_EXPORTED [[nodiscard]] Seed seed() const; + + OOPETRIS_EXPORTED void seed(Seed seed); + + OOPETRIS_EXPORTED static Seed generate_seed(); }; diff --git a/src/libs/core/helper/sleep.hpp b/src/libs/core/helper/sleep.hpp index 93c6f9a1..5a24ca73 100644 --- a/src/libs/core/helper/sleep.hpp +++ b/src/libs/core/helper/sleep.hpp @@ -2,10 +2,12 @@ #pragma once +#include "./windows.hpp" + #include namespace helper { - bool sleep_nanoseconds(std::chrono::nanoseconds ns); + OOPETRIS_EXPORTED bool sleep_nanoseconds(std::chrono::nanoseconds ns); } diff --git a/src/libs/core/helper/string_manipulation.hpp b/src/libs/core/helper/string_manipulation.hpp index 9debc4ec..6cc2f967 100644 --- a/src/libs/core/helper/string_manipulation.hpp +++ b/src/libs/core/helper/string_manipulation.hpp @@ -1,24 +1,27 @@ #pragma once +#include "./windows.hpp" + #include #include namespace string { - std::string to_lower_case(const std::string& input); + OOPETRIS_EXPORTED std::string to_lower_case(const std::string& input); - std::string to_upper_case(const std::string& input); + OOPETRIS_EXPORTED std::string to_upper_case(const std::string& input); // for string delimiter - std::vector split_string_by_char(const std::string& start, const std::string& delimiter); + OOPETRIS_EXPORTED std::vector + split_string_by_char(const std::string& start, const std::string& delimiter); // trim from start (in place) - void ltrim(std::string& str); + OOPETRIS_EXPORTED void ltrim(std::string& str); // trim from end (in place) - void rtrim(std::string& str); + OOPETRIS_EXPORTED void rtrim(std::string& str); - void trim(std::string& str); + OOPETRIS_EXPORTED void trim(std::string& str); } // namespace string diff --git a/src/libs/core/helper/windows.hpp b/src/libs/core/helper/windows.hpp new file mode 100644 index 00000000..dfa938e7 --- /dev/null +++ b/src/libs/core/helper/windows.hpp @@ -0,0 +1,11 @@ +#pragma once + +#if defined(_MSC_VER) +#if defined(OOPETRIS_LIBRARY_EXPORT) +#define OOPETRIS_EXPORTED __declspec(dllexport) +#else +#define OOPETRIS_EXPORTED __declspec(dllimport) +#endif +#else +#define OOPETRIS_EXPORTED +#endif diff --git a/src/libs/core/meson.build b/src/libs/core/meson.build index b0799564..7f98c540 100644 --- a/src/libs/core/meson.build +++ b/src/libs/core/meson.build @@ -14,6 +14,7 @@ liboopetris_core = library( include_directories: core_lib.get('inc_dirs'), dependencies: core_lib.get('deps'), cpp_args: core_lib.get('compile_args'), + cpp_shared_args: ['-DOOPETRIS_LIBRARY_EXPORT','-DHASH_LIBRARY_EXPORT'], override_options: { 'warning_level': '3', 'werror': true, From fc011bde78a17d72aa97078527141e9433dafeb1 Mon Sep 17 00:00:00 2001 From: "Totto16 (Windows VM)" Date: Wed, 2 Oct 2024 22:47:50 +0200 Subject: [PATCH 04/19] core: make StaticString a valid iterator --- src/libs/core/helper/static_string.hpp | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/libs/core/helper/static_string.hpp b/src/libs/core/helper/static_string.hpp index f7ec92f1..62a0e4f2 100644 --- a/src/libs/core/helper/static_string.hpp +++ b/src/libs/core/helper/static_string.hpp @@ -1,6 +1,7 @@ #pragma once #include "./types.hpp" +#include "./utils.hpp" #include #include @@ -29,19 +30,29 @@ struct StaticString { return size(); } - [[nodiscard]] constexpr char* begin() { + // iterator trait + using iterator = char * ; //NOLINT(readability-identifier-naming) + using const_iterator = const char*; //NOLINT(readability-identifier-naming) + using difference_type = std::ptrdiff_t; //NOLINT(readability-identifier-naming) + using value_type = char; //NOLINT(readability-identifier-naming) + using pointer = char * ; //NOLINT(readability-identifier-naming) + using reference = char&; //NOLINT(readability-identifier-naming) + using iterator_category = std::bidirectional_iterator_tag; //NOLINT(readability-identifier-naming) + + + [[nodiscard]] constexpr iterator begin() { return m_data.data(); } - [[nodiscard]] constexpr char* end() { - return begin() + length(); + [[nodiscard]] constexpr const_iterator begin() const { + return m_data.data(); } - [[nodiscard]] constexpr const char* begin() const { - return m_data.data(); + [[nodiscard]] constexpr iterator end() { + return begin() + length(); } - [[nodiscard]] constexpr const char* end() const { + [[nodiscard]] constexpr const_iterator end() const { return m_data.data() + size(); } @@ -132,3 +143,5 @@ struct StaticString { template friend struct StaticString; }; + +STATIC_ASSERT_WITH_MESSAGE(utils::IsIterator>::value, "StaticString has to be an iterator"); From dacd2d8e1c7bbd0f0064ec7c56b8ad2933b4d941 Mon Sep 17 00:00:00 2001 From: "Totto16 (Windows VM)" Date: Wed, 2 Oct 2024 22:48:55 +0200 Subject: [PATCH 05/19] windows: support dll library for oopertis-recordings add export or import declarations, to be able to build libraries as dll also make RecordingReader an iterator --- src/libs/core/helper/parse_json.hpp | 2 - src/libs/recordings/meson.build | 1 + .../utility/additional_information.hpp | 32 ++++++------- .../recordings/utility/checksum_helper.hpp | 5 ++- src/libs/recordings/utility/recording.hpp | 9 ++-- .../recordings/utility/recording_reader.cpp | 14 ++++-- .../recordings/utility/recording_reader.hpp | 45 ++++++++++++++----- .../recordings/utility/recording_writer.hpp | 11 +++-- .../recordings/utility/tetrion_snapshot.hpp | 22 ++++----- 9 files changed, 89 insertions(+), 52 deletions(-) diff --git a/src/libs/core/helper/parse_json.hpp b/src/libs/core/helper/parse_json.hpp index d2cfeb88..92b948e5 100644 --- a/src/libs/core/helper/parse_json.hpp +++ b/src/libs/core/helper/parse_json.hpp @@ -129,11 +129,9 @@ namespace json { } } - OOPETRIS_EXPORTED std::string get_json_type(const nlohmann::json::value_t& type); OOPETRIS_EXPORTED void check_for_no_additional_keys(const nlohmann::json& obj, const std::vector& keys); - } // namespace json diff --git a/src/libs/recordings/meson.build b/src/libs/recordings/meson.build index 94f383ee..64157a1b 100644 --- a/src/libs/recordings/meson.build +++ b/src/libs/recordings/meson.build @@ -17,6 +17,7 @@ liboopetris_recordings = library( include_directories: recordings_lib.get('inc_dirs'), dependencies: recordings_lib.get('deps'), cpp_args: recordings_lib.get('compile_args'), + cpp_shared_args: ['-DOOPETRIS_LIBRARY_EXPORT'], override_options: { 'warning_level': '3', 'werror': true, diff --git a/src/libs/recordings/utility/additional_information.hpp b/src/libs/recordings/utility/additional_information.hpp index 8c937564..e44bdb18 100644 --- a/src/libs/recordings/utility/additional_information.hpp +++ b/src/libs/recordings/utility/additional_information.hpp @@ -5,6 +5,7 @@ #include "./helper.hpp" #include #include +#include #include #include @@ -64,7 +65,7 @@ namespace recorder { return m_value; } - [[nodiscard]] std::string to_string(u32 recursion_depth = 0) const; + OOPETRIS_EXPORTED [[nodiscard]] std::string to_string(u32 recursion_depth = 0) const; template [[nodiscard]] bool operator==(const T& other) const { // NOLINT(misc-no-recursion) @@ -114,13 +115,13 @@ namespace recorder { ); } - static helper::expected, std::string> read_from_istream( + OOPETRIS_EXPORTED static helper::expected, std::string> read_from_istream( std::istream& istream ); - [[nodiscard]] helper::expected, std::string> to_bytes(u32 recursion_depth = 0) const; + OOPETRIS_EXPORTED[[nodiscard]] helper::expected, std::string> to_bytes(u32 recursion_depth = 0) const; - [[nodiscard]] static std::vector string_to_bytes(const std::string& value); + OOPETRIS_EXPORTED [[nodiscard]] static std::vector string_to_bytes(const std::string& value); private: static helper::expected read_string_from_istream(std::istream& istream); @@ -141,12 +142,11 @@ namespace recorder { explicit AdditionalInformation(UnderlyingContainer&& values); public: - explicit AdditionalInformation(); + OOPETRIS_EXPORTED explicit AdditionalInformation(); - static helper::expected from_istream(std::istream& istream); + OOPETRIS_EXPORTED static helper::expected from_istream(std::istream& istream); - - void add_value(const std::string& key, const InformationValue& value, bool overwrite = false); + OOPETRIS_EXPORTED void add_value(const std::string& key, const InformationValue& value, bool overwrite = false); template void add(const std::string& key, const T& raw_value, bool overwrite = false) { @@ -154,9 +154,9 @@ namespace recorder { add_value(key, value, overwrite); } - [[nodiscard]] std::optional get(const std::string& key) const; + OOPETRIS_EXPORTED [[nodiscard]] std::optional get(const std::string& key) const; - [[nodiscard]] bool has(const std::string& key) const; + OOPETRIS_EXPORTED [[nodiscard]] bool has(const std::string& key) const; template [[nodiscard]] std::optional get_if(const std::string& key) const { @@ -174,9 +174,9 @@ namespace recorder { return value.as(); } - [[nodiscard]] helper::expected, std::string> to_bytes() const; + OOPETRIS_EXPORTED [[nodiscard]] helper::expected, std::string> to_bytes() const; - [[nodiscard]] helper::expected get_checksum() const; + OOPETRIS_EXPORTED [[nodiscard]] helper::expected get_checksum() const; // iterator trait using iterator = UnderlyingContainer::iterator; //NOLINT(readability-identifier-naming) @@ -188,13 +188,13 @@ namespace recorder { using iterator_category = std::bidirectional_iterator_tag; //NOLINT(readability-identifier-naming) - [[nodiscard]] iterator begin(); + OOPETRIS_EXPORTED [[nodiscard]] iterator begin(); - [[nodiscard]] const_iterator begin() const; + OOPETRIS_EXPORTED [[nodiscard]] const_iterator begin() const; - [[nodiscard]] iterator end(); + OOPETRIS_EXPORTED [[nodiscard]] iterator end(); - [[nodiscard]] const_iterator end() const; + OOPETRIS_EXPORTED [[nodiscard]] const_iterator end() const; }; STATIC_ASSERT_WITH_MESSAGE( diff --git a/src/libs/recordings/utility/checksum_helper.hpp b/src/libs/recordings/utility/checksum_helper.hpp index 6f259b84..abcc32b1 100644 --- a/src/libs/recordings/utility/checksum_helper.hpp +++ b/src/libs/recordings/utility/checksum_helper.hpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -27,7 +28,7 @@ struct Sha256Stream { return *this; } - Sha256Stream& operator<<(const std::string& value); + OOPETRIS_EXPORTED Sha256Stream& operator<<(const std::string& value); template Sha256Stream& operator<<(const std::vector& values) { @@ -47,5 +48,5 @@ struct Sha256Stream { return *this; } - [[nodiscard]] Checksum get_hash(); + OOPETRIS_EXPORTED [[nodiscard]] Checksum get_hash(); }; diff --git a/src/libs/recordings/utility/recording.hpp b/src/libs/recordings/utility/recording.hpp index f010cffb..eda2c5cd 100644 --- a/src/libs/recordings/utility/recording.hpp +++ b/src/libs/recordings/utility/recording.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "./additional_information.hpp" #include "./checksum_helper.hpp" @@ -36,7 +37,7 @@ namespace recorder { Random::Seed seed; u32 starting_level; - TetrionHeader(Random::Seed seed, u32 starting_level); + OOPETRIS_EXPORTED TetrionHeader(Random::Seed seed, u32 starting_level); }; struct Recording { @@ -57,11 +58,11 @@ namespace recorder { Recording& operator=(Recording&&) = delete; virtual ~Recording() = default; - [[nodiscard]] const std::vector& tetrion_headers() const; + OOPETRIS_EXPORTED [[nodiscard]] const std::vector& tetrion_headers() const; - [[nodiscard]] const AdditionalInformation& information() const; + OOPETRIS_EXPORTED [[nodiscard]] const AdditionalInformation& information() const; - [[nodiscard]] static Sha256Stream::Checksum get_header_checksum( + OOPETRIS_EXPORTED [[nodiscard]] static Sha256Stream::Checksum get_header_checksum( u8 version_number, const std::vector& tetrion_headers, const AdditionalInformation& information diff --git a/src/libs/recordings/utility/recording_reader.cpp b/src/libs/recordings/utility/recording_reader.cpp index 58f04d96..a908ccbe 100644 --- a/src/libs/recordings/utility/recording_reader.cpp +++ b/src/libs/recordings/utility/recording_reader.cpp @@ -11,7 +11,7 @@ recorder::RecordingReader::RecordingReader( std::vector&& tetrion_headers, AdditionalInformation&& information, - std::vector&& records, + UnderlyingContainer&& records, std::vector&& snapshots ) : Recording{ std::move(tetrion_headers), std::move(information) }, @@ -166,11 +166,19 @@ helper::expected recorder::RecordingRead return m_records.size(); } -[[nodiscard]] auto recorder::RecordingReader::begin() const { +[[nodiscard]] recorder::RecordingReader::iterator recorder::RecordingReader::begin() { + return m_records.begin(); +} + +[[nodiscard]] recorder::RecordingReader::const_iterator recorder::RecordingReader::begin() const { return m_records.cbegin(); } -[[nodiscard]] auto recorder::RecordingReader::end() const { +[[nodiscard]] recorder::RecordingReader::iterator recorder::RecordingReader::end() { + return m_records.end(); +} + +[[nodiscard]] recorder::RecordingReader::const_iterator recorder::RecordingReader::end() const { return m_records.cend(); } diff --git a/src/libs/recordings/utility/recording_reader.hpp b/src/libs/recordings/utility/recording_reader.hpp index a6cc6ca8..ddce8a50 100644 --- a/src/libs/recordings/utility/recording_reader.hpp +++ b/src/libs/recordings/utility/recording_reader.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include "./helper.hpp" #include "./recording.hpp" @@ -11,35 +13,54 @@ namespace recorder { struct RecordingReader : public Recording { private: - std::vector m_records; + using UnderlyingContainer = std::vector; + + UnderlyingContainer m_records; std::vector m_snapshots; explicit RecordingReader( std::vector&& tetrion_headers, AdditionalInformation&& information, - std::vector&& records, + UnderlyingContainer&& records, std::vector&& snapshots ); public: - RecordingReader(RecordingReader&& old) noexcept; + OOPETRIS_EXPORTED RecordingReader(RecordingReader&& old) noexcept; - static helper::expected from_path(const std::filesystem::path& path); + OOPETRIS_EXPORTED static helper::expected from_path( + const std::filesystem::path& path + ); - [[nodiscard]] const Record& at(usize index) const; + OOPETRIS_EXPORTED [[nodiscard]] const Record& at(usize index) const; - [[nodiscard]] usize num_records() const; - [[nodiscard]] auto begin() const; - [[nodiscard]] auto end() const; + OOPETRIS_EXPORTED [[nodiscard]] usize num_records() const; - [[nodiscard]] const std::vector& records() const; + OOPETRIS_EXPORTED [[nodiscard]] const UnderlyingContainer& records() const; - [[nodiscard]] const std::vector& snapshots() const; + OOPETRIS_EXPORTED [[nodiscard]] const std::vector& snapshots() const; - [[nodiscard]] static helper:: + OOPETRIS_EXPORTED [[nodiscard]] static helper:: expected>, std::string> is_header_valid(const std::filesystem::path& path); + // iterator trait + using iterator = UnderlyingContainer::iterator; //NOLINT(readability-identifier-naming) + using const_iterator = UnderlyingContainer::const_iterator; //NOLINT(readability-identifier-naming) + using difference_type = UnderlyingContainer::difference_type; //NOLINT(readability-identifier-naming) + using value_type = UnderlyingContainer::value_type; //NOLINT(readability-identifier-naming) + using pointer = UnderlyingContainer::pointer; //NOLINT(readability-identifier-naming) + using reference = UnderlyingContainer::reference; //NOLINT(readability-identifier-naming) + using iterator_category = std::bidirectional_iterator_tag; //NOLINT(readability-identifier-naming) + + OOPETRIS_EXPORTED [[nodiscard]] iterator begin(); + + OOPETRIS_EXPORTED [[nodiscard]] const_iterator begin() const; + + OOPETRIS_EXPORTED [[nodiscard]] iterator end(); + + OOPETRIS_EXPORTED [[nodiscard]] const_iterator end() const; + private: [[nodiscard]] static helper::expected< std::tuple, recorder::AdditionalInformation>, @@ -53,4 +74,6 @@ namespace recorder { [[nodiscard]] static helper::reader::ReadResult read_record_from_file(std::ifstream& file); }; + STATIC_ASSERT_WITH_MESSAGE(utils::IsIterator::value, "RecordingReader has to be an iterator"); + } // namespace recorder diff --git a/src/libs/recordings/utility/recording_writer.hpp b/src/libs/recordings/utility/recording_writer.hpp index e23e190b..0f3dc0af 100644 --- a/src/libs/recordings/utility/recording_writer.hpp +++ b/src/libs/recordings/utility/recording_writer.hpp @@ -4,7 +4,9 @@ #include "./helper.hpp" #include "./recording.hpp" #include "./tetrion_core_information.hpp" + #include +#include #include @@ -21,21 +23,22 @@ namespace recorder { ); public: - RecordingWriter(RecordingWriter&& old) noexcept; + OOPETRIS_EXPORTED RecordingWriter(RecordingWriter&& old) noexcept; - static helper::expected get_writer( + OOPETRIS_EXPORTED static helper::expected get_writer( const std::filesystem::path& path, std::vector&& tetrion_headers, AdditionalInformation&& information, bool overwrite = false ); - [[nodiscard]] helper::expected add_record( + OOPETRIS_EXPORTED [[nodiscard]] helper::expected add_record( u8 tetrion_index, // NOLINT(bugprone-easily-swappable-parameters) u64 simulation_step_index, InputEvent event ); - [[nodiscard]] helper::expected + + OOPETRIS_EXPORTED [[nodiscard]] helper::expected add_snapshot(u64 simulation_step_index, std::unique_ptr information); private: diff --git a/src/libs/recordings/utility/tetrion_snapshot.hpp b/src/libs/recordings/utility/tetrion_snapshot.hpp index 4aa7a11a..a47dfb07 100644 --- a/src/libs/recordings/utility/tetrion_snapshot.hpp +++ b/src/libs/recordings/utility/tetrion_snapshot.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "./tetrion_core_information.hpp" @@ -29,7 +30,7 @@ struct TetrionSnapshot final { using MinoCount = u64; using Coordinate = u8; - TetrionSnapshot( + OOPETRIS_EXPORTED TetrionSnapshot( u8 tetrion_index, Level level, Score score, @@ -38,23 +39,24 @@ struct TetrionSnapshot final { MinoStack mino_stack ); - static helper::expected from_istream(std::istream& istream); + OOPETRIS_EXPORTED static helper::expected from_istream(std::istream& istream); + OOPETRIS_EXPORTED TetrionSnapshot(std::unique_ptr information, SimulationStep simulation_step_index); - [[nodiscard]] u8 tetrion_index() const; + OOPETRIS_EXPORTED [[nodiscard]] u8 tetrion_index() const; - [[nodiscard]] Level level() const; + OOPETRIS_EXPORTED [[nodiscard]] Level level() const; - [[nodiscard]] Score score() const; + OOPETRIS_EXPORTED [[nodiscard]] Score score() const; - [[nodiscard]] LineCount lines_cleared() const; + OOPETRIS_EXPORTED [[nodiscard]] LineCount lines_cleared() const; - [[nodiscard]] u64 simulation_step_index() const; + OOPETRIS_EXPORTED [[nodiscard]] u64 simulation_step_index() const; - [[nodiscard]] const MinoStack& mino_stack() const; + OOPETRIS_EXPORTED [[nodiscard]] const MinoStack& mino_stack() const; - [[nodiscard]] std::vector to_bytes() const; + OOPETRIS_EXPORTED [[nodiscard]] std::vector to_bytes() const; - [[nodiscard]] helper::expected compare_to(const TetrionSnapshot& other) const; + OOPETRIS_EXPORTED [[nodiscard]] helper::expected compare_to(const TetrionSnapshot& other) const; }; From b21823252a4cd93158f15798f49f25d62ad12b2d Mon Sep 17 00:00:00 2001 From: "Totto16 (Windows VM)" Date: Wed, 2 Oct 2024 23:15:57 +0200 Subject: [PATCH 06/19] dependencies: always use a static discord lib, when using msvc with this workaround we don't need to add __declspec() everywhere --- tools/dependencies/meson.build | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/dependencies/meson.build b/tools/dependencies/meson.build index ab1fb0c2..7aff079b 100644 --- a/tools/dependencies/meson.build +++ b/tools/dependencies/meson.build @@ -331,9 +331,17 @@ if build_application } endif + c = meson.get_compiler('c') + discord_sdk_dep = dependency( 'discord-game-sdk', required: not meson.is_cross_build(), + # only with msvc we need a static library, all others work without adding __declspec() everywhere + static: c.get_id() == 'msvc', + #TODO: format and run mesonlint + default_options : c.get_id() != 'msvc' ? {}: { + 'default_library':'static' + } ) if discord_sdk_dep.found() have_discord_sdk = true From c086ecd5b90bb23b9206b6be6811aca0eb8bc50d Mon Sep 17 00:00:00 2001 From: "Totto16 (Windows VM)" Date: Wed, 2 Oct 2024 23:18:47 +0200 Subject: [PATCH 07/19] fix: fix exported property on a function in core/helper/color.hpp --- src/libs/core/helper/color.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/core/helper/color.hpp b/src/libs/core/helper/color.hpp index 36fa90b1..0093f630 100644 --- a/src/libs/core/helper/color.hpp +++ b/src/libs/core/helper/color.hpp @@ -260,8 +260,8 @@ struct Color { return Color{ 0xFF, 0xFF, 0xFF, alpha }; }; - [[nodiscard]] std::string to_string(color::SerializeMode mode = color::SerializeMode::RGB, bool force_alpha = false) - const; + OOPETRIS_EXPORTED [[nodiscard]] std::string + to_string(color::SerializeMode mode = color::SerializeMode::RGB, bool force_alpha = false) const; OOPETRIS_EXPORTED std::ostream& operator<<(std::ostream& os) const; }; From a6d55017ed91a5276f00babd2207c41deb6144ed Mon Sep 17 00:00:00 2001 From: "Totto16 (Windows VM)" Date: Wed, 2 Oct 2024 23:31:15 +0200 Subject: [PATCH 08/19] windows: use seperate exported name for each library, core --- src/libs/core/game/mino.hpp | 12 ++++---- src/libs/core/game/mino_stack.hpp | 16 +++++------ src/libs/core/game/tetromino_type.hpp | 4 +-- src/libs/core/helper/color.hpp | 20 ++++++------- src/libs/core/helper/date.hpp | 10 +++---- src/libs/core/helper/errors.hpp | 30 ++++++++++---------- src/libs/core/helper/parse_json.hpp | 4 +-- src/libs/core/helper/random.hpp | 12 ++++---- src/libs/core/helper/sleep.hpp | 2 +- src/libs/core/helper/string_manipulation.hpp | 12 ++++---- src/libs/core/helper/windows.hpp | 8 +++--- src/libs/core/meson.build | 2 +- 12 files changed, 66 insertions(+), 66 deletions(-) diff --git a/src/libs/core/game/mino.hpp b/src/libs/core/game/mino.hpp index 158b3738..3171e0ed 100644 --- a/src/libs/core/game/mino.hpp +++ b/src/libs/core/game/mino.hpp @@ -17,17 +17,17 @@ struct Mino final { helper::TetrominoType m_type; public: - OOPETRIS_EXPORTED explicit constexpr Mino(GridPoint position, helper::TetrominoType type) + OOPETRIS_CORE_EXPORTED explicit constexpr Mino(GridPoint position, helper::TetrominoType type) : m_position{ position }, m_type{ type } { } - OOPETRIS_EXPORTED [[nodiscard]] helper::TetrominoType type() const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] helper::TetrominoType type() const; - OOPETRIS_EXPORTED [[nodiscard]] const GridPoint& position() const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] const GridPoint& position() const; - OOPETRIS_EXPORTED [[nodiscard]] GridPoint& position(); + OOPETRIS_CORE_EXPORTED [[nodiscard]] GridPoint& position(); - OOPETRIS_EXPORTED [[nodiscard]] bool operator==(const Mino& other) const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] bool operator==(const Mino& other) const; - OOPETRIS_EXPORTED [[nodiscard]] bool operator!=(const Mino& other) const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] bool operator!=(const Mino& other) const; }; diff --git a/src/libs/core/game/mino_stack.hpp b/src/libs/core/game/mino_stack.hpp index be1543ea..29856718 100644 --- a/src/libs/core/game/mino_stack.hpp +++ b/src/libs/core/game/mino_stack.hpp @@ -14,19 +14,19 @@ struct MinoStack final { std::vector m_minos; public: - OOPETRIS_EXPORTED void clear_row_and_let_sink(u8 row); + OOPETRIS_CORE_EXPORTED void clear_row_and_let_sink(u8 row); - OOPETRIS_EXPORTED [[nodiscard]] bool is_empty(GridPoint coordinates) const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] bool is_empty(GridPoint coordinates) const; - OOPETRIS_EXPORTED void set(GridPoint coordinates, helper::TetrominoType type); + OOPETRIS_CORE_EXPORTED void set(GridPoint coordinates, helper::TetrominoType type); - OOPETRIS_EXPORTED [[nodiscard]] u32 num_minos() const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] u32 num_minos() const; - OOPETRIS_EXPORTED [[nodiscard]] const std::vector& minos() const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] const std::vector& minos() const; - OOPETRIS_EXPORTED [[nodiscard]] bool operator==(const MinoStack& other) const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] bool operator==(const MinoStack& other) const; - OOPETRIS_EXPORTED [[nodiscard]] bool operator!=(const MinoStack& other) const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] bool operator!=(const MinoStack& other) const; }; -OOPETRIS_EXPORTED std::ostream& operator<<(std::ostream& ostream, const MinoStack& mino_stack); +OOPETRIS_CORE_EXPORTED std::ostream& operator<<(std::ostream& ostream, const MinoStack& mino_stack); diff --git a/src/libs/core/game/tetromino_type.hpp b/src/libs/core/game/tetromino_type.hpp index 4ea38491..88334012 100644 --- a/src/libs/core/game/tetromino_type.hpp +++ b/src/libs/core/game/tetromino_type.hpp @@ -17,8 +17,8 @@ namespace helper { LastType = Z, }; - OOPETRIS_EXPORTED [[nodiscard]] Color get_foreground_color(TetrominoType type, u8 alpha); + OOPETRIS_CORE_EXPORTED [[nodiscard]] Color get_foreground_color(TetrominoType type, u8 alpha); - OOPETRIS_EXPORTED [[nodiscard]] Color get_background_color(TetrominoType type, u8 alpha); + OOPETRIS_CORE_EXPORTED [[nodiscard]] Color get_background_color(TetrominoType type, u8 alpha); } // namespace helper diff --git a/src/libs/core/helper/color.hpp b/src/libs/core/helper/color.hpp index 0093f630..6dd6cd6d 100644 --- a/src/libs/core/helper/color.hpp +++ b/src/libs/core/helper/color.hpp @@ -62,20 +62,20 @@ struct HSVColor { constexpr HSVColor() : HSVColor{ 0.0, 0.0, 0.0, 0 } { } - OOPETRIS_EXPORTED [[nodiscard]] static helper::expected from_string(const std::string& value + OOPETRIS_CORE_EXPORTED [[nodiscard]] static helper::expected from_string(const std::string& value ); using InfoType = std::tuple; - OOPETRIS_EXPORTED [[nodiscard]] static helper::expected from_string_with_info( + OOPETRIS_CORE_EXPORTED [[nodiscard]] static helper::expected from_string_with_info( const std::string& value ); - OOPETRIS_EXPORTED [[nodiscard]] Color to_rgb_color() const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] Color to_rgb_color() const; - OOPETRIS_EXPORTED [[nodiscard]] std::string to_string(bool force_alpha = false) const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] std::string to_string(bool force_alpha = false) const; - OOPETRIS_EXPORTED std::ostream& operator<<(std::ostream& os) const; + OOPETRIS_CORE_EXPORTED std::ostream& operator<<(std::ostream& os) const; }; namespace { //NOLINT(cert-dcl59-cpp,google-build-namespaces) @@ -139,16 +139,16 @@ struct Color { constexpr Color(u8 red, u8 green, u8 blue) : Color{ red, green, blue, 0xFF } { } - OOPETRIS_EXPORTED [[nodiscard]] static helper::expected from_string(const std::string& value); + OOPETRIS_CORE_EXPORTED [[nodiscard]] static helper::expected from_string(const std::string& value); using InfoType = std::tuple; - OOPETRIS_EXPORTED [[nodiscard]] static helper::expected from_string_with_info( + OOPETRIS_CORE_EXPORTED [[nodiscard]] static helper::expected from_string_with_info( const std::string& value ); - OOPETRIS_EXPORTED [[nodiscard]] HSVColor to_hsv_color() const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] HSVColor to_hsv_color() const; constexpr Color(const HSVColor& color) { //NOLINT(google-explicit-constructor) @@ -260,8 +260,8 @@ struct Color { return Color{ 0xFF, 0xFF, 0xFF, alpha }; }; - OOPETRIS_EXPORTED [[nodiscard]] std::string + OOPETRIS_CORE_EXPORTED [[nodiscard]] std::string to_string(color::SerializeMode mode = color::SerializeMode::RGB, bool force_alpha = false) const; - OOPETRIS_EXPORTED std::ostream& operator<<(std::ostream& os) const; + OOPETRIS_CORE_EXPORTED std::ostream& operator<<(std::ostream& os) const; }; diff --git a/src/libs/core/helper/date.hpp b/src/libs/core/helper/date.hpp index 818c4dd1..09d7ffee 100644 --- a/src/libs/core/helper/date.hpp +++ b/src/libs/core/helper/date.hpp @@ -18,14 +18,14 @@ namespace date { static constexpr const char* iso_8601_format_string = "%Y%m%dT%H%M%S"; public: - OOPETRIS_EXPORTED ISO8601Date(u64 value); + OOPETRIS_CORE_EXPORTED ISO8601Date(u64 value); - OOPETRIS_EXPORTED static ISO8601Date now(); - OOPETRIS_EXPORTED static helper::expected from_string(const std::string& input); + OOPETRIS_CORE_EXPORTED static ISO8601Date now(); + OOPETRIS_CORE_EXPORTED static helper::expected from_string(const std::string& input); - OOPETRIS_EXPORTED [[nodiscard]] helper::expected to_string() const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] helper::expected to_string() const; - OOPETRIS_EXPORTED [[nodiscard]] u64 value() const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] u64 value() const; private: [[nodiscard]] static helper::expected get_tm_struct(std::time_t value); diff --git a/src/libs/core/helper/errors.hpp b/src/libs/core/helper/errors.hpp index fce2c8b2..24a8c26b 100644 --- a/src/libs/core/helper/errors.hpp +++ b/src/libs/core/helper/errors.hpp @@ -19,40 +19,40 @@ namespace helper { error::Severity m_severity; public: - OOPETRIS_EXPORTED GeneralError(const std::string& message, error::Severity severity) noexcept; + OOPETRIS_CORE_EXPORTED GeneralError(const std::string& message, error::Severity severity) noexcept; - OOPETRIS_EXPORTED GeneralError(std::string&& message, error::Severity severity) noexcept; + OOPETRIS_CORE_EXPORTED GeneralError(std::string&& message, error::Severity severity) noexcept; - OOPETRIS_EXPORTED ~GeneralError(); + OOPETRIS_CORE_EXPORTED ~GeneralError(); - OOPETRIS_EXPORTED GeneralError(const GeneralError& error) noexcept; + OOPETRIS_CORE_EXPORTED GeneralError(const GeneralError& error) noexcept; [[nodiscard]] GeneralError& operator=(const GeneralError& error) noexcept; - OOPETRIS_EXPORTED GeneralError(GeneralError&& error) noexcept; - OOPETRIS_EXPORTED [[nodiscard]] GeneralError& operator=(GeneralError&& error) noexcept; + OOPETRIS_CORE_EXPORTED GeneralError(GeneralError&& error) noexcept; + OOPETRIS_CORE_EXPORTED [[nodiscard]] GeneralError& operator=(GeneralError&& error) noexcept; - OOPETRIS_EXPORTED [[nodiscard]] const std::string& message() const; - OOPETRIS_EXPORTED [[nodiscard]] error::Severity severity() const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] const std::string& message() const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] error::Severity severity() const; - OOPETRIS_EXPORTED [[nodiscard]] const char* what() const noexcept override; + OOPETRIS_CORE_EXPORTED [[nodiscard]] const char* what() const noexcept override; }; struct FatalError : public GeneralError { - OOPETRIS_EXPORTED explicit FatalError(const std::string& message) noexcept; + OOPETRIS_CORE_EXPORTED explicit FatalError(const std::string& message) noexcept; - OOPETRIS_EXPORTED explicit FatalError(std::string&& message) noexcept; + OOPETRIS_CORE_EXPORTED explicit FatalError(std::string&& message) noexcept; }; struct MajorError : public GeneralError { - OOPETRIS_EXPORTED explicit MajorError(const std::string& message) noexcept; + OOPETRIS_CORE_EXPORTED explicit MajorError(const std::string& message) noexcept; - OOPETRIS_EXPORTED explicit MajorError(std::string&& message) noexcept; + OOPETRIS_CORE_EXPORTED explicit MajorError(std::string&& message) noexcept; }; struct MinorError : public GeneralError { - OOPETRIS_EXPORTED explicit MinorError(const std::string& message) noexcept; + OOPETRIS_CORE_EXPORTED explicit MinorError(const std::string& message) noexcept; - OOPETRIS_EXPORTED explicit MinorError(std::string&& message) noexcept; + OOPETRIS_CORE_EXPORTED explicit MinorError(std::string&& message) noexcept; }; using InitializationError = FatalError; diff --git a/src/libs/core/helper/parse_json.hpp b/src/libs/core/helper/parse_json.hpp index 92b948e5..7070ecd1 100644 --- a/src/libs/core/helper/parse_json.hpp +++ b/src/libs/core/helper/parse_json.hpp @@ -129,9 +129,9 @@ namespace json { } } - OOPETRIS_EXPORTED std::string get_json_type(const nlohmann::json::value_t& type); + OOPETRIS_CORE_EXPORTED std::string get_json_type(const nlohmann::json::value_t& type); - OOPETRIS_EXPORTED void + OOPETRIS_CORE_EXPORTED void check_for_no_additional_keys(const nlohmann::json& obj, const std::vector& keys); } // namespace json diff --git a/src/libs/core/helper/random.hpp b/src/libs/core/helper/random.hpp index 4925c2be..16b0b7d3 100644 --- a/src/libs/core/helper/random.hpp +++ b/src/libs/core/helper/random.hpp @@ -15,8 +15,8 @@ struct Random { std::uniform_real_distribution m_uniform_real_distribution; public: - OOPETRIS_EXPORTED Random(); - OOPETRIS_EXPORTED explicit Random(std::mt19937_64::result_type seed); + OOPETRIS_CORE_EXPORTED Random(); + OOPETRIS_CORE_EXPORTED explicit Random(std::mt19937_64::result_type seed); template [[nodiscard]] Integer random(const Integer upper_bound_exclusive) { @@ -24,11 +24,11 @@ struct Random { return distribution(m_generator); } - OOPETRIS_EXPORTED [[nodiscard]] double random(); + OOPETRIS_CORE_EXPORTED [[nodiscard]] double random(); - OOPETRIS_EXPORTED [[nodiscard]] Seed seed() const; + OOPETRIS_CORE_EXPORTED [[nodiscard]] Seed seed() const; - OOPETRIS_EXPORTED void seed(Seed seed); + OOPETRIS_CORE_EXPORTED void seed(Seed seed); - OOPETRIS_EXPORTED static Seed generate_seed(); + OOPETRIS_CORE_EXPORTED static Seed generate_seed(); }; diff --git a/src/libs/core/helper/sleep.hpp b/src/libs/core/helper/sleep.hpp index 5a24ca73..d29e5b81 100644 --- a/src/libs/core/helper/sleep.hpp +++ b/src/libs/core/helper/sleep.hpp @@ -8,6 +8,6 @@ namespace helper { - OOPETRIS_EXPORTED bool sleep_nanoseconds(std::chrono::nanoseconds ns); + OOPETRIS_CORE_EXPORTED bool sleep_nanoseconds(std::chrono::nanoseconds ns); } diff --git a/src/libs/core/helper/string_manipulation.hpp b/src/libs/core/helper/string_manipulation.hpp index 6cc2f967..fbeb345f 100644 --- a/src/libs/core/helper/string_manipulation.hpp +++ b/src/libs/core/helper/string_manipulation.hpp @@ -8,20 +8,20 @@ namespace string { - OOPETRIS_EXPORTED std::string to_lower_case(const std::string& input); + OOPETRIS_CORE_EXPORTED std::string to_lower_case(const std::string& input); - OOPETRIS_EXPORTED std::string to_upper_case(const std::string& input); + OOPETRIS_CORE_EXPORTED std::string to_upper_case(const std::string& input); // for string delimiter - OOPETRIS_EXPORTED std::vector + OOPETRIS_CORE_EXPORTED std::vector split_string_by_char(const std::string& start, const std::string& delimiter); // trim from start (in place) - OOPETRIS_EXPORTED void ltrim(std::string& str); + OOPETRIS_CORE_EXPORTED void ltrim(std::string& str); // trim from end (in place) - OOPETRIS_EXPORTED void rtrim(std::string& str); + OOPETRIS_CORE_EXPORTED void rtrim(std::string& str); - OOPETRIS_EXPORTED void trim(std::string& str); + OOPETRIS_CORE_EXPORTED void trim(std::string& str); } // namespace string diff --git a/src/libs/core/helper/windows.hpp b/src/libs/core/helper/windows.hpp index dfa938e7..dc59ff01 100644 --- a/src/libs/core/helper/windows.hpp +++ b/src/libs/core/helper/windows.hpp @@ -1,11 +1,11 @@ #pragma once #if defined(_MSC_VER) -#if defined(OOPETRIS_LIBRARY_EXPORT) -#define OOPETRIS_EXPORTED __declspec(dllexport) +#if defined(OOPETRIS_LIBRARY_CORE_EXPORT) +#define OOPETRIS_CORE_EXPORTED __declspec(dllexport) #else -#define OOPETRIS_EXPORTED __declspec(dllimport) +#define OOPETRIS_CORE_EXPORTED __declspec(dllimport) #endif #else -#define OOPETRIS_EXPORTED +#define OOPETRIS_CORE_EXPORTED #endif diff --git a/src/libs/core/meson.build b/src/libs/core/meson.build index 7f98c540..1634c1ed 100644 --- a/src/libs/core/meson.build +++ b/src/libs/core/meson.build @@ -14,7 +14,7 @@ liboopetris_core = library( include_directories: core_lib.get('inc_dirs'), dependencies: core_lib.get('deps'), cpp_args: core_lib.get('compile_args'), - cpp_shared_args: ['-DOOPETRIS_LIBRARY_EXPORT','-DHASH_LIBRARY_EXPORT'], + cpp_shared_args: ['-DOOPETRIS_LIBRARY_CORE_EXPORT','-DHASH_LIBRARY_EXPORT'], override_options: { 'warning_level': '3', 'werror': true, From c6ee9fb07617a63c4504abe38f8a1a76222d1cd1 Mon Sep 17 00:00:00 2001 From: "Totto16 (Windows VM)" Date: Wed, 2 Oct 2024 23:33:13 +0200 Subject: [PATCH 09/19] windows: use seperate exported name for each library, recordings --- src/libs/recordings/meson.build | 2 +- .../utility/additional_information.hpp | 32 +++++++++---------- .../recordings/utility/checksum_helper.hpp | 6 ++-- src/libs/recordings/utility/meson.build | 1 + src/libs/recordings/utility/recording.hpp | 10 +++--- .../recordings/utility/recording_reader.hpp | 24 +++++++------- .../recordings/utility/recording_writer.hpp | 10 +++--- .../recordings/utility/tetrion_snapshot.hpp | 24 +++++++------- src/libs/recordings/utility/windows.hpp | 11 +++++++ 9 files changed, 66 insertions(+), 54 deletions(-) create mode 100644 src/libs/recordings/utility/windows.hpp diff --git a/src/libs/recordings/meson.build b/src/libs/recordings/meson.build index 64157a1b..46f1a44a 100644 --- a/src/libs/recordings/meson.build +++ b/src/libs/recordings/meson.build @@ -17,7 +17,7 @@ liboopetris_recordings = library( include_directories: recordings_lib.get('inc_dirs'), dependencies: recordings_lib.get('deps'), cpp_args: recordings_lib.get('compile_args'), - cpp_shared_args: ['-DOOPETRIS_LIBRARY_EXPORT'], + cpp_shared_args: ['-DOOPETRIS_LIBRARY_RECORDINGS_EXPORT'], override_options: { 'warning_level': '3', 'werror': true, diff --git a/src/libs/recordings/utility/additional_information.hpp b/src/libs/recordings/utility/additional_information.hpp index e44bdb18..e52eff0f 100644 --- a/src/libs/recordings/utility/additional_information.hpp +++ b/src/libs/recordings/utility/additional_information.hpp @@ -5,7 +5,7 @@ #include "./helper.hpp" #include #include -#include +#include "./windows.hpp" #include #include @@ -65,7 +65,7 @@ namespace recorder { return m_value; } - OOPETRIS_EXPORTED [[nodiscard]] std::string to_string(u32 recursion_depth = 0) const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] std::string to_string(u32 recursion_depth = 0) const; template [[nodiscard]] bool operator==(const T& other) const { // NOLINT(misc-no-recursion) @@ -115,13 +115,13 @@ namespace recorder { ); } - OOPETRIS_EXPORTED static helper::expected, std::string> read_from_istream( + OOPETRIS_RECORDINGS_EXPORTED static helper::expected, std::string> read_from_istream( std::istream& istream ); - OOPETRIS_EXPORTED[[nodiscard]] helper::expected, std::string> to_bytes(u32 recursion_depth = 0) const; + OOPETRIS_RECORDINGS_EXPORTED[[nodiscard]] helper::expected, std::string> to_bytes(u32 recursion_depth = 0) const; - OOPETRIS_EXPORTED [[nodiscard]] static std::vector string_to_bytes(const std::string& value); + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] static std::vector string_to_bytes(const std::string& value); private: static helper::expected read_string_from_istream(std::istream& istream); @@ -142,11 +142,11 @@ namespace recorder { explicit AdditionalInformation(UnderlyingContainer&& values); public: - OOPETRIS_EXPORTED explicit AdditionalInformation(); + OOPETRIS_RECORDINGS_EXPORTED explicit AdditionalInformation(); - OOPETRIS_EXPORTED static helper::expected from_istream(std::istream& istream); + OOPETRIS_RECORDINGS_EXPORTED static helper::expected from_istream(std::istream& istream); - OOPETRIS_EXPORTED void add_value(const std::string& key, const InformationValue& value, bool overwrite = false); + OOPETRIS_RECORDINGS_EXPORTED void add_value(const std::string& key, const InformationValue& value, bool overwrite = false); template void add(const std::string& key, const T& raw_value, bool overwrite = false) { @@ -154,9 +154,9 @@ namespace recorder { add_value(key, value, overwrite); } - OOPETRIS_EXPORTED [[nodiscard]] std::optional get(const std::string& key) const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] std::optional get(const std::string& key) const; - OOPETRIS_EXPORTED [[nodiscard]] bool has(const std::string& key) const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] bool has(const std::string& key) const; template [[nodiscard]] std::optional get_if(const std::string& key) const { @@ -174,9 +174,9 @@ namespace recorder { return value.as(); } - OOPETRIS_EXPORTED [[nodiscard]] helper::expected, std::string> to_bytes() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] helper::expected, std::string> to_bytes() const; - OOPETRIS_EXPORTED [[nodiscard]] helper::expected get_checksum() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] helper::expected get_checksum() const; // iterator trait using iterator = UnderlyingContainer::iterator; //NOLINT(readability-identifier-naming) @@ -188,13 +188,13 @@ namespace recorder { using iterator_category = std::bidirectional_iterator_tag; //NOLINT(readability-identifier-naming) - OOPETRIS_EXPORTED [[nodiscard]] iterator begin(); + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] iterator begin(); - OOPETRIS_EXPORTED [[nodiscard]] const_iterator begin() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] const_iterator begin() const; - OOPETRIS_EXPORTED [[nodiscard]] iterator end(); + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] iterator end(); - OOPETRIS_EXPORTED [[nodiscard]] const_iterator end() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] const_iterator end() const; }; STATIC_ASSERT_WITH_MESSAGE( diff --git a/src/libs/recordings/utility/checksum_helper.hpp b/src/libs/recordings/utility/checksum_helper.hpp index abcc32b1..85623c67 100644 --- a/src/libs/recordings/utility/checksum_helper.hpp +++ b/src/libs/recordings/utility/checksum_helper.hpp @@ -4,7 +4,7 @@ #include #include -#include +#include "./windows.hpp" #include #include @@ -28,7 +28,7 @@ struct Sha256Stream { return *this; } - OOPETRIS_EXPORTED Sha256Stream& operator<<(const std::string& value); + OOPETRIS_RECORDINGS_EXPORTED Sha256Stream& operator<<(const std::string& value); template Sha256Stream& operator<<(const std::vector& values) { @@ -48,5 +48,5 @@ struct Sha256Stream { return *this; } - OOPETRIS_EXPORTED [[nodiscard]] Checksum get_hash(); + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] Checksum get_hash(); }; diff --git a/src/libs/recordings/utility/meson.build b/src/libs/recordings/utility/meson.build index d6a782e0..226be796 100644 --- a/src/libs/recordings/utility/meson.build +++ b/src/libs/recordings/utility/meson.build @@ -17,6 +17,7 @@ _header_files = files( 'recording_writer.hpp', 'tetrion_core_information.hpp', 'tetrion_snapshot.hpp', + 'windows.hpp', ) recordings_header_files += _header_files diff --git a/src/libs/recordings/utility/recording.hpp b/src/libs/recordings/utility/recording.hpp index eda2c5cd..85121b0d 100644 --- a/src/libs/recordings/utility/recording.hpp +++ b/src/libs/recordings/utility/recording.hpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include "./windows.hpp" #include "./additional_information.hpp" #include "./checksum_helper.hpp" @@ -37,7 +37,7 @@ namespace recorder { Random::Seed seed; u32 starting_level; - OOPETRIS_EXPORTED TetrionHeader(Random::Seed seed, u32 starting_level); + OOPETRIS_RECORDINGS_EXPORTED TetrionHeader(Random::Seed seed, u32 starting_level); }; struct Recording { @@ -58,11 +58,11 @@ namespace recorder { Recording& operator=(Recording&&) = delete; virtual ~Recording() = default; - OOPETRIS_EXPORTED [[nodiscard]] const std::vector& tetrion_headers() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] const std::vector& tetrion_headers() const; - OOPETRIS_EXPORTED [[nodiscard]] const AdditionalInformation& information() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] const AdditionalInformation& information() const; - OOPETRIS_EXPORTED [[nodiscard]] static Sha256Stream::Checksum get_header_checksum( + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] static Sha256Stream::Checksum get_header_checksum( u8 version_number, const std::vector& tetrion_headers, const AdditionalInformation& information diff --git a/src/libs/recordings/utility/recording_reader.hpp b/src/libs/recordings/utility/recording_reader.hpp index ddce8a50..106bc07e 100644 --- a/src/libs/recordings/utility/recording_reader.hpp +++ b/src/libs/recordings/utility/recording_reader.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include "./windows.hpp" #include "./helper.hpp" @@ -26,21 +26,21 @@ namespace recorder { ); public: - OOPETRIS_EXPORTED RecordingReader(RecordingReader&& old) noexcept; + OOPETRIS_RECORDINGS_EXPORTED RecordingReader(RecordingReader&& old) noexcept; - OOPETRIS_EXPORTED static helper::expected from_path( + OOPETRIS_RECORDINGS_EXPORTED static helper::expected from_path( const std::filesystem::path& path ); - OOPETRIS_EXPORTED [[nodiscard]] const Record& at(usize index) const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] const Record& at(usize index) const; - OOPETRIS_EXPORTED [[nodiscard]] usize num_records() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] usize num_records() const; - OOPETRIS_EXPORTED [[nodiscard]] const UnderlyingContainer& records() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] const UnderlyingContainer& records() const; - OOPETRIS_EXPORTED [[nodiscard]] const std::vector& snapshots() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] const std::vector& snapshots() const; - OOPETRIS_EXPORTED [[nodiscard]] static helper:: + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] static helper:: expected>, std::string> is_header_valid(const std::filesystem::path& path); @@ -53,13 +53,13 @@ namespace recorder { using reference = UnderlyingContainer::reference; //NOLINT(readability-identifier-naming) using iterator_category = std::bidirectional_iterator_tag; //NOLINT(readability-identifier-naming) - OOPETRIS_EXPORTED [[nodiscard]] iterator begin(); + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] iterator begin(); - OOPETRIS_EXPORTED [[nodiscard]] const_iterator begin() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] const_iterator begin() const; - OOPETRIS_EXPORTED [[nodiscard]] iterator end(); + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] iterator end(); - OOPETRIS_EXPORTED [[nodiscard]] const_iterator end() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] const_iterator end() const; private: [[nodiscard]] static helper::expected< diff --git a/src/libs/recordings/utility/recording_writer.hpp b/src/libs/recordings/utility/recording_writer.hpp index 0f3dc0af..376a4c5d 100644 --- a/src/libs/recordings/utility/recording_writer.hpp +++ b/src/libs/recordings/utility/recording_writer.hpp @@ -6,7 +6,7 @@ #include "./tetrion_core_information.hpp" #include -#include +#include "./windows.hpp" #include @@ -23,22 +23,22 @@ namespace recorder { ); public: - OOPETRIS_EXPORTED RecordingWriter(RecordingWriter&& old) noexcept; + OOPETRIS_RECORDINGS_EXPORTED RecordingWriter(RecordingWriter&& old) noexcept; - OOPETRIS_EXPORTED static helper::expected get_writer( + OOPETRIS_RECORDINGS_EXPORTED static helper::expected get_writer( const std::filesystem::path& path, std::vector&& tetrion_headers, AdditionalInformation&& information, bool overwrite = false ); - OOPETRIS_EXPORTED [[nodiscard]] helper::expected add_record( + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] helper::expected add_record( u8 tetrion_index, // NOLINT(bugprone-easily-swappable-parameters) u64 simulation_step_index, InputEvent event ); - OOPETRIS_EXPORTED [[nodiscard]] helper::expected + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] helper::expected add_snapshot(u64 simulation_step_index, std::unique_ptr information); private: diff --git a/src/libs/recordings/utility/tetrion_snapshot.hpp b/src/libs/recordings/utility/tetrion_snapshot.hpp index a47dfb07..3990f48a 100644 --- a/src/libs/recordings/utility/tetrion_snapshot.hpp +++ b/src/libs/recordings/utility/tetrion_snapshot.hpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include "./windows.hpp" #include "./tetrion_core_information.hpp" @@ -30,7 +30,7 @@ struct TetrionSnapshot final { using MinoCount = u64; using Coordinate = u8; - OOPETRIS_EXPORTED TetrionSnapshot( + OOPETRIS_RECORDINGS_EXPORTED TetrionSnapshot( u8 tetrion_index, Level level, Score score, @@ -39,24 +39,24 @@ struct TetrionSnapshot final { MinoStack mino_stack ); - OOPETRIS_EXPORTED static helper::expected from_istream(std::istream& istream); + OOPETRIS_RECORDINGS_EXPORTED static helper::expected from_istream(std::istream& istream); - OOPETRIS_EXPORTED + OOPETRIS_RECORDINGS_EXPORTED TetrionSnapshot(std::unique_ptr information, SimulationStep simulation_step_index); - OOPETRIS_EXPORTED [[nodiscard]] u8 tetrion_index() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] u8 tetrion_index() const; - OOPETRIS_EXPORTED [[nodiscard]] Level level() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] Level level() const; - OOPETRIS_EXPORTED [[nodiscard]] Score score() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] Score score() const; - OOPETRIS_EXPORTED [[nodiscard]] LineCount lines_cleared() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] LineCount lines_cleared() const; - OOPETRIS_EXPORTED [[nodiscard]] u64 simulation_step_index() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] u64 simulation_step_index() const; - OOPETRIS_EXPORTED [[nodiscard]] const MinoStack& mino_stack() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] const MinoStack& mino_stack() const; - OOPETRIS_EXPORTED [[nodiscard]] std::vector to_bytes() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] std::vector to_bytes() const; - OOPETRIS_EXPORTED [[nodiscard]] helper::expected compare_to(const TetrionSnapshot& other) const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] helper::expected compare_to(const TetrionSnapshot& other) const; }; diff --git a/src/libs/recordings/utility/windows.hpp b/src/libs/recordings/utility/windows.hpp new file mode 100644 index 00000000..1ac7bb57 --- /dev/null +++ b/src/libs/recordings/utility/windows.hpp @@ -0,0 +1,11 @@ +#pragma once + +#if defined(_MSC_VER) +#if defined(OOPETRIS_LIBRARY_RECORDINGS_EXPORT) +#define OOPETRIS_RECORDINGS_EXPORTED __declspec(dllexport) +#else +#define OOPETRIS_RECORDINGS_EXPORTED __declspec(dllimport) +#endif +#else +#define OOPETRIS_RECORDINGS_EXPORTED +#endif From 5fc555859c70aa587918fe65da423b88bda5edcc Mon Sep 17 00:00:00 2001 From: "Totto16 (Windows VM)" Date: Thu, 3 Oct 2024 00:12:00 +0200 Subject: [PATCH 10/19] windows: support dll library for oopertis-graphics, part1 add export or import declarations, to be able to build libraries as dll --- src/discord/core.hpp | 34 +++++++------ src/game/bag.hpp | 5 +- src/game/command_line_arguments.hpp | 4 +- src/game/game.hpp | 18 ++++--- src/game/graphic_helpers.hpp | 6 +-- src/game/grid.hpp | 16 ++++-- src/game/rotation.hpp | 10 ++-- src/game/simulated_tetrion.hpp | 53 ++++++++++---------- src/game/simulation.hpp | 13 ++--- src/game/tetrion.hpp | 30 ++++++------ src/game/tetromino.hpp | 25 +++++----- src/graphics/renderer.hpp | 26 +++++----- src/graphics/sdl_context.hpp | 14 +++--- src/graphics/text.hpp | 17 ++++--- src/graphics/texture.hpp | 21 ++++---- src/graphics/window.hpp | 30 ++++++------ src/helper/clock_source.hpp | 22 +++++---- src/helper/console_helpers.hpp | 12 +++-- src/helper/graphic_utils.hpp | 35 +++++++++---- src/helper/meson.build | 1 + src/helper/message_box.hpp | 4 +- src/helper/platform.hpp | 6 ++- src/helper/windows.hpp | 11 +++++ src/input/controller_input.hpp | 35 +++++++------ src/input/game_input.hpp | 24 ++++----- src/input/guid.hpp | 12 +++-- src/input/input.hpp | 73 +++++++++++++++------------ src/input/input_creator.hpp | 13 +++-- src/input/joystick_input.hpp | 76 +++++++++++++++++------------ src/input/keyboard_input.hpp | 33 +++++++------ src/input/mouse_input.hpp | 19 +++++--- src/input/replay_input.hpp | 15 +++--- src/input/touch_input.hpp | 45 ++++++++++------- src/lobby/api.hpp | 43 ++++++++-------- src/manager/font.hpp | 8 +-- src/manager/music_manager.hpp | 33 ++++++++----- src/manager/sdl_controller_key.hpp | 12 +++-- src/manager/sdl_key.hpp | 23 +++++---- src/manager/settings_manager.hpp | 9 ++-- src/meson.build | 1 + 40 files changed, 519 insertions(+), 368 deletions(-) create mode 100644 src/helper/windows.hpp diff --git a/src/discord/core.hpp b/src/discord/core.hpp index c7b3db05..55d917bf 100644 --- a/src/discord/core.hpp +++ b/src/discord/core.hpp @@ -4,6 +4,8 @@ #include +#include "../helper/windows.hpp" + #include #ifdef _WIN32 #ifndef NOMINMAX @@ -38,8 +40,7 @@ namespace constants::discord { // manually synchronized to https://discord.com/developers/applications/1220147916371394650/rich-presence/assets enum class ArtAsset { logo }; - [[nodiscard]] std::string get_asset_key(ArtAsset asset); - + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string get_asset_key(ArtAsset asset); } // namespace constants::discord @@ -51,11 +52,15 @@ struct DiscordActivityWrapper { public: //TODO(Totto): Add support for party and invites / join / invitations / spectate - DiscordActivityWrapper(const std::string& details, discord::ActivityType type); + OOPETRIS_GRAPHICS_EXPORTED DiscordActivityWrapper(const std::string& details, discord::ActivityType type); + + OOPETRIS_GRAPHICS_EXPORTED DiscordActivityWrapper& + set_large_image(const std::string& text, constants::discord::ArtAsset asset); - DiscordActivityWrapper& set_large_image(const std::string& text, constants::discord::ArtAsset asset); - DiscordActivityWrapper& set_small_image(const std::string& text, constants::discord::ArtAsset asset); - DiscordActivityWrapper& set_details(const std::string& text); + OOPETRIS_GRAPHICS_EXPORTED DiscordActivityWrapper& + set_small_image(const std::string& text, constants::discord::ArtAsset asset); + + OOPETRIS_GRAPHICS_EXPORTED DiscordActivityWrapper& set_details(const std::string& text); template DiscordActivityWrapper& set_start_timestamp(const std::chrono::time_point& point) { @@ -82,7 +87,7 @@ struct DiscordActivityWrapper { } - [[nodiscard]] const discord::Activity& get_raw() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const discord::Activity& get_raw() const; }; struct DiscordInstance { @@ -93,17 +98,18 @@ struct DiscordInstance { DiscordInstance(discord::Core* core); public: - [[nodiscard]] static helper::expected initialize(); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] static helper::expected initialize(); + + OOPETRIS_GRAPHICS_EXPORTED void after_setup(); - void after_setup(); + OOPETRIS_GRAPHICS_EXPORTED DiscordInstance(DiscordInstance&& old) noexcept; - DiscordInstance(DiscordInstance&& old) noexcept; - DiscordInstance& operator=(DiscordInstance&& other) noexcept; + OOPETRIS_GRAPHICS_EXPORTED DiscordInstance& operator=(DiscordInstance&& other) noexcept; - ~DiscordInstance(); + OOPETRIS_GRAPHICS_EXPORTED ~DiscordInstance(); - void update(); - void set_activity(const DiscordActivityWrapper& activity); + OOPETRIS_GRAPHICS_EXPORTED void update(); + OOPETRIS_GRAPHICS_EXPORTED void set_activity(const DiscordActivityWrapper& activity); private: void clear_activity(bool wait = true); diff --git a/src/game/bag.hpp b/src/game/bag.hpp index 2774d31c..3bbe1aff 100644 --- a/src/game/bag.hpp +++ b/src/game/bag.hpp @@ -3,6 +3,7 @@ #include #include +#include "../helper/windows.hpp" #include struct Bag final { @@ -10,13 +11,13 @@ struct Bag final { std::array(helper::TetrominoType::LastType) + 1> m_tetromino_sequence; public: - explicit Bag(Random& random); + OOPETRIS_GRAPHICS_EXPORTED explicit Bag(Random& random); static constexpr int size() { return static_cast(helper::TetrominoType::LastType) + 1; } - const helper::TetrominoType& operator[](int index) const; + OOPETRIS_GRAPHICS_EXPORTED const helper::TetrominoType& operator[](int index) const; private: static helper::TetrominoType get_random_tetromino_type(Random& random); diff --git a/src/game/command_line_arguments.hpp b/src/game/command_line_arguments.hpp index 274e6b58..42e79d62 100644 --- a/src/game/command_line_arguments.hpp +++ b/src/game/command_line_arguments.hpp @@ -6,6 +6,8 @@ #include #include +#include "../helper/windows.hpp" + #include #include @@ -20,7 +22,7 @@ struct CommandLineArguments final { Level starting_level; bool silent; - CommandLineArguments( + OOPETRIS_GRAPHICS_EXPORTED CommandLineArguments( std::optional recording_path, std::optional target_fps, Level starting_level = default_starting_level, diff --git a/src/game/game.hpp b/src/game/game.hpp index fbd8e005..3283c0de 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -6,6 +6,7 @@ #include "input/input_creator.hpp" #include "tetrion.hpp" #include "ui/widget.hpp" +#include "helper/windows.hpp" struct Game : public ui::Widget { private: @@ -18,7 +19,7 @@ struct Game : public ui::Widget { bool m_is_paused{ false }; public: - explicit Game( + OOPETRIS_GRAPHICS_EXPORTED explicit Game( ServiceProvider* service_provider, const std::shared_ptr& input, const tetrion::StartingParameters& starting_parameters, @@ -27,17 +28,18 @@ struct Game : public ui::Widget { bool is_top_level ); - void update() override; + OOPETRIS_GRAPHICS_EXPORTED void update() override; - void render(const ServiceProvider& service_provider) const override; - [[nodiscard]] Widget::EventHandleResult + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Widget::EventHandleResult handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; - void set_paused(bool paused); - [[nodiscard]] bool is_paused() const; + OOPETRIS_GRAPHICS_EXPORTED void set_paused(bool paused); - [[nodiscard]] bool is_game_finished() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool is_paused() const; - [[nodiscard]] const std::shared_ptr& game_input() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool is_game_finished() const; + + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const std::shared_ptr& game_input() const; }; diff --git a/src/game/graphic_helpers.hpp b/src/game/graphic_helpers.hpp index c25e49d1..ac3d29e3 100644 --- a/src/game/graphic_helpers.hpp +++ b/src/game/graphic_helpers.hpp @@ -3,7 +3,7 @@ #include #include "manager/service_provider.hpp" - +#include "helper/windows.hpp" enum class MinoTransparency : u8 { // here the enum value is used as index into the preview alpha array @@ -21,7 +21,7 @@ enum class MinoTransparency : u8 { namespace helper::graphics { static constexpr int mino_original_inset = 3; - void render_mino( + OOPETRIS_GRAPHICS_EXPORTED void render_mino( const Mino& mino, const ServiceProvider& service_provider, MinoTransparency transparency, @@ -32,7 +32,7 @@ namespace helper::graphics { ); - void render_minos( + OOPETRIS_GRAPHICS_EXPORTED void render_minos( const MinoStack& mino_stack, const ServiceProvider& service_provider, double original_scale, diff --git a/src/game/grid.hpp b/src/game/grid.hpp index a0ad6bd9..d7580757 100644 --- a/src/game/grid.hpp +++ b/src/game/grid.hpp @@ -7,6 +7,7 @@ #include "manager/service_provider.hpp" #include "ui/layout.hpp" #include "ui/widget.hpp" +#include "helper/windows.hpp" struct Grid final : public ui::Widget { public: @@ -23,12 +24,17 @@ struct Grid final : public ui::Widget { u32 m_tile_size; public: - Grid(const ui::Layout& layout, bool is_top_level); + OOPETRIS_GRAPHICS_EXPORTED Grid(const ui::Layout& layout, bool is_top_level); + [[nodiscard]] shapes::UPoint tile_size() const; - [[nodiscard]] double scale_to_original() const; - [[nodiscard]] shapes::UPoint to_screen_coords(GridPoint grid_coords) const; - void render(const ServiceProvider& service_provider) const override; - [[nodiscard]] helper::BoolWrapper> + + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] double scale_to_original() const; + + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] shapes::UPoint to_screen_coords(GridPoint grid_coords) const; + + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; + + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::BoolWrapper> handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; private: diff --git a/src/game/rotation.hpp b/src/game/rotation.hpp index 3d8e37f4..c025cb1b 100644 --- a/src/game/rotation.hpp +++ b/src/game/rotation.hpp @@ -2,6 +2,8 @@ #include +#include "../helper/windows.hpp" + enum class Rotation : u8 { North = 0, East, @@ -10,10 +12,10 @@ enum class Rotation : u8 { LastRotation = West, }; -Rotation& operator++(Rotation& rotation); +OOPETRIS_GRAPHICS_EXPORTED Rotation& operator++(Rotation& rotation); -Rotation& operator--(Rotation& rotation); +OOPETRIS_GRAPHICS_EXPORTED Rotation& operator--(Rotation& rotation); -Rotation operator+(Rotation rotation, i8 offset); +OOPETRIS_GRAPHICS_EXPORTED Rotation operator+(Rotation rotation, i8 offset); -Rotation operator-(Rotation rotation, i8 offset); +OOPETRIS_GRAPHICS_EXPORTED Rotation operator-(Rotation rotation, i8 offset); diff --git a/src/game/simulated_tetrion.hpp b/src/game/simulated_tetrion.hpp index 5cd6ef98..16e96830 100644 --- a/src/game/simulated_tetrion.hpp +++ b/src/game/simulated_tetrion.hpp @@ -13,6 +13,7 @@ #include "tetromino.hpp" #include "ui/layouts/grid_layout.hpp" #include "ui/widget.hpp" +#include "helper/windows.hpp" #include @@ -90,7 +91,7 @@ struct SimulatedTetrion { m_service_provider; // NOLINT(misc-non-private-member-variables-in-classes,cppcoreguidelines-non-private-member-variables-in-classes) public: - SimulatedTetrion( + OOPETRIS_GRAPHICS_EXPORTED SimulatedTetrion( u8 tetrion_index, Random::Seed random_seed, u32 starting_level, @@ -98,36 +99,36 @@ struct SimulatedTetrion { std::optional> recording_writer ); - virtual ~SimulatedTetrion(); + OOPETRIS_GRAPHICS_EXPORTED virtual ~SimulatedTetrion(); - SimulatedTetrion(const SimulatedTetrion& other); - SimulatedTetrion& operator=(const SimulatedTetrion& other) = delete; + OOPETRIS_GRAPHICS_EXPORTED SimulatedTetrion(const SimulatedTetrion& other); + OOPETRIS_GRAPHICS_EXPORTED SimulatedTetrion& operator=(const SimulatedTetrion& other) = delete; - SimulatedTetrion(SimulatedTetrion&& other) noexcept; - SimulatedTetrion& operator=(SimulatedTetrion&& other) noexcept = delete; + OOPETRIS_GRAPHICS_EXPORTED SimulatedTetrion(SimulatedTetrion&& other) noexcept; + OOPETRIS_GRAPHICS_EXPORTED SimulatedTetrion& operator=(SimulatedTetrion&& other) noexcept = delete; - void update_step(SimulationStep simulation_step_index); + OOPETRIS_GRAPHICS_EXPORTED void update_step(SimulationStep simulation_step_index); // returns if the input event lead to a movement - bool handle_input_command(input::GameInputCommand command, SimulationStep simulation_step_index); - void spawn_next_tetromino(SimulationStep simulation_step_index); - void spawn_next_tetromino(helper::TetrominoType type, SimulationStep simulation_step_index); - bool rotate_tetromino_right(); - bool rotate_tetromino_left(); - bool move_tetromino_down(MovementType movement_type, SimulationStep simulation_step_index); - bool move_tetromino_left(); - bool move_tetromino_right(); - bool drop_tetromino(SimulationStep simulation_step_index); - void hold_tetromino(SimulationStep simulation_step_index); - - [[nodiscard]] u8 tetrion_index() const; - [[nodiscard]] u32 level() const; - [[nodiscard]] u64 score() const; - [[nodiscard]] u32 lines_cleared() const; - [[nodiscard]] const MinoStack& mino_stack() const; - [[nodiscard]] std::unique_ptr core_information() const; - - [[nodiscard]] bool is_game_over() const; + OOPETRIS_GRAPHICS_EXPORTED bool handle_input_command(input::GameInputCommand command, SimulationStep simulation_step_index); + OOPETRIS_GRAPHICS_EXPORTED void spawn_next_tetromino(SimulationStep simulation_step_index); + OOPETRIS_GRAPHICS_EXPORTED void spawn_next_tetromino(helper::TetrominoType type, SimulationStep simulation_step_index); + OOPETRIS_GRAPHICS_EXPORTED bool rotate_tetromino_right(); + OOPETRIS_GRAPHICS_EXPORTED bool rotate_tetromino_left(); + OOPETRIS_GRAPHICS_EXPORTED bool move_tetromino_down(MovementType movement_type, SimulationStep simulation_step_index); + OOPETRIS_GRAPHICS_EXPORTED bool move_tetromino_left(); + OOPETRIS_GRAPHICS_EXPORTED bool move_tetromino_right(); + OOPETRIS_GRAPHICS_EXPORTED bool drop_tetromino(SimulationStep simulation_step_index); + OOPETRIS_GRAPHICS_EXPORTED void hold_tetromino(SimulationStep simulation_step_index); + + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] u8 tetrion_index() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] u32 level() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] u64 score() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] u32 lines_cleared() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const MinoStack& mino_stack() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::unique_ptr core_information() const; + + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool is_game_over() const; private: template diff --git a/src/game/simulation.hpp b/src/game/simulation.hpp index 001c1e30..37d07305 100644 --- a/src/game/simulation.hpp +++ b/src/game/simulation.hpp @@ -6,6 +6,7 @@ #include "input/input_creator.hpp" #include "input/replay_input.hpp" #include "simulated_tetrion.hpp" +#include "helper/windows.hpp" struct Simulation { private: @@ -16,16 +17,16 @@ struct Simulation { std::shared_ptr m_input; public: - explicit Simulation( + OOPETRIS_GRAPHICS_EXPORTED explicit Simulation( const std::shared_ptr& input, const tetrion::StartingParameters& starting_parameters ); + OOPETRIS_GRAPHICS_EXPORTED static helper::expected get_replay_simulation( + std::filesystem::path& recording_path + ); - static helper::expected get_replay_simulation(std::filesystem::path& recording_path); - - void update(); - + OOPETRIS_GRAPHICS_EXPORTED void update(); - [[nodiscard]] bool is_game_finished() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool is_game_finished() const; }; diff --git a/src/game/tetrion.hpp b/src/game/tetrion.hpp index bd4f37cb..90dd297f 100644 --- a/src/game/tetrion.hpp +++ b/src/game/tetrion.hpp @@ -11,7 +11,7 @@ #include "ui/layout.hpp" #include "ui/layouts/tile_layout.hpp" #include "ui/widget.hpp" - +#include "helper/windows.hpp" namespace recorder { struct RecordingWriter; @@ -27,30 +27,32 @@ struct Tetrion final : public ui::Widget, SimulatedTetrion { public: - Tetrion(u8 tetrion_index, + OOPETRIS_GRAPHICS_EXPORTED Tetrion( + u8 tetrion_index, Random::Seed random_seed, u32 starting_level, ServiceProvider* service_provider, std::optional> recording_writer, const ui::Layout& layout, - bool is_top_level); + bool is_top_level + ); - ~Tetrion() override; + OOPETRIS_GRAPHICS_EXPORTED ~Tetrion() override; - Tetrion(const Tetrion& other) = delete; - Tetrion& operator=(const Tetrion& other) = delete; + OOPETRIS_GRAPHICS_EXPORTED Tetrion(const Tetrion& other) = delete; + OOPETRIS_GRAPHICS_EXPORTED Tetrion& operator=(const Tetrion& other) = delete; - Tetrion(Tetrion&& other) noexcept = delete; - Tetrion& operator=(Tetrion&& other) noexcept = delete; + OOPETRIS_GRAPHICS_EXPORTED Tetrion(Tetrion&& other) noexcept = delete; + OOPETRIS_GRAPHICS_EXPORTED Tetrion& operator=(Tetrion&& other) noexcept = delete; - void render(const ServiceProvider& service_provider) const override; - [[nodiscard]] Widget::EventHandleResult + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Widget::EventHandleResult handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; - [[nodiscard]] Grid* get_grid(); - [[nodiscard]] const Grid* get_grid() const; - [[nodiscard]] ui::GridLayout* get_text_layout(); - [[nodiscard]] const ui::GridLayout* get_text_layout() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Grid* get_grid(); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const Grid* get_grid() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] ui::GridLayout* get_text_layout(); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const ui::GridLayout* get_text_layout() const; private: void refresh_texts() override; diff --git a/src/game/tetromino.hpp b/src/game/tetromino.hpp index 5b83840a..3c81e974 100644 --- a/src/game/tetromino.hpp +++ b/src/game/tetromino.hpp @@ -4,6 +4,7 @@ #include "graphic_helpers.hpp" #include "rotation.hpp" +#include "helper/windows.hpp" #include @@ -22,15 +23,15 @@ struct Tetromino final { using TetrominoPoint = shapes::AbstractPoint; using Pattern = std::array; - Tetromino(GridPoint position, helper::TetrominoType type) + OOPETRIS_GRAPHICS_EXPORTED Tetromino(GridPoint position, helper::TetrominoType type) : m_position{ position }, m_type{ type }, m_minos{ create_minos(position, m_rotation, type) } { } - [[nodiscard]] helper::TetrominoType type() const; - [[nodiscard]] Rotation rotation() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::TetrominoType type() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Rotation rotation() const; - void render( + OOPETRIS_GRAPHICS_EXPORTED void render( const ServiceProvider& service_provider, MinoTransparency transparency, double original_scale, @@ -39,15 +40,15 @@ struct Tetromino final { const GridPoint& offset = GridPoint::zero() ) const; - void rotate_right(); - void rotate_left(); - void move_down(); - void move_up(); - void move_left(); - void move_right(); - void move(shapes::AbstractPoint offset); + OOPETRIS_GRAPHICS_EXPORTED void rotate_right(); + OOPETRIS_GRAPHICS_EXPORTED void rotate_left(); + OOPETRIS_GRAPHICS_EXPORTED void move_down(); + OOPETRIS_GRAPHICS_EXPORTED void move_up(); + OOPETRIS_GRAPHICS_EXPORTED void move_left(); + OOPETRIS_GRAPHICS_EXPORTED void move_right(); + OOPETRIS_GRAPHICS_EXPORTED void move(shapes::AbstractPoint offset); - [[nodiscard]] const std::array& minos() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const std::array& minos() const; private: diff --git a/src/graphics/renderer.hpp b/src/graphics/renderer.hpp index 44715b02..07639ace 100644 --- a/src/graphics/renderer.hpp +++ b/src/graphics/renderer.hpp @@ -6,6 +6,7 @@ #include "rect.hpp" #include "texture.hpp" #include "window.hpp" +#include "helper/windows.hpp" #include #include @@ -22,13 +23,13 @@ struct Renderer final { SDL_Renderer* m_renderer; public: - explicit Renderer(const Window& window, VSync v_sync); - Renderer(const Renderer&) = delete; - Renderer& operator=(const Renderer&) = delete; - ~Renderer(); + OOPETRIS_GRAPHICS_EXPORTED explicit Renderer(const Window& window, VSync v_sync); + OOPETRIS_GRAPHICS_EXPORTED Renderer(const Renderer&) = delete; + OOPETRIS_GRAPHICS_EXPORTED Renderer& operator=(const Renderer&) = delete; + OOPETRIS_GRAPHICS_EXPORTED ~Renderer(); - void set_draw_color(const Color& color) const; - void clear(const Color& clear_color = Color::black()) const; + OOPETRIS_GRAPHICS_EXPORTED void set_draw_color(const Color& color) const; + OOPETRIS_GRAPHICS_EXPORTED void clear(const Color& clear_color = Color::black()) const; template void draw_rect_filled(const shapes::AbstractRect& rect, const Color& color) const { @@ -77,21 +78,20 @@ struct Renderer final { texture.render(m_renderer, from, to); } - [[nodiscard]] Texture load_image(const std::filesystem::path& image_path) const; - [[nodiscard]] Texture prerender_text( + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Texture load_image(const std::filesystem::path& image_path) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Texture prerender_text( const std::string& text, const Font& font, const Color& color, RenderType render_type = RenderType::Blended, const Color& background_color = Color::black() ) const; - [[nodiscard]] Texture get_texture_for_render_target(const shapes::UPoint& size) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Texture get_texture_for_render_target(const shapes::UPoint& size) const; - void set_render_target(const Texture& texture) const; - void reset_render_target() const; + OOPETRIS_GRAPHICS_EXPORTED void set_render_target(const Texture& texture) const; + OOPETRIS_GRAPHICS_EXPORTED void reset_render_target() const; - - void present() const; + OOPETRIS_GRAPHICS_EXPORTED void present() const; private: void draw_self_computed_circle_impl(const shapes::IPoint& center, i32 diameter) const; diff --git a/src/graphics/sdl_context.hpp b/src/graphics/sdl_context.hpp index 58c9bbe5..98f583d5 100644 --- a/src/graphics/sdl_context.hpp +++ b/src/graphics/sdl_context.hpp @@ -1,10 +1,12 @@ #pragma once +#include "helper/windows.hpp" + struct SdlContext final { - SdlContext(); - SdlContext(const SdlContext&) = delete; - SdlContext(SdlContext&&) = delete; - SdlContext& operator=(const SdlContext&) = delete; - SdlContext& operator=(SdlContext&&) = delete; - ~SdlContext(); + OOPETRIS_GRAPHICS_EXPORTED SdlContext(); + OOPETRIS_GRAPHICS_EXPORTED SdlContext(const SdlContext&) = delete; + OOPETRIS_GRAPHICS_EXPORTED SdlContext(SdlContext&&) = delete; + OOPETRIS_GRAPHICS_EXPORTED SdlContext& operator=(const SdlContext&) = delete; + OOPETRIS_GRAPHICS_EXPORTED SdlContext& operator=(SdlContext&&) = delete; + OOPETRIS_GRAPHICS_EXPORTED ~SdlContext(); }; diff --git a/src/graphics/text.hpp b/src/graphics/text.hpp index 319b6132..6b21d59f 100644 --- a/src/graphics/text.hpp +++ b/src/graphics/text.hpp @@ -6,6 +6,7 @@ #include "manager/service_provider.hpp" #include "rect.hpp" #include "texture.hpp" +#include "helper/windows.hpp" struct Text final { private: @@ -15,12 +16,14 @@ struct Text final { Texture m_text; public: - Text(const ServiceProvider* service_provider, - const std::string& text, - const Font& font, - const Color& color, - const shapes::URect& dest); + OOPETRIS_GRAPHICS_EXPORTED Text( + const ServiceProvider* service_provider, + const std::string& text, + const Font& font, + const Color& color, + const shapes::URect& dest + ); - void render(const ServiceProvider& service_provider) const; - void set_text(const ServiceProvider& service_provider, const std::string& text); + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const; + OOPETRIS_GRAPHICS_EXPORTED void set_text(const ServiceProvider& service_provider, const std::string& text); }; diff --git a/src/graphics/texture.hpp b/src/graphics/texture.hpp index 872b38e1..e27f8c52 100644 --- a/src/graphics/texture.hpp +++ b/src/graphics/texture.hpp @@ -8,6 +8,7 @@ #include "manager/font.hpp" #include "rect.hpp" +#include "helper/windows.hpp" #include #include @@ -25,9 +26,9 @@ struct Texture { explicit Texture(SDL_Texture* raw_texture); public: - static Texture from_image(SDL_Renderer* renderer, const std::filesystem::path& image_path); + OOPETRIS_GRAPHICS_EXPORTED static Texture from_image(SDL_Renderer* renderer, const std::filesystem::path& image_path); - static Texture prerender_text( + OOPETRIS_GRAPHICS_EXPORTED static Texture prerender_text( SDL_Renderer* renderer, const std::string& text, const Font& font, @@ -36,16 +37,16 @@ struct Texture { const Color& background_color ); - static Texture get_for_render_target(SDL_Renderer* renderer, const shapes::UPoint& size); + OOPETRIS_GRAPHICS_EXPORTED static Texture get_for_render_target(SDL_Renderer* renderer, const shapes::UPoint& size); - Texture(const Texture&) = delete; - Texture& operator=(const Texture&) = delete; + OOPETRIS_GRAPHICS_EXPORTED Texture(const Texture&) = delete; + OOPETRIS_GRAPHICS_EXPORTED Texture& operator=(const Texture&) = delete; - Texture(Texture&& old) noexcept; + OOPETRIS_GRAPHICS_EXPORTED Texture(Texture&& old) noexcept; - Texture& operator=(Texture&& other) noexcept; + OOPETRIS_GRAPHICS_EXPORTED Texture& operator=(Texture&& other) noexcept; - ~Texture(); + OOPETRIS_GRAPHICS_EXPORTED ~Texture(); template void render(SDL_Renderer* renderer, const shapes::AbstractRect& rect) const { @@ -60,7 +61,7 @@ struct Texture { SDL_RenderCopy(renderer, m_raw_texture, &from_rect_sdl, &to_rect_sdl); } - [[nodiscard]] shapes::UPoint size() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] shapes::UPoint size() const; - void set_as_render_target(SDL_Renderer* renderer) const; + OOPETRIS_GRAPHICS_EXPORTED void set_as_render_target(SDL_Renderer* renderer) const; }; diff --git a/src/graphics/window.hpp b/src/graphics/window.hpp index 7ea426c6..39020634 100644 --- a/src/graphics/window.hpp +++ b/src/graphics/window.hpp @@ -5,6 +5,7 @@ #include "graphics/rect.hpp" #include "helper/message_box.hpp" #include "sdl_context.hpp" +#include "helper/windows.hpp" #include #include @@ -20,23 +21,24 @@ struct Window final { SdlContext m_context; public: - Window(const std::string& title, WindowPosition position, u32 width, u32 height); - Window(const std::string& title, u32 x, u32 y, u32 width, u32 height); - Window(const std::string& title, WindowPosition position); - Window(const std::string& title, u32 x, u32 y); - Window(const Window&) = delete; - Window(Window&&) = delete; - Window& operator=(const Window&) = delete; - Window& operator=(Window&&) = delete; - ~Window(); + OOPETRIS_GRAPHICS_EXPORTED Window(const std::string& title, WindowPosition position, u32 width, u32 height); + OOPETRIS_GRAPHICS_EXPORTED Window(const std::string& title, u32 x, u32 y, u32 width, u32 height); + OOPETRIS_GRAPHICS_EXPORTED Window(const std::string& title, WindowPosition position); + OOPETRIS_GRAPHICS_EXPORTED Window(const std::string& title, u32 x, u32 y); + OOPETRIS_GRAPHICS_EXPORTED Window(const Window&) = delete; + OOPETRIS_GRAPHICS_EXPORTED Window(Window&&) = delete; + OOPETRIS_GRAPHICS_EXPORTED Window& operator=(const Window&) = delete; + OOPETRIS_GRAPHICS_EXPORTED Window& operator=(Window&&) = delete; + OOPETRIS_GRAPHICS_EXPORTED ~Window(); - [[nodiscard]] shapes::UPoint size() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] shapes::UPoint size() const; - [[nodiscard]] SDL_Window* get_sdl_window() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] SDL_Window* get_sdl_window() const; - [[nodiscard]] const SdlContext& context() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const SdlContext& context() const; - [[nodiscard]] shapes::URect screen_rect() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] shapes::URect screen_rect() const; - void show_simple(helper::MessageBox::Type type, const std::string& title, const std::string& content) const; + OOPETRIS_GRAPHICS_EXPORTED void + show_simple(helper::MessageBox::Type type, const std::string& title, const std::string& content) const; }; diff --git a/src/helper/clock_source.hpp b/src/helper/clock_source.hpp index 91db02c6..bd3ad3c5 100644 --- a/src/helper/clock_source.hpp +++ b/src/helper/clock_source.hpp @@ -3,16 +3,18 @@ #include +#include "./windows.hpp" + #include #include struct ClockSource { - virtual ~ClockSource() = default; + OOPETRIS_GRAPHICS_EXPORTED virtual ~ClockSource() = default; - [[nodiscard]] virtual SimulationStep simulation_step_index() const = 0; - [[nodiscard]] virtual bool can_be_paused() = 0; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] virtual SimulationStep simulation_step_index() const = 0; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] virtual bool can_be_paused() = 0; - virtual void pause() { + OOPETRIS_GRAPHICS_EXPORTED virtual void pause() { throw std::runtime_error("not implemented"); } @@ -20,7 +22,7 @@ struct ClockSource { * @brief Resumes the clock. * @return The duration of the pause. */ - virtual double resume() { + OOPETRIS_GRAPHICS_EXPORTED virtual double resume() { throw std::runtime_error("not implemented"); }; }; @@ -32,9 +34,9 @@ struct LocalClock : public ClockSource { std::optional m_paused_at; public: - explicit LocalClock(u32 target_frequency); - [[nodiscard]] SimulationStep simulation_step_index() const override; - bool can_be_paused() override; - void pause() override; - double resume() override; + OOPETRIS_GRAPHICS_EXPORTED explicit LocalClock(u32 target_frequency); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] SimulationStep simulation_step_index() const override; + OOPETRIS_GRAPHICS_EXPORTED bool can_be_paused() override; + OOPETRIS_GRAPHICS_EXPORTED void pause() override; + OOPETRIS_GRAPHICS_EXPORTED double resume() override; }; diff --git a/src/helper/console_helpers.hpp b/src/helper/console_helpers.hpp index 05df762d..9bcf5c43 100644 --- a/src/helper/console_helpers.hpp +++ b/src/helper/console_helpers.hpp @@ -6,9 +6,11 @@ #include +#include "./windows.hpp" + namespace console { - void debug_write(const char* text, size_t size); + OOPETRIS_GRAPHICS_EXPORTED void debug_write(const char* text, size_t size); inline void debug_print(const char* text) { debug_write(text, strlen(text)); @@ -18,13 +20,13 @@ namespace console { debug_write(value.c_str(), value.size()); } - [[nodiscard]] std::string open_url(const std::string& url); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string open_url(const std::string& url); - void platform_init(); + OOPETRIS_GRAPHICS_EXPORTED void platform_init(); - void platform_exit(); + OOPETRIS_GRAPHICS_EXPORTED void platform_exit(); - [[nodiscard]] bool inMainLoop(); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool inMainLoop(); template diff --git a/src/helper/graphic_utils.hpp b/src/helper/graphic_utils.hpp index 4550ce0a..e4a20f8f 100644 --- a/src/helper/graphic_utils.hpp +++ b/src/helper/graphic_utils.hpp @@ -3,37 +3,52 @@ #include +#include "./windows.hpp" #include "helper/constants.hpp" - #include #include namespace utils { - [[nodiscard]] SDL_Color sdl_color_from_color(const Color& color); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] SDL_Color sdl_color_from_color(const Color& color); - [[nodiscard]] std::vector supported_features(); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::vector supported_features(); - [[nodiscard]] std::filesystem::path get_assets_folder(); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::filesystem::path get_assets_folder(); - [[nodiscard]] std::filesystem::path get_root_folder(); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::filesystem::path get_root_folder(); - std::optional log_error(const std::string& error); + OOPETRIS_GRAPHICS_EXPORTED std::optional log_error(const std::string& error); struct ExitException : std::exception { private: int m_status_code; public: - explicit ExitException(int status_code) noexcept; + OOPETRIS_GRAPHICS_EXPORTED explicit ExitException(int status_code) noexcept; - [[nodiscard]] int status_code() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] int status_code() const; - [[nodiscard]] const char* what() const noexcept override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const char* what() const noexcept override; }; - [[noreturn]] void exit(int status_code); +// this needs some special handling, so the macro is defined here +#if defined(_MSC_VER) +#if defined(OOPETRIS_LIBRARY_GRAPHICS_EXPORT) +#define OOPETRIS_GRAPHICS_EXPORTED_NORETURN __declspec(dllexport, noreturn) +#else +#define OOPETRIS_GRAPHICS_EXPORTED_NORETURN __declspec(dllimport, noreturn) +#endif +#else +#define OOPETRIS_GRAPHICS_EXPORTED_NORETURN +#endif + + + OOPETRIS_GRAPHICS_EXPORTED_NORETURN void exit(int status_code); + + +#undef OOPETRIS_GRAPHICS_EXPORTED_NORETURN } // namespace utils diff --git a/src/helper/meson.build b/src/helper/meson.build index f7210ff3..d5823266 100644 --- a/src/helper/meson.build +++ b/src/helper/meson.build @@ -12,6 +12,7 @@ graphics_src_files += files( 'music_utils.hpp', 'platform.cpp', 'platform.hpp', + 'windows.hpp' ) if have_file_dialogs diff --git a/src/helper/message_box.hpp b/src/helper/message_box.hpp index 88a804e7..61dc8da7 100644 --- a/src/helper/message_box.hpp +++ b/src/helper/message_box.hpp @@ -5,6 +5,7 @@ #include #include +#include "./windows.hpp" namespace helper { @@ -23,7 +24,8 @@ namespace helper { /*** * \brief This blocks the current thread and should be called on the thread, the parent windows was created (if that is nullptr, it may be on another thread, but not otherwise) */ - static void show_simple(Type type, const std::string& title, const std::string& content, SDL_Window* window); + OOPETRIS_GRAPHICS_EXPORTED static void + show_simple(Type type, const std::string& title, const std::string& content, SDL_Window* window); //TODO(Totto): add option to use the complicated API, that supports more buttons and also a result which button was pressed! }; diff --git a/src/helper/platform.hpp b/src/helper/platform.hpp index 305a7c8e..f2d57258 100644 --- a/src/helper/platform.hpp +++ b/src/helper/platform.hpp @@ -6,6 +6,8 @@ #include +#include "./windows.hpp" + enum class Platform : u8 { PC, Android, Console }; @@ -38,8 +40,8 @@ namespace utils { } - [[nodiscard]] std::string built_for_platform(); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string built_for_platform(); - [[nodiscard]] bool open_url(const std::string& url); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool open_url(const std::string& url); } // namespace utils diff --git a/src/helper/windows.hpp b/src/helper/windows.hpp new file mode 100644 index 00000000..9b4270be --- /dev/null +++ b/src/helper/windows.hpp @@ -0,0 +1,11 @@ +#pragma once + +#if defined(_MSC_VER) +#if defined(OOPETRIS_LIBRARY_GRAPHICS_EXPORT) +#define OOPETRIS_GRAPHICS_EXPORTED __declspec(dllexport) +#else +#define OOPETRIS_GRAPHICS_EXPORTED __declspec(dllimport) +#endif +#else +#define OOPETRIS_GRAPHICS_EXPORTED +#endif diff --git a/src/input/controller_input.hpp b/src/input/controller_input.hpp index 7d2a577e..0d4c1d44 100644 --- a/src/input/controller_input.hpp +++ b/src/input/controller_input.hpp @@ -5,6 +5,7 @@ #include "input.hpp" #include "joystick_input.hpp" #include "manager/sdl_controller_key.hpp" +#include "helper/windows.hpp" namespace input { @@ -13,23 +14,26 @@ namespace input { SDL_GameController* m_controller; public: + OOPETRIS_GRAPHICS_EXPORTED ControllerInput(SDL_GameController* m_controller, SDL_JoystickID instance_id, const std::string& name); - ~ControllerInput() override; + OOPETRIS_GRAPHICS_EXPORTED ~ControllerInput() override; - ControllerInput(const ControllerInput& input) noexcept; - ControllerInput& operator=(const ControllerInput& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED ControllerInput(const ControllerInput& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED ControllerInput& operator=(const ControllerInput& input) noexcept; - ControllerInput(ControllerInput&& input) noexcept; - ControllerInput& operator=(ControllerInput&& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED ControllerInput(ControllerInput&& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED ControllerInput& operator=(ControllerInput&& input) noexcept; - [[nodiscard]] static helper::expected, std::string> get_by_device_index( - int device_index - ); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] static helper::expected, std::string> + get_by_device_index(int device_index); - [[nodiscard]] std::optional get_navigation_event(const SDL_Event& event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional get_navigation_event( + const SDL_Event& event + ) const override; - [[nodiscard]] std::string describe_navigation_event(NavigationEvent event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string describe_navigation_event(NavigationEvent event + ) const override; private: [[nodiscard]] std::optional handle_axis_navigation_event(const SDL_Event& event) const; @@ -48,7 +52,7 @@ namespace input { sdl::ControllerKey open_settings; - [[nodiscard]] helper::expected validate() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected validate() const; [[nodiscard]] static ControllerSettings default_settings() { @@ -72,17 +76,18 @@ namespace input { public: - ControllerGameInput( + OOPETRIS_GRAPHICS_EXPORTED ControllerGameInput( ControllerSettings settings, EventDispatcher* event_dispatcher, ControllerInput* underlying_input ); - [[nodiscard]] std::optional get_menu_event(const SDL_Event& event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional get_menu_event(const SDL_Event& event + ) const override; - [[nodiscard]] std::string describe_menu_event(MenuEvent event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string describe_menu_event(MenuEvent event) const override; - [[nodiscard]] const ControllerInput* underlying_input() const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const ControllerInput* underlying_input() const override; protected: [[nodiscard]] std::optional sdl_event_to_input_event(const SDL_Event& event) const override; diff --git a/src/input/game_input.hpp b/src/input/game_input.hpp index 12b2ae8d..dd170568 100644 --- a/src/input/game_input.hpp +++ b/src/input/game_input.hpp @@ -4,11 +4,12 @@ #include #include - #include #include #include +#include "helper/windows.hpp" + struct SimulatedTetrion; namespace input { @@ -64,21 +65,22 @@ namespace input { } public: - GameInput(const GameInput&) = delete; - GameInput& operator=(const GameInput&) = delete; + OOPETRIS_GRAPHICS_EXPORTED GameInput(const GameInput&) = delete; + OOPETRIS_GRAPHICS_EXPORTED GameInput& operator=(const GameInput&) = delete; - GameInput(GameInput&&) = default; - GameInput& operator=(GameInput&&) = default; + OOPETRIS_GRAPHICS_EXPORTED GameInput(GameInput&&) = default; + OOPETRIS_GRAPHICS_EXPORTED GameInput& operator=(GameInput&&) = default; - virtual ~GameInput() = default; + OOPETRIS_GRAPHICS_EXPORTED virtual ~GameInput() = default; - virtual void update(SimulationStep simulation_step_index); - virtual void late_update(SimulationStep /*simulation_step*/){}; + OOPETRIS_GRAPHICS_EXPORTED virtual void update(SimulationStep simulation_step_index); + OOPETRIS_GRAPHICS_EXPORTED virtual void late_update(SimulationStep /*simulation_step*/){}; - [[nodiscard]] virtual std::optional get_menu_event(const SDL_Event& event) const = 0; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] virtual std::optional get_menu_event(const SDL_Event& event + ) const = 0; - [[nodiscard]] virtual std::string describe_menu_event(MenuEvent event) const = 0; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] virtual std::string describe_menu_event(MenuEvent event) const = 0; [[nodiscard]] GameInputType input_type() const { return m_input_type; @@ -98,6 +100,6 @@ namespace input { } - [[nodiscard]] virtual const Input* underlying_input() const = 0; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] virtual const Input* underlying_input() const = 0; }; } // namespace input diff --git a/src/input/guid.hpp b/src/input/guid.hpp index c82e9b60..c756ee12 100644 --- a/src/input/guid.hpp +++ b/src/input/guid.hpp @@ -10,6 +10,8 @@ #include #include +#include "helper/windows.hpp" + extern "C" { #if SDL_MAJOR_VERSION < 2 || SDL_MINOR_VERSION < 30 || SDL_PATCHLEVEL < 0 typedef SDL_JoystickGUID SDL_GUID; //NOLINT(modernize-use-using), it's used in extern C, there is no using @@ -32,13 +34,15 @@ namespace sdl { constexpr GUID() : m_guid{} { } explicit constexpr GUID(const ArrayType& data) : m_guid{ data } { } - explicit GUID(const SDL_GUID& data); + OOPETRIS_GRAPHICS_EXPORTED explicit GUID(const SDL_GUID& data); - [[nodiscard]] static helper::expected from_string(const std::string& value); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] static helper::expected from_string( + const std::string& value + ); - [[nodiscard]] bool operator==(const GUID& other) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool operator==(const GUID& other) const; - [[nodiscard]] std::string to_string(FormatType type = FormatType::Long) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string to_string(FormatType type = FormatType::Long) const; }; } // namespace sdl diff --git a/src/input/input.hpp b/src/input/input.hpp index 60096b32..93f0d37b 100644 --- a/src/input/input.hpp +++ b/src/input/input.hpp @@ -9,7 +9,7 @@ #include "game_input.hpp" #include "graphics/rect.hpp" #include "graphics/window.hpp" - +#include "helper/windows.hpp" #include "manager/service_provider.hpp" @@ -33,22 +33,25 @@ namespace input { InputType m_type; public: - Input(std::string name, InputType type); + OOPETRIS_GRAPHICS_EXPORTED Input(std::string name, InputType type); - virtual ~Input(); + OOPETRIS_GRAPHICS_EXPORTED virtual ~Input(); - Input(const Input& input) noexcept; - Input& operator=(const Input& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED Input(const Input& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED Input& operator=(const Input& input) noexcept; - Input(Input&& input) noexcept; - Input& operator=(Input&& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED Input(Input&& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED Input& operator=(Input&& input) noexcept; - [[nodiscard]] const std::string& name() const; - [[nodiscard]] InputType type() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const std::string& name() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] InputType type() const; - [[nodiscard]] virtual std::optional get_navigation_event(const SDL_Event& event) const = 0; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] virtual std::optional get_navigation_event( + const SDL_Event& event + ) const = 0; - [[nodiscard]] virtual std::string describe_navigation_event(NavigationEvent event) const = 0; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] virtual std::string describe_navigation_event(NavigationEvent event + ) const = 0; }; enum class PointerEvent : u8 { Motion, PointerDown, PointerUp, Wheel }; @@ -59,27 +62,29 @@ namespace input { PointerEvent m_event; public: - PointerEventHelper(shapes::IPoint pos, PointerEvent event); + OOPETRIS_GRAPHICS_EXPORTED PointerEventHelper(shapes::IPoint pos, PointerEvent event); - [[nodiscard]] PointerEvent event() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] PointerEvent event() const; - [[nodiscard]] shapes::IPoint position() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] shapes::IPoint position() const; - [[nodiscard]] bool is_in(const shapes::URect& rect) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool is_in(const shapes::URect& rect) const; - [[nodiscard]] bool is_in(const shapes::IRect& rect) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool is_in(const shapes::IRect& rect) const; - [[nodiscard]] bool operator==(PointerEvent event) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool operator==(PointerEvent event) const; }; struct PointerInput : Input { - explicit PointerInput(const std::string& name); + OOPETRIS_GRAPHICS_EXPORTED explicit PointerInput(const std::string& name); - [[nodiscard]] virtual std::optional get_pointer_event(const SDL_Event& event) const = 0; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] virtual std::optional get_pointer_event( + const SDL_Event& event + ) const = 0; - [[nodiscard]] virtual SDL_Event offset_pointer_event(const SDL_Event& event, const shapes::IPoint& point) - const = 0; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] virtual SDL_Event + offset_pointer_event(const SDL_Event& event, const shapes::IPoint& point) const = 0; }; struct InputManager { @@ -87,13 +92,17 @@ namespace input { std::vector> m_inputs; public: - explicit InputManager(const std::shared_ptr& window); + OOPETRIS_GRAPHICS_EXPORTED explicit InputManager(const std::shared_ptr& window); - [[nodiscard]] const std::vector>& inputs() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const std::vector>& inputs() const; - [[nodiscard]] std::optional get_navigation_event(const SDL_Event& event) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional get_navigation_event( + const SDL_Event& event + ) const; - [[nodiscard]] std::optional get_pointer_event(const SDL_Event& event) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional get_pointer_event( + const SDL_Event& event + ) const; /** * @brief Offsets a pointer event, only safe to call, if get_pointer_event returns a non null optional @@ -102,15 +111,17 @@ namespace input { * @param point the point to offset it by * @return SDL_Event which has the correct offset */ - [[nodiscard]] SDL_Event offset_pointer_event(const SDL_Event& event, const shapes::IPoint& point) const; - - [[nodiscard]] helper::BoolWrapper process_special_inputs(const SDL_Event& event); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] SDL_Event + offset_pointer_event(const SDL_Event& event, const shapes::IPoint& point) const; - [[nodiscard]] helper::expected, std::string> get_game_input( - ServiceProvider* service_provider + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::BoolWrapper process_special_inputs( + const SDL_Event& event ); - [[nodiscard]] const input::Input* get_primary_input(); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected, std::string> + get_game_input(ServiceProvider* service_provider); + + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const input::Input* get_primary_input(); }; diff --git a/src/input/input_creator.hpp b/src/input/input_creator.hpp index 5e720fd7..7398307f 100644 --- a/src/input/input_creator.hpp +++ b/src/input/input_creator.hpp @@ -4,10 +4,10 @@ #include #include +#include "helper/windows.hpp" #include "input/game_input.hpp" #include "manager/service_provider.hpp" - #include namespace tetrion { @@ -37,10 +37,15 @@ namespace input { using AdditionalInfo = std::tuple, tetrion::StartingParameters>; - [[nodiscard]] std::pair, recorder::AdditionalInformation> - get_game_parameters_for_replay(ServiceProvider* service_provider, const std::filesystem::path& recording_path); + OOPETRIS_GRAPHICS_EXPORTED + [[nodiscard]] std::pair, recorder::AdditionalInformation> + get_game_parameters_for_replay( + ServiceProvider* service_provider, + const std::filesystem::path& recording_path + ); - [[nodiscard]] helper::expected get_single_player_game_parameters( + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected + get_single_player_game_parameters( ServiceProvider* service_provider, recorder::AdditionalInformation&& information, const date::ISO8601Date& date diff --git a/src/input/joystick_input.hpp b/src/input/joystick_input.hpp index add8bf27..7ffb62e6 100644 --- a/src/input/joystick_input.hpp +++ b/src/input/joystick_input.hpp @@ -4,6 +4,7 @@ #include #include "guid.hpp" +#include "helper/windows.hpp" #include "input.hpp" #include "input/console_buttons.hpp" #include "input/game_input.hpp" @@ -23,7 +24,9 @@ namespace input { std::string name; //optional (can be ""), just for human readable settings - static helper::expected from_string(const std::string& value); + OOPETRIS_GRAPHICS_EXPORTED static helper::expected from_string( + const std::string& value + ); }; //using std::string in here, since we only know, if these are valid joystick button names, after parsing the GUID and than seeing if we support that joystick and than using the string mappings for that specific joystick @@ -63,9 +66,10 @@ namespace input { SDL_JoystickID m_instance_id; public: + OOPETRIS_GRAPHICS_EXPORTED JoystickLikeInput(SDL_JoystickID instance_id, const std::string& name, JoystickLikeType type); - [[nodiscard]] SDL_JoystickID instance_id() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] SDL_JoystickID instance_id() const; }; @@ -74,21 +78,23 @@ namespace input { SDL_Joystick* m_joystick; public: + OOPETRIS_GRAPHICS_EXPORTED JoystickInput(SDL_Joystick* joystick, SDL_JoystickID instance_id, const std::string& name); - ~JoystickInput() override; + OOPETRIS_GRAPHICS_EXPORTED ~JoystickInput() override; - JoystickInput(const JoystickInput& input) noexcept; - JoystickInput& operator=(const JoystickInput& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED JoystickInput(const JoystickInput& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED JoystickInput& operator=(const JoystickInput& input) noexcept; - JoystickInput(JoystickInput&& input) noexcept; - JoystickInput& operator=(JoystickInput&& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED JoystickInput(JoystickInput&& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED JoystickInput& operator=(JoystickInput&& input) noexcept; - [[nodiscard]] sdl::GUID guid() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] sdl::GUID guid() const; - [[nodiscard]] virtual JoystickSettings default_settings() const = 0; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] virtual JoystickSettings default_settings() const = 0; - [[nodiscard]] static std::optional> get_joystick_by_guid( + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] static std::optional> + get_joystick_by_guid( const sdl::GUID& guid, SDL_Joystick* joystick, SDL_JoystickID instance_id, @@ -97,13 +103,13 @@ namespace input { }; struct JoyStickInputManager { - static void discover_devices(std::vector>& inputs); + OOPETRIS_GRAPHICS_EXPORTED static void discover_devices(std::vector>& inputs); - [[nodiscard]] static helper::expected, std::string> get_by_device_index( - int device_index - ); + OOPETRIS_GRAPHICS_EXPORTED + [[nodiscard]] static helper::expected, std::string> + get_by_device_index(int device_index); - [[nodiscard]] static bool + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] static bool process_special_inputs(const SDL_Event& event, std::vector>& inputs); private: @@ -237,19 +243,24 @@ namespace input { EventDispatcher* m_event_dispatcher; public: - explicit JoystickLikeGameInput(EventDispatcher* event_dispatcher, JoystickLikeType type); + OOPETRIS_GRAPHICS_EXPORTED explicit JoystickLikeGameInput( + EventDispatcher* event_dispatcher, + JoystickLikeType type + ); - ~JoystickLikeGameInput() override; + OOPETRIS_GRAPHICS_EXPORTED ~JoystickLikeGameInput() override; - JoystickLikeGameInput(const JoystickLikeGameInput& input) = delete; - [[nodiscard]] JoystickLikeGameInput& operator=(const JoystickLikeGameInput& input) = delete; + OOPETRIS_GRAPHICS_EXPORTED JoystickLikeGameInput(const JoystickLikeGameInput& input) = delete; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] JoystickLikeGameInput& operator=(const JoystickLikeGameInput& input + ) = delete; - JoystickLikeGameInput(JoystickLikeGameInput&& input) noexcept; - [[nodiscard]] JoystickLikeGameInput& operator=(JoystickLikeGameInput&& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED JoystickLikeGameInput(JoystickLikeGameInput&& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] JoystickLikeGameInput& operator=(JoystickLikeGameInput&& input + ) noexcept; - void handle_event(const SDL_Event& event) override; + OOPETRIS_GRAPHICS_EXPORTED void handle_event(const SDL_Event& event) override; - void update(SimulationStep simulation_step_index) override; + OOPETRIS_GRAPHICS_EXPORTED void update(SimulationStep simulation_step_index) override; protected: [[nodiscard]] virtual std::optional sdl_event_to_input_event(const SDL_Event& event) const = 0; @@ -261,17 +272,19 @@ namespace input { JoystickInput* m_underlying_input; public: + OOPETRIS_GRAPHICS_EXPORTED JoystickGameInput(EventDispatcher* event_dispatcher, JoystickInput* underlying_input); - [[nodiscard]] static helper::expected, std::string> - get_game_input_by_settings( - const input::InputManager& input_manager, - EventDispatcher* event_dispatcher, - const JoystickSettings& settings - ); + OOPETRIS_GRAPHICS_EXPORTED + [[nodiscard]] static helper::expected, std::string> + get_game_input_by_settings( + const input::InputManager& input_manager, + EventDispatcher* event_dispatcher, + const JoystickSettings& settings + ); - [[nodiscard]] const JoystickInput* underlying_input() const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const JoystickInput* underlying_input() const override; protected: template @@ -325,7 +338,8 @@ namespace input { namespace json_helper { - [[nodiscard]] std::string get_key_from_object(const nlohmann::json& obj, const std::string& name); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string + get_key_from_object(const nlohmann::json& obj, const std::string& name); } // namespace json_helper diff --git a/src/input/keyboard_input.hpp b/src/input/keyboard_input.hpp index ef2f5368..1c0c354c 100644 --- a/src/input/keyboard_input.hpp +++ b/src/input/keyboard_input.hpp @@ -4,11 +4,11 @@ #include #include "game_input.hpp" +#include "helper/windows.hpp" #include "input.hpp" #include "manager/event_dispatcher.hpp" #include "manager/sdl_key.hpp" - #include @@ -18,11 +18,14 @@ namespace input { struct KeyboardInput : Input { public: - KeyboardInput(); + OOPETRIS_GRAPHICS_EXPORTED KeyboardInput(); - [[nodiscard]] std::optional get_navigation_event(const SDL_Event& event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional get_navigation_event( + const SDL_Event& event + ) const override; - [[nodiscard]] std::string describe_navigation_event(NavigationEvent event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string describe_navigation_event(NavigationEvent event + ) const override; }; @@ -39,7 +42,7 @@ namespace input { sdl::Key open_settings; - [[nodiscard]] helper::expected validate() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected validate() const; [[nodiscard]] static KeyboardSettings default_settings() { return KeyboardSettings{ .rotate_left = sdl::Key{ SDLK_LEFT }, @@ -63,26 +66,28 @@ namespace input { KeyboardInput m_underlying_input; public: + OOPETRIS_GRAPHICS_EXPORTED KeyboardGameInput(const KeyboardSettings& settings, EventDispatcher* event_dispatcher); - ~KeyboardGameInput() override; + OOPETRIS_GRAPHICS_EXPORTED ~KeyboardGameInput() override; KeyboardGameInput(const KeyboardGameInput& input) = delete; [[nodiscard]] KeyboardGameInput& operator=(const KeyboardGameInput& input) = delete; - KeyboardGameInput(KeyboardGameInput&& input) noexcept; - [[nodiscard]] KeyboardGameInput& operator=(KeyboardGameInput&& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED KeyboardGameInput(KeyboardGameInput&& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] KeyboardGameInput& operator=(KeyboardGameInput&& input) noexcept; - void handle_event(const SDL_Event& event) override; + OOPETRIS_GRAPHICS_EXPORTED void handle_event(const SDL_Event& event) override; - void update(SimulationStep simulation_step_index) override; + OOPETRIS_GRAPHICS_EXPORTED void update(SimulationStep simulation_step_index) override; - [[nodiscard]] std::optional get_menu_event(const SDL_Event& event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional get_menu_event(const SDL_Event& event + ) const override; - [[nodiscard]] std::string describe_menu_event(MenuEvent event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string describe_menu_event(MenuEvent event) const override; - [[nodiscard]] const KeyboardInput* underlying_input() const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const KeyboardInput* underlying_input() const override; private: [[nodiscard]] std::optional sdl_event_to_input_event(const SDL_Event& event) const; @@ -93,7 +98,7 @@ namespace input { namespace json_helper { - [[nodiscard]] sdl::Key get_key(const nlohmann::json& obj, const std::string& name); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] sdl::Key get_key(const nlohmann::json& obj, const std::string& name); } // namespace json_helper diff --git a/src/input/mouse_input.hpp b/src/input/mouse_input.hpp index cd3a4c4d..23094721 100644 --- a/src/input/mouse_input.hpp +++ b/src/input/mouse_input.hpp @@ -1,22 +1,27 @@ #pragma once +#include "helper/windows.hpp" #include "input.hpp" - namespace input { struct MouseInput : public PointerInput { public: - MouseInput(); + OOPETRIS_GRAPHICS_EXPORTED MouseInput(); - [[nodiscard]] std::optional get_navigation_event(const SDL_Event& event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional get_navigation_event( + const SDL_Event& event + ) const override; - [[nodiscard]] std::string describe_navigation_event(NavigationEvent event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string describe_navigation_event(NavigationEvent event + ) const override; - [[nodiscard]] std::optional get_pointer_event(const SDL_Event& event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional get_pointer_event( + const SDL_Event& event + ) const override; - [[nodiscard]] SDL_Event offset_pointer_event(const SDL_Event& event, const shapes::IPoint& point) - const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] SDL_Event + offset_pointer_event(const SDL_Event& event, const shapes::IPoint& point) const override; }; diff --git a/src/input/replay_input.hpp b/src/input/replay_input.hpp index 3d00afa8..422cf5af 100644 --- a/src/input/replay_input.hpp +++ b/src/input/replay_input.hpp @@ -3,6 +3,7 @@ #include #include "game_input.hpp" +#include "helper/windows.hpp" #include @@ -17,18 +18,20 @@ namespace input { const Input* m_underlying_input; public: + OOPETRIS_GRAPHICS_EXPORTED ReplayGameInput(std::shared_ptr recording_reader, const Input* underlying_input); - void update(SimulationStep simulation_step_index) override; - void late_update(SimulationStep simulation_step_index) override; + OOPETRIS_GRAPHICS_EXPORTED void update(SimulationStep simulation_step_index) override; + OOPETRIS_GRAPHICS_EXPORTED void late_update(SimulationStep simulation_step_index) override; - [[nodiscard]] std::optional get_menu_event(const SDL_Event& event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional get_menu_event(const SDL_Event& event + ) const override; - [[nodiscard]] std::string describe_menu_event(MenuEvent event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string describe_menu_event(MenuEvent event) const override; - [[nodiscard]] bool is_end_of_recording() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool is_end_of_recording() const; - [[nodiscard]] const Input* underlying_input() const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const Input* underlying_input() const override; }; } // namespace input diff --git a/src/input/touch_input.hpp b/src/input/touch_input.hpp index 134c9e9c..f6f85cbf 100644 --- a/src/input/touch_input.hpp +++ b/src/input/touch_input.hpp @@ -3,9 +3,11 @@ #include #include +#include "helper/windows.hpp" #include "input.hpp" #include "input/game_input.hpp" #include "manager/event_dispatcher.hpp" + #include namespace input { @@ -15,24 +17,30 @@ namespace input { SDL_TouchID m_id; public: + OOPETRIS_GRAPHICS_EXPORTED TouchInput(const std::shared_ptr& window, SDL_TouchID touch_id, const std::string& name); - [[nodiscard]] static helper::expected, std::string> + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] static helper::expected, std::string> get_by_device_index(const std::shared_ptr& window, int device_index); - [[nodiscard]] std::optional get_navigation_event(const SDL_Event& event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional get_navigation_event( + const SDL_Event& event + ) const override; - [[nodiscard]] std::string describe_navigation_event(NavigationEvent event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string describe_navigation_event(NavigationEvent event + ) const override; - [[nodiscard]] std::optional get_pointer_event(const SDL_Event& event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional get_pointer_event( + const SDL_Event& event + ) const override; - [[nodiscard]] SDL_Event offset_pointer_event(const SDL_Event& event, const shapes::IPoint& point) - const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] SDL_Event + offset_pointer_event(const SDL_Event& event, const shapes::IPoint& point) const override; }; struct TouchInputManager { - static void + OOPETRIS_GRAPHICS_EXPORTED static void discover_devices(std::vector>& inputs, const std::shared_ptr& window); }; @@ -45,9 +53,9 @@ namespace input { u32 rotation_duration_threshold; u32 drop_duration_threshold; - [[nodiscard]] helper::expected validate() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected validate() const; - [[nodiscard]] static TouchSettings default_settings() { + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] static TouchSettings default_settings() { return TouchSettings{ .move_x_threshold = 150.0 / 2160.0, .move_y_threshold = 400.0 / 1080.0, .rotation_duration_threshold = 500, @@ -76,29 +84,30 @@ namespace input { TouchInput* m_underlying_input; public: - explicit TouchGameInput( + OOPETRIS_GRAPHICS_EXPORTED explicit TouchGameInput( const TouchSettings& settings, EventDispatcher* event_dispatcher, TouchInput* underlying_input ); - ~TouchGameInput() override; + OOPETRIS_GRAPHICS_EXPORTED ~TouchGameInput() override; TouchGameInput(const TouchGameInput& input) = delete; [[nodiscard]] TouchGameInput& operator=(const TouchGameInput& input) = delete; - TouchGameInput(TouchGameInput&& input) noexcept; - [[nodiscard]] TouchGameInput& operator=(TouchGameInput&& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED TouchGameInput(TouchGameInput&& input) noexcept; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] TouchGameInput& operator=(TouchGameInput&& input) noexcept; - void handle_event(const SDL_Event& event) override; - void update(SimulationStep simulation_step_index) override; + OOPETRIS_GRAPHICS_EXPORTED void handle_event(const SDL_Event& event) override; + OOPETRIS_GRAPHICS_EXPORTED void update(SimulationStep simulation_step_index) override; - [[nodiscard]] std::optional get_menu_event(const SDL_Event& event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional get_menu_event(const SDL_Event& event + ) const override; - [[nodiscard]] std::string describe_menu_event(MenuEvent event) const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string describe_menu_event(MenuEvent event) const override; - [[nodiscard]] const TouchInput* underlying_input() const override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const TouchInput* underlying_input() const override; private: [[nodiscard]] std::optional sdl_event_to_input_event(const SDL_Event& event); diff --git a/src/lobby/api.hpp b/src/lobby/api.hpp index 39b1565b..ce5ba43e 100644 --- a/src/lobby/api.hpp +++ b/src/lobby/api.hpp @@ -26,11 +26,11 @@ #include #include +#include "helper/windows.hpp" +#include "lobby/types.hpp" #include #include -#include "lobby/types.hpp" - namespace constants { const constexpr auto json_content_type = "application/json"; } @@ -58,40 +58,45 @@ namespace lobby { public: - Client(Client&& other) noexcept; - Client& operator=(Client&& other) noexcept = delete; + OOPETRIS_GRAPHICS_EXPORTED Client(Client&& other) noexcept; + OOPETRIS_GRAPHICS_EXPORTED Client& operator=(Client&& other) noexcept = delete; - Client(const Client& other) = delete; - Client& operator=(const Client& other) = delete; + OOPETRIS_GRAPHICS_EXPORTED Client(const Client& other) = delete; + OOPETRIS_GRAPHICS_EXPORTED Client& operator=(const Client& other) = delete; - ~Client(); + OOPETRIS_GRAPHICS_EXPORTED ~Client(); - [[nodiscard]] helper::expected static get_client(const std::string& url); + OOPETRIS_GRAPHICS_EXPORTED + [[nodiscard]] helper::expected static get_client(const std::string& url); - [[nodiscard]] bool is_authenticated(); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool is_authenticated(); - [[nodiscard]] bool authenticate(const Credentials& credentials); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool authenticate(const Credentials& credentials); - [[nodiscard]] helper::expected, std::string> get_lobbies(); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected, std::string> get_lobbies(); - [[nodiscard]] helper::expected join_lobby(int lobby_id); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected join_lobby(int lobby_id); - [[nodiscard]] helper::expected get_lobby_detail(int lobby_id); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected get_lobby_detail( + int lobby_id + ); - [[nodiscard]] helper::expected delete_lobby(int lobby_id); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected delete_lobby(int lobby_id); - [[nodiscard]] helper::expected leave_lobby(int lobby_id); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected leave_lobby(int lobby_id); - [[nodiscard]] helper::expected start_lobby(int lobby_id); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected start_lobby(int lobby_id); - [[nodiscard]] helper::expected create_lobby( + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected create_lobby( const CreateLobbyRequest& arguments ); - [[nodiscard]] helper::expected, std::string> get_users(); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected, std::string> get_users(); - [[nodiscard]] helper::expected register_user(const RegisterRequest& register_request); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected register_user( + const RegisterRequest& register_request + ); }; diff --git a/src/manager/font.hpp b/src/manager/font.hpp index c20592f5..855646e3 100644 --- a/src/manager/font.hpp +++ b/src/manager/font.hpp @@ -5,12 +5,14 @@ #include #include +#include "helper/windows.hpp" + struct FontLoadingError final : public std::exception { private: std::string message; public: - explicit FontLoadingError(std::string message) : message{ std::move(message) } { } + OOPETRIS_GRAPHICS_EXPORTED explicit FontLoadingError(std::string message) : message{ std::move(message) } { } [[nodiscard]] const char* what() const noexcept override { return message.c_str(); @@ -24,9 +26,9 @@ struct Font final { public: Font() = default; - Font(const std::filesystem::path& path, int size); + OOPETRIS_GRAPHICS_EXPORTED Font(const std::filesystem::path& path, int size); - [[nodiscard]] TTF_Font* get() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] TTF_Font* get() const; friend struct Text; friend struct Renderer; diff --git a/src/manager/music_manager.hpp b/src/manager/music_manager.hpp index 54128369..7650f8e4 100644 --- a/src/manager/music_manager.hpp +++ b/src/manager/music_manager.hpp @@ -3,6 +3,7 @@ #include +#include "helper/windows.hpp" #include "input/input.hpp" #include "manager/service_provider.hpp" @@ -35,29 +36,35 @@ struct MusicManager final { std::unordered_map m_volume_listeners; public: - explicit MusicManager(ServiceProvider* service_provider, u8 channel_size = 2); + OOPETRIS_GRAPHICS_EXPORTED explicit MusicManager(ServiceProvider* service_provider, u8 channel_size = 2); - MusicManager(const MusicManager&) = delete; - MusicManager& operator=(const MusicManager&) = delete; + OOPETRIS_GRAPHICS_EXPORTED MusicManager(const MusicManager&) = delete; + OOPETRIS_GRAPHICS_EXPORTED MusicManager& operator=(const MusicManager&) = delete; - MusicManager(const MusicManager&&) = delete; - MusicManager& operator=(MusicManager&&) = delete; + OOPETRIS_GRAPHICS_EXPORTED MusicManager(const MusicManager&&) = delete; + OOPETRIS_GRAPHICS_EXPORTED MusicManager& operator=(MusicManager&&) = delete; - ~MusicManager() noexcept; + OOPETRIS_GRAPHICS_EXPORTED ~MusicManager() noexcept; - std::optional + OOPETRIS_GRAPHICS_EXPORTED std::optional load_and_play_music(const std::filesystem::path& location, usize delay = MusicManager::fade_ms); - std::optional load_effect(const std::string& name, std::filesystem::path& location); - std::optional play_effect(const std::string& name, u8 channel_num = 1, int loop = 0); + OOPETRIS_GRAPHICS_EXPORTED std::optional + load_effect(const std::string& name, std::filesystem::path& location); + OOPETRIS_GRAPHICS_EXPORTED std::optional + play_effect(const std::string& name, u8 channel_num = 1, int loop = 0); //TODO(Totto): atm the volume changers only work on the music channel, when adding more effects, this should support channels via https://wiki.libsdl.org/SDL2_mixer/Mix_Volume - [[nodiscard]] std::optional get_volume() const; - void set_volume(std::optional new_volume, bool force_update = false, bool notify_listeners = true); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional get_volume() const; + + OOPETRIS_GRAPHICS_EXPORTED void + set_volume(std::optional new_volume, bool force_update = false, bool notify_listeners = true); + // no nodiscard, since the return value is only a side effect, that is maybe useful - std::optional change_volume(std::int8_t steps); + OOPETRIS_GRAPHICS_EXPORTED std::optional change_volume(std::int8_t steps); - bool handle_event(const std::shared_ptr& input_manager, const SDL_Event& event); + OOPETRIS_GRAPHICS_EXPORTED bool + handle_event(const std::shared_ptr& input_manager, const SDL_Event& event); bool add_volume_listener(const std::string& name, VolumeChangeFunction change_function) { diff --git a/src/manager/sdl_controller_key.hpp b/src/manager/sdl_controller_key.hpp index ee7b06f7..b65ddef4 100644 --- a/src/manager/sdl_controller_key.hpp +++ b/src/manager/sdl_controller_key.hpp @@ -2,12 +2,12 @@ #include +#include "helper/windows.hpp" #include #include #include - namespace sdl { struct ControllerKey { @@ -15,13 +15,15 @@ namespace sdl { SDL_GameControllerButton m_button; public: - explicit ControllerKey(SDL_GameControllerButton button); + OOPETRIS_GRAPHICS_EXPORTED explicit ControllerKey(SDL_GameControllerButton button); - static helper::expected from_string(const std::string& value); + OOPETRIS_GRAPHICS_EXPORTED static helper::expected from_string( + const std::string& value + ); - [[nodiscard]] bool operator==(const ControllerKey& other) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool operator==(const ControllerKey& other) const; - [[nodiscard]] std::string to_string() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string to_string() const; }; diff --git a/src/manager/sdl_key.hpp b/src/manager/sdl_key.hpp index 78a84657..8c67d8f4 100644 --- a/src/manager/sdl_key.hpp +++ b/src/manager/sdl_key.hpp @@ -3,6 +3,8 @@ #include #include +#include "helper/windows.hpp" + #include #include #include @@ -45,13 +47,13 @@ namespace sdl { UnderlyingModifierType m_modifiers; public: - explicit Key(SDL_KeyCode keycode, UnderlyingModifierType modifiers); - explicit Key(SDL_KeyCode keycode, const std::vector& modifiers = {}); - explicit Key(const SDL_Keysym& keysym); + OOPETRIS_GRAPHICS_EXPORTED explicit Key(SDL_KeyCode keycode, UnderlyingModifierType modifiers); + OOPETRIS_GRAPHICS_EXPORTED explicit Key(SDL_KeyCode keycode, const std::vector& modifiers = {}); + OOPETRIS_GRAPHICS_EXPORTED explicit Key(const SDL_Keysym& keysym); - static helper::expected from_string(const std::string& value); + OOPETRIS_GRAPHICS_EXPORTED static helper::expected from_string(const std::string& value); - [[nodiscard]] bool is_key(const Key& other) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool is_key(const Key& other) const; /** * @brief Checks if the key has a modifier, this performs a logical check, e.g. LALT and ALT are treated as match @@ -59,7 +61,7 @@ namespace sdl { * @param modifier * @return bool */ - [[nodiscard]] bool has_modifier(const Modifier& modifier) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool has_modifier(const Modifier& modifier) const; /** * @brief Checks if the key has a modifier, this performs a exact check, e.g. LALT and ALT are treated as NON-match @@ -67,13 +69,14 @@ namespace sdl { * @param modifier * @return bool */ - [[nodiscard]] bool has_modifier_exact(const Modifier& modifier) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool has_modifier_exact(const Modifier& modifier) const; - [[nodiscard]] bool operator==(const Key& other) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool operator==(const Key& other) const; - [[nodiscard]] bool is_equal(const Key& other, bool ignore_special_modifiers = true) const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool is_equal(const Key& other, bool ignore_special_modifiers = true) + const; - [[nodiscard]] std::string to_string() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::string to_string() const; private: [[nodiscard]] static helper::expected sdl_keycode_from_string(const std::string& value diff --git a/src/manager/settings_manager.hpp b/src/manager/settings_manager.hpp index 3d84765f..b0adbf43 100644 --- a/src/manager/settings_manager.hpp +++ b/src/manager/settings_manager.hpp @@ -6,6 +6,7 @@ #include "input/keyboard_input.hpp" #include "input/touch_input.hpp" #include "manager/service_provider.hpp" +#include "helper/windows.hpp" #include #include @@ -77,9 +78,9 @@ namespace detail { }; - void to_json(nlohmann::json& obj, const Settings& settings); + OOPETRIS_GRAPHICS_EXPORTED void to_json(nlohmann::json& obj, const Settings& settings); - void from_json(const nlohmann::json& obj, Settings& settings); + OOPETRIS_GRAPHICS_EXPORTED void from_json(const nlohmann::json& obj, Settings& settings); } // namespace detail @@ -90,7 +91,7 @@ struct SettingsManager { detail::Settings m_settings; public: - explicit SettingsManager(ServiceProvider* service_provider); + OOPETRIS_GRAPHICS_EXPORTED explicit SettingsManager(ServiceProvider* service_provider); - [[nodiscard]] const detail::Settings& settings() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const detail::Settings& settings() const; }; diff --git a/src/meson.build b/src/meson.build index 86650198..97c03e67 100644 --- a/src/meson.build +++ b/src/meson.build @@ -31,6 +31,7 @@ if build_application include_directories: graphics_lib.get('inc_dirs'), dependencies: graphics_lib.get('deps'), cpp_args: graphics_lib.get('compile_args'), + cpp_shared_args: ['-DOOPETRIS_LIBRARY_GRAPHICS_EXPORT'], override_options: { 'warning_level': '3', 'werror': true, From aed812af95edacfe5bb2e30964621b2ee48a3c97 Mon Sep 17 00:00:00 2001 From: "Totto16 (Windows VM)" Date: Thu, 3 Oct 2024 11:13:04 +0200 Subject: [PATCH 11/19] windows: support dll library for oopertis-graphics, part2 add export or import declarations, to be able to build libraries as dll --- src/executables/game/parser.cpp | 2 +- src/scenes/about_page/about_page.hpp | 9 +++---- src/scenes/loading_screen/loading_screen.hpp | 6 ++--- src/scenes/logo/logo.hpp | 3 ++- src/scenes/main_menu/main_menu.hpp | 9 +++---- .../multiplayer_menu/multiplayer_menu.hpp | 12 ++++++---- src/scenes/online_lobby/online_lobby.hpp | 9 +++---- .../play_select_menu/play_select_menu.hpp | 9 +++---- .../recording_selector/recording_chooser.hpp | 8 +++---- .../recording_component.hpp | 8 +++---- .../recording_selector/recording_selector.hpp | 14 +++++++---- src/scenes/replay_game/replay_game.hpp | 8 +++---- src/scenes/scene.hpp | 8 +++---- .../settings_menu/color_setting_row.hpp | 19 ++++++++------- src/scenes/settings_menu/settings_menu.hpp | 13 +++++----- src/scenes/single_player_game/game_over.hpp | 9 +++---- src/scenes/single_player_game/pause.hpp | 10 ++++---- .../single_player_game/single_player_game.hpp | 13 ++++++---- src/ui/components/color_picker.hpp | 24 +++++++++---------- src/ui/components/image_button.hpp | 2 +- src/ui/components/image_view.hpp | 6 ++--- src/ui/components/label.hpp | 24 ++++++++++--------- src/ui/components/link_label.hpp | 10 ++++---- src/ui/components/slider.hpp | 4 ++-- src/ui/components/text_button.hpp | 2 +- src/ui/components/textinput.hpp | 14 +++++------ src/ui/layout.hpp | 19 +++++++++------ src/ui/layouts/focus_layout.hpp | 13 ++++++---- src/ui/layouts/grid_layout.hpp | 6 ++--- src/ui/layouts/scroll_layout.hpp | 22 ++++++++--------- src/ui/layouts/tile_layout.hpp | 2 +- src/ui/widget.hpp | 4 ++-- 32 files changed, 177 insertions(+), 144 deletions(-) diff --git a/src/executables/game/parser.cpp b/src/executables/game/parser.cpp index b05618f6..e950df28 100644 --- a/src/executables/game/parser.cpp +++ b/src/executables/game/parser.cpp @@ -42,7 +42,7 @@ helper::expected helper::parse_args(const std } } #if defined(__SERENITY__) - // serenity OS can#t handle vsync very well (Since it's inside qemu), so setting the target_fps value to 60 per default + // serenity OS can't handle vsync very well (Since it's inside qemu), so setting the target_fps value to 60 per default if (not result.target_fps.has_value()) { result.target_fps = 60; } diff --git a/src/scenes/about_page/about_page.hpp b/src/scenes/about_page/about_page.hpp index 72e2cd80..c18797ec 100644 --- a/src/scenes/about_page/about_page.hpp +++ b/src/scenes/about_page/about_page.hpp @@ -20,11 +20,12 @@ namespace scenes { }; public: - explicit AboutPage(ServiceProvider* service_provider, const ui::Layout& layout); + OOPETRIS_GRAPHICS_EXPORTED explicit AboutPage(ServiceProvider* service_provider, const ui::Layout& layout); - [[nodiscard]] UpdateResult update() override; - void render(const ServiceProvider& service_provider) override; - bool handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] UpdateResult update() override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) override; + OOPETRIS_GRAPHICS_EXPORTED bool + handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; }; } // namespace scenes diff --git a/src/scenes/loading_screen/loading_screen.hpp b/src/scenes/loading_screen/loading_screen.hpp index 994d92a7..c1e7df79 100644 --- a/src/scenes/loading_screen/loading_screen.hpp +++ b/src/scenes/loading_screen/loading_screen.hpp @@ -20,11 +20,11 @@ namespace scenes { shapes::UPoint m_start_offset; public: - explicit LoadingScreen(ServiceProvider* service_provider); + OOPETRIS_GRAPHICS_EXPORTED explicit LoadingScreen(ServiceProvider* service_provider); - void update(); + OOPETRIS_GRAPHICS_EXPORTED void update(); - void render(const ServiceProvider& service_provider) const; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const; private: [[nodiscard]] shapes::UPoint to_screen_coords(const Mino::GridPoint& point, u32 tile_size) const; diff --git a/src/scenes/logo/logo.hpp b/src/scenes/logo/logo.hpp index 1f5ea6c4..798c0fae 100644 --- a/src/scenes/logo/logo.hpp +++ b/src/scenes/logo/logo.hpp @@ -9,6 +9,7 @@ namespace logo { constexpr const auto width = 33; constexpr const auto height = 5; - [[nodiscard]] Texture get_logo(const ServiceProvider* service_provider, double scale = 1.0); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Texture + get_logo(const ServiceProvider* service_provider, double scale = 1.0); } // namespace logo diff --git a/src/scenes/main_menu/main_menu.hpp b/src/scenes/main_menu/main_menu.hpp index 7e9fc2a1..61996ac1 100644 --- a/src/scenes/main_menu/main_menu.hpp +++ b/src/scenes/main_menu/main_menu.hpp @@ -21,11 +21,12 @@ namespace scenes { std::optional m_next_command; public: - explicit MainMenu(ServiceProvider* service_provider, const ui::Layout& layout); + OOPETRIS_GRAPHICS_EXPORTED explicit MainMenu(ServiceProvider* service_provider, const ui::Layout& layout); - [[nodiscard]] UpdateResult update() override; - void render(const ServiceProvider& service_provider) override; - bool handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] UpdateResult update() override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) override; + OOPETRIS_GRAPHICS_EXPORTED bool + handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; }; } // namespace scenes diff --git a/src/scenes/multiplayer_menu/multiplayer_menu.hpp b/src/scenes/multiplayer_menu/multiplayer_menu.hpp index 68f4fdbe..0b381e80 100644 --- a/src/scenes/multiplayer_menu/multiplayer_menu.hpp +++ b/src/scenes/multiplayer_menu/multiplayer_menu.hpp @@ -15,11 +15,15 @@ namespace scenes { std::optional m_next_command; public: - explicit MultiPlayerMenu(ServiceProvider* service_provider, const ui::Layout& layout); + OOPETRIS_GRAPHICS_EXPORTED explicit MultiPlayerMenu( + ServiceProvider* service_provider, + const ui::Layout& layout + ); - [[nodiscard]] UpdateResult update() override; - void render(const ServiceProvider& service_provider) override; - bool handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] UpdateResult update() override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) override; + OOPETRIS_GRAPHICS_EXPORTED bool + handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; }; } // namespace scenes diff --git a/src/scenes/online_lobby/online_lobby.hpp b/src/scenes/online_lobby/online_lobby.hpp index 78872e93..271907cb 100644 --- a/src/scenes/online_lobby/online_lobby.hpp +++ b/src/scenes/online_lobby/online_lobby.hpp @@ -20,11 +20,12 @@ namespace scenes { std::unique_ptr m_client{ nullptr }; public: - explicit OnlineLobby(ServiceProvider* service_provider, const ui::Layout& layout); + OOPETRIS_GRAPHICS_EXPORTED explicit OnlineLobby(ServiceProvider* service_provider, const ui::Layout& layout); - [[nodiscard]] UpdateResult update() override; - void render(const ServiceProvider& service_provider) override; - bool handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] UpdateResult update() override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) override; + OOPETRIS_GRAPHICS_EXPORTED bool + handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; }; } // namespace scenes diff --git a/src/scenes/play_select_menu/play_select_menu.hpp b/src/scenes/play_select_menu/play_select_menu.hpp index ad5bb577..6982e40b 100644 --- a/src/scenes/play_select_menu/play_select_menu.hpp +++ b/src/scenes/play_select_menu/play_select_menu.hpp @@ -15,11 +15,12 @@ namespace scenes { std::optional m_next_command; public: - explicit PlaySelectMenu(ServiceProvider* service_provider, const ui::Layout& layout); + OOPETRIS_GRAPHICS_EXPORTED explicit PlaySelectMenu(ServiceProvider* service_provider, const ui::Layout& layout); - [[nodiscard]] UpdateResult update() override; - void render(const ServiceProvider& service_provider) override; - bool handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] UpdateResult update() override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) override; + OOPETRIS_GRAPHICS_EXPORTED bool + handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; }; } // namespace scenes diff --git a/src/scenes/recording_selector/recording_chooser.hpp b/src/scenes/recording_selector/recording_chooser.hpp index a80b5190..7b14a88a 100644 --- a/src/scenes/recording_selector/recording_chooser.hpp +++ b/src/scenes/recording_selector/recording_chooser.hpp @@ -19,19 +19,19 @@ namespace custom_ui { std::vector currently_chosen_files{}; public: - explicit RecordingFileChooser( + OOPETRIS_GRAPHICS_EXPORTED explicit RecordingFileChooser( ServiceProvider* service_provider, ui::FocusHelper& focus_helper, const ui::Layout& layout, bool is_top_level ); - void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; - [[nodiscard]] Widget::EventHandleResult + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Widget::EventHandleResult handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; - [[nodiscard]] const std::vector& get_currently_chosen_files() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const std::vector& get_currently_chosen_files() const; private: [[nodiscard]] std::tuple get_texts(); diff --git a/src/scenes/recording_selector/recording_component.hpp b/src/scenes/recording_selector/recording_component.hpp index 9773cddf..5e812c93 100644 --- a/src/scenes/recording_selector/recording_component.hpp +++ b/src/scenes/recording_selector/recording_component.hpp @@ -37,7 +37,7 @@ namespace custom_ui { data::RecordingMetadata m_metadata; public: - explicit RecordingComponent( + OOPETRIS_GRAPHICS_EXPORTED explicit RecordingComponent( ServiceProvider* service_provider, ui::FocusHelper& focus_helper, data::RecordingMetadata metadata, @@ -45,12 +45,12 @@ namespace custom_ui { bool is_top_level ); - void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; - [[nodiscard]] Widget::EventHandleResult + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Widget::EventHandleResult handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; - [[nodiscard]] data::RecordingMetadata metadata() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] data::RecordingMetadata metadata() const; private: [[nodiscard]] std::tuple get_texts(); diff --git a/src/scenes/recording_selector/recording_selector.hpp b/src/scenes/recording_selector/recording_selector.hpp index 4f0861a1..f7ce4648 100644 --- a/src/scenes/recording_selector/recording_selector.hpp +++ b/src/scenes/recording_selector/recording_selector.hpp @@ -37,11 +37,15 @@ namespace scenes { std::vector m_chosen_paths; public: - explicit RecordingSelector(ServiceProvider* service_provider, const ui::Layout& layout); - - [[nodiscard]] UpdateResult update() override; - void render(const ServiceProvider& service_provider) override; - bool handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; + OOPETRIS_GRAPHICS_EXPORTED explicit RecordingSelector( + ServiceProvider* service_provider, + const ui::Layout& layout + ); + + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] UpdateResult update() override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) override; + OOPETRIS_GRAPHICS_EXPORTED bool + handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; private: void add_all_recordings(); diff --git a/src/scenes/replay_game/replay_game.hpp b/src/scenes/replay_game/replay_game.hpp index 1cc0d44a..c452edcd 100644 --- a/src/scenes/replay_game/replay_game.hpp +++ b/src/scenes/replay_game/replay_game.hpp @@ -14,15 +14,15 @@ namespace scenes { std::vector> m_games; public: - explicit ReplayGame( + OOPETRIS_GRAPHICS_EXPORTED explicit ReplayGame( ServiceProvider* service_provider, const ui::Layout& layout, const std::filesystem::path& recording_path ); - [[nodiscard]] UpdateResult update() override; - void render(const ServiceProvider& service_provider) override; - [[nodiscard]] bool + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] UpdateResult update() override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; }; diff --git a/src/scenes/scene.hpp b/src/scenes/scene.hpp index a0481587..16ef8d15 100644 --- a/src/scenes/scene.hpp +++ b/src/scenes/scene.hpp @@ -68,7 +68,7 @@ namespace scenes { ui::Layout m_layout; public: - explicit Scene(ServiceProvider* service_provider, const ui::Layout& layout); + OOPETRIS_GRAPHICS_EXPORTED explicit Scene(ServiceProvider* service_provider, const ui::Layout& layout); Scene(const Scene&) = delete; Scene& operator=(const Scene&) = delete; virtual ~Scene() = default; @@ -78,10 +78,10 @@ namespace scenes { virtual bool handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) = 0; // override this, if you (the scene) could potentially be displayed in non fullscreen! - virtual void on_unhover(); - [[nodiscard]] const ui::Layout& get_layout() const; + OOPETRIS_GRAPHICS_EXPORTED virtual void on_unhover(); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const ui::Layout& get_layout() const; }; - [[nodiscard]] std::unique_ptr + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::unique_ptr create_scene(ServiceProvider& service_provider, SceneId identifier, const ui::Layout& layout); } // namespace scenes diff --git a/src/scenes/settings_menu/color_setting_row.hpp b/src/scenes/settings_menu/color_setting_row.hpp index b03d4fdf..292dbc9d 100644 --- a/src/scenes/settings_menu/color_setting_row.hpp +++ b/src/scenes/settings_menu/color_setting_row.hpp @@ -22,7 +22,7 @@ namespace detail { ); public: - explicit ColorSettingRectangle( + OOPETRIS_GRAPHICS_EXPORTED explicit ColorSettingRectangle( const Color& start_color, std::pair size, ui::Alignment alignment, @@ -30,13 +30,13 @@ namespace detail { bool is_top_level ); - [[nodiscard]] Color& color(); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Color& color(); - [[nodiscard]] const Color& color() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const Color& color() const; - void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; - [[nodiscard]] Widget::EventHandleResult + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Widget::EventHandleResult handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; }; @@ -49,18 +49,19 @@ namespace detail { ui::ColorPicker m_color_picker; public: - explicit ColorPickerScene( + OOPETRIS_GRAPHICS_EXPORTED explicit ColorPickerScene( ServiceProvider* service_provider, const ui::Layout& layout, const Color& starting_color, Callback callback ); - [[nodiscard]] scenes::Scene::UpdateResult update() override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] scenes::Scene::UpdateResult update() override; - void render(const ServiceProvider& service_provider) override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) override; - bool handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; + OOPETRIS_GRAPHICS_EXPORTED bool + handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; }; diff --git a/src/scenes/settings_menu/settings_menu.hpp b/src/scenes/settings_menu/settings_menu.hpp index 425b10c4..a5177e02 100644 --- a/src/scenes/settings_menu/settings_menu.hpp +++ b/src/scenes/settings_menu/settings_menu.hpp @@ -48,20 +48,21 @@ namespace scenes { ); public: - explicit SettingsMenu(ServiceProvider* service_provider, const ui::Layout& layout); - explicit SettingsMenu( + OOPETRIS_GRAPHICS_EXPORTED explicit SettingsMenu(ServiceProvider* service_provider, const ui::Layout& layout); + OOPETRIS_GRAPHICS_EXPORTED explicit SettingsMenu( ServiceProvider* service_provider, const ui::Layout& layout, const std::shared_ptr& game_input ); - [[nodiscard]] UpdateResult update() override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] UpdateResult update() override; - void render(const ServiceProvider& service_provider) override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) override; - bool handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; + OOPETRIS_GRAPHICS_EXPORTED bool + handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; - void on_unhover() override; + OOPETRIS_GRAPHICS_EXPORTED void on_unhover() override; }; } // namespace scenes diff --git a/src/scenes/single_player_game/game_over.hpp b/src/scenes/single_player_game/game_over.hpp index 70ca3d99..f367fd8f 100644 --- a/src/scenes/single_player_game/game_over.hpp +++ b/src/scenes/single_player_game/game_over.hpp @@ -12,17 +12,18 @@ namespace scenes { std::shared_ptr m_game_input; public: - explicit SinglePlayerGameOver( + OOPETRIS_GRAPHICS_EXPORTED explicit SinglePlayerGameOver( ServiceProvider* service_provider, const ui::Layout& layout, const std::shared_ptr& game_input ); - [[nodiscard]] UpdateResult update() override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] UpdateResult update() override; - void render(const ServiceProvider& service_provider) override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) override; - bool handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; + OOPETRIS_GRAPHICS_EXPORTED bool + handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; }; } // namespace scenes diff --git a/src/scenes/single_player_game/pause.hpp b/src/scenes/single_player_game/pause.hpp index a8394ba4..52a327ff 100644 --- a/src/scenes/single_player_game/pause.hpp +++ b/src/scenes/single_player_game/pause.hpp @@ -13,15 +13,17 @@ namespace scenes { std::shared_ptr m_game_input; public: - explicit SinglePlayerPause( + OOPETRIS_GRAPHICS_EXPORTED explicit SinglePlayerPause( ServiceProvider* service_provider, const ui::Layout& layout, const std::shared_ptr& game_input ); - [[nodiscard]] UpdateResult update() override; - void render(const ServiceProvider& service_provider) override; - [[nodiscard]] bool + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] UpdateResult update() override; + + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) override; + + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; }; } // namespace scenes diff --git a/src/scenes/single_player_game/single_player_game.hpp b/src/scenes/single_player_game/single_player_game.hpp index d7389579..4df415df 100644 --- a/src/scenes/single_player_game/single_player_game.hpp +++ b/src/scenes/single_player_game/single_player_game.hpp @@ -15,11 +15,14 @@ namespace scenes { std::unique_ptr m_game; public: - explicit SinglePlayerGame(ServiceProvider* service_provider, const ui::Layout& layout); - - [[nodiscard]] UpdateResult update() override; - void render(const ServiceProvider& service_provider) override; - [[nodiscard]] bool + OOPETRIS_GRAPHICS_EXPORTED explicit SinglePlayerGame( + ServiceProvider* service_provider, + const ui::Layout& layout + ); + + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] UpdateResult update() override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) override; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; }; diff --git a/src/ui/components/color_picker.hpp b/src/ui/components/color_picker.hpp index 2b4935a9..8825683c 100644 --- a/src/ui/components/color_picker.hpp +++ b/src/ui/components/color_picker.hpp @@ -20,7 +20,7 @@ namespace detail { std::unique_ptr m_texture; public: - explicit ColorSlider( + OOPETRIS_GRAPHICS_EXPORTED explicit ColorSlider( ServiceProvider* service_provider, Range range, Getter getter, @@ -30,7 +30,7 @@ namespace detail { bool is_top_level ); - void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; private: [[nodiscard]] std::pair get_rectangles() const override; @@ -51,7 +51,7 @@ namespace detail { bool m_is_dragging{ false }; public: - explicit ColorCanvas( + OOPETRIS_GRAPHICS_EXPORTED explicit ColorCanvas( ServiceProvider* service_provider, const Color& start_color, Callback callback, @@ -59,16 +59,16 @@ namespace detail { bool is_top_level ); - ~ColorCanvas() override; + OOPETRIS_GRAPHICS_EXPORTED ~ColorCanvas() override; - void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; - [[nodiscard]] Widget::EventHandleResult + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Widget::EventHandleResult handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; - void on_change(ColorChangeOrigin origin, const HSVColor& color); + OOPETRIS_GRAPHICS_EXPORTED void on_change(ColorChangeOrigin origin, const HSVColor& color); - void draw_pseudo_circle(const ServiceProvider& service_provider) const; + OOPETRIS_GRAPHICS_EXPORTED void draw_pseudo_circle(const ServiceProvider& service_provider) const; private: void redraw_texture(); @@ -106,7 +106,7 @@ namespace ui { ); public: - explicit ColorPicker( + OOPETRIS_GRAPHICS_EXPORTED explicit ColorPicker( ServiceProvider* service_provider, const Color& start_color, Callback callback, @@ -116,12 +116,12 @@ namespace ui { bool is_top_level ); - void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; - [[nodiscard]] Widget::EventHandleResult + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Widget::EventHandleResult handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; - [[nodiscard]] Color get_color() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Color get_color() const; private: void after_color_change(detail::ColorChangeOrigin origin, const HSVColor& color); diff --git a/src/ui/components/image_button.hpp b/src/ui/components/image_button.hpp index aea9bfda..d897c021 100644 --- a/src/ui/components/image_button.hpp +++ b/src/ui/components/image_button.hpp @@ -8,7 +8,7 @@ namespace ui { struct ImageButton : public Button { - explicit ImageButton( + OOPETRIS_GRAPHICS_EXPORTED explicit ImageButton( ServiceProvider* service_provider, const std::filesystem::path& image_path, bool respect_ratio, diff --git a/src/ui/components/image_view.hpp b/src/ui/components/image_view.hpp index 04077ba4..5c72b0ed 100644 --- a/src/ui/components/image_view.hpp +++ b/src/ui/components/image_view.hpp @@ -15,7 +15,7 @@ namespace ui { shapes::URect m_fill_rect; public: - explicit ImageView( + OOPETRIS_GRAPHICS_EXPORTED explicit ImageView( ServiceProvider* service_provider, const std::filesystem::path& image_path, std::pair size, @@ -25,9 +25,9 @@ namespace ui { bool is_top_level ); - void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; - [[nodiscard]] Widget::EventHandleResult + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Widget::EventHandleResult handle_event(const std::shared_ptr& input_manager, const SDL_Event& even) override; }; } // namespace ui diff --git a/src/ui/components/label.hpp b/src/ui/components/label.hpp index 4d0007f6..36936ce1 100644 --- a/src/ui/components/label.hpp +++ b/src/ui/components/label.hpp @@ -11,20 +11,22 @@ namespace ui { Text m_text; public: - Label(ServiceProvider* service_provider, - const std::string& text, - const Font& font, - const Color& color, - std::pair size, - Alignment alignment, - Layout layout, - bool is_top_level); + OOPETRIS_GRAPHICS_EXPORTED Label( + ServiceProvider* service_provider, + const std::string& text, + const Font& font, + const Color& color, + std::pair size, + Alignment alignment, + Layout layout, + bool is_top_level + ); - void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; - [[nodiscard]] Widget::EventHandleResult + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Widget::EventHandleResult handle_event(const std::shared_ptr& input_manager, const SDL_Event& /*event*/) override; - void set_text(const ServiceProvider& service_provider, const std::string& text); + OOPETRIS_GRAPHICS_EXPORTED void set_text(const ServiceProvider& service_provider, const std::string& text); }; } // namespace ui diff --git a/src/ui/components/link_label.hpp b/src/ui/components/link_label.hpp index e5c14c97..20c9b9ff 100644 --- a/src/ui/components/link_label.hpp +++ b/src/ui/components/link_label.hpp @@ -28,7 +28,7 @@ namespace ui { public: - explicit LinkLabel( + OOPETRIS_GRAPHICS_EXPORTED explicit LinkLabel( ServiceProvider* service_provider, const std::string& text, const std::string& url, @@ -41,13 +41,13 @@ namespace ui { bool is_top_level ); - void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; - [[nodiscard]] Widget::EventHandleResult + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Widget::EventHandleResult handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; - void on_clicked(); + OOPETRIS_GRAPHICS_EXPORTED void on_clicked(); - void set_text(const ServiceProvider& service_provider, const std::string& text); + OOPETRIS_GRAPHICS_EXPORTED void set_text(const ServiceProvider& service_provider, const std::string& text); }; } // namespace ui diff --git a/src/ui/components/slider.hpp b/src/ui/components/slider.hpp index 3c0ca802..ed0a95f3 100644 --- a/src/ui/components/slider.hpp +++ b/src/ui/components/slider.hpp @@ -13,7 +13,7 @@ namespace ui { shapes::URect m_fill_rect; public: - explicit Slider( + OOPETRIS_GRAPHICS_EXPORTED explicit Slider( u32 focus_id, Range range, Getter getter, @@ -25,7 +25,7 @@ namespace ui { bool is_top_level ); - void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; private: [[nodiscard]] std::pair get_rectangles() const override; diff --git a/src/ui/components/text_button.hpp b/src/ui/components/text_button.hpp index ad08944d..2c48568a 100644 --- a/src/ui/components/text_button.hpp +++ b/src/ui/components/text_button.hpp @@ -23,7 +23,7 @@ namespace ui { ); public: - explicit TextButton( + OOPETRIS_GRAPHICS_EXPORTED explicit TextButton( ServiceProvider* service_provider, const std::string& text, const Font& font, diff --git a/src/ui/components/textinput.hpp b/src/ui/components/textinput.hpp index f3d4de6a..ec1b079e 100644 --- a/src/ui/components/textinput.hpp +++ b/src/ui/components/textinput.hpp @@ -43,7 +43,7 @@ namespace ui { ); public: - explicit TextInput( + OOPETRIS_GRAPHICS_EXPORTED explicit TextInput( ServiceProvider* service_provider, Font font, const Color& color, @@ -55,20 +55,20 @@ namespace ui { bool is_top_level ); - ~TextInput() override; + OOPETRIS_GRAPHICS_EXPORTED ~TextInput() override; - void update() override; + OOPETRIS_GRAPHICS_EXPORTED void update() override; //TODO(Totto): how to handle text limits (since texture for texts on the gpu can't get unlimitedly big, maybe use software texture?) - void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; - Widget::EventHandleResult + OOPETRIS_GRAPHICS_EXPORTED Widget::EventHandleResult handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; - void set_text(const std::string& text); + OOPETRIS_GRAPHICS_EXPORTED void set_text(const std::string& text); - [[nodiscard]] const std::string& get_text() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const std::string& get_text() const; private: void recalculate_textures(bool text_changed); diff --git a/src/ui/layout.hpp b/src/ui/layout.hpp index 112f3ceb..aba05333 100644 --- a/src/ui/layout.hpp +++ b/src/ui/layout.hpp @@ -43,9 +43,12 @@ namespace ui { struct FullScreenLayout : public Layout { - explicit FullScreenLayout(const shapes::URect& rect) : Layout{ rect, LayoutType::FullScreen } { } - explicit FullScreenLayout(const Window& window) : FullScreenLayout{ window.screen_rect() } { } - explicit FullScreenLayout(const Window* window) : FullScreenLayout{ window->screen_rect() } { } + OOPETRIS_GRAPHICS_EXPORTED explicit FullScreenLayout(const shapes::URect& rect) + : Layout{ rect, LayoutType::FullScreen } { } + OOPETRIS_GRAPHICS_EXPORTED explicit FullScreenLayout(const Window& window) + : FullScreenLayout{ window.screen_rect() } { } + OOPETRIS_GRAPHICS_EXPORTED explicit FullScreenLayout(const Window* window) + : FullScreenLayout{ window->screen_rect() } { } }; @@ -102,14 +105,16 @@ namespace ui { using Alignment = std::pair; - [[nodiscard]] u32 get_horizontal_alignment_offset(const Layout& layout, AlignmentHorizontal alignment, u32 width); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] u32 + get_horizontal_alignment_offset(const Layout& layout, AlignmentHorizontal alignment, u32 width); - [[nodiscard]] u32 get_vertical_alignment_offset(const Layout& layout, AlignmentVertical alignment, u32 height); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] u32 + get_vertical_alignment_offset(const Layout& layout, AlignmentVertical alignment, u32 height); - [[nodiscard]] shapes::URect + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] shapes::URect get_rectangle_aligned(const Layout& layout, const std::pair& size, const Alignment& alignment); - [[nodiscard]] std::pair + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::pair ratio_helper(const std::pair& size, bool respect_ratio, const shapes::UPoint& original_ratio); enum class Direction : u8 { Horizontal, Vertical }; diff --git a/src/ui/layouts/focus_layout.hpp b/src/ui/layouts/focus_layout.hpp index f4eae925..e810091a 100644 --- a/src/ui/layouts/focus_layout.hpp +++ b/src/ui/layouts/focus_layout.hpp @@ -32,11 +32,16 @@ namespace ui { m_widgets; // NOLINT(misc-non-private-member-variables-in-classes,cppcoreguidelines-non-private-member-variables-in-classes) public: - explicit FocusLayout(const Layout& layout, u32 focus_id, FocusOptions options, bool is_top_level); + OOPETRIS_GRAPHICS_EXPORTED explicit FocusLayout( + const Layout& layout, + u32 focus_id, + FocusOptions options, + bool is_top_level + ); - void update() override; + OOPETRIS_GRAPHICS_EXPORTED void update() override; - [[nodiscard]] u32 widget_count() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] u32 widget_count() const; template @@ -99,7 +104,7 @@ namespace ui { return item.value(); } - Widget::EventHandleResult + OOPETRIS_GRAPHICS_EXPORTED Widget::EventHandleResult handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; diff --git a/src/ui/layouts/grid_layout.hpp b/src/ui/layouts/grid_layout.hpp index 1790ac8c..7c15b95c 100644 --- a/src/ui/layouts/grid_layout.hpp +++ b/src/ui/layouts/grid_layout.hpp @@ -13,7 +13,7 @@ namespace ui { std::pair margin; public: - explicit GridLayout( + OOPETRIS_GRAPHICS_EXPORTED explicit GridLayout( u32 focus_id, u32 size, Direction direction, @@ -23,9 +23,9 @@ namespace ui { bool is_top_level = true ); - [[nodiscard]] u32 total_size() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] u32 total_size() const; - void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; private: [[nodiscard]] Layout get_layout_for_index(u32 index) override; diff --git a/src/ui/layouts/scroll_layout.hpp b/src/ui/layouts/scroll_layout.hpp index d2a36f2f..8dd22d6d 100644 --- a/src/ui/layouts/scroll_layout.hpp +++ b/src/ui/layouts/scroll_layout.hpp @@ -23,21 +23,21 @@ namespace ui { ItemSize(u32 height, ItemSizeType type); public: - [[nodiscard]] u32 get_height() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] u32 get_height() const; - [[nodiscard]] ItemSizeType get_type() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] ItemSizeType get_type() const; }; struct AbsolutItemSize : public ItemSize { - AbsolutItemSize(u32 height); + OOPETRIS_GRAPHICS_EXPORTED AbsolutItemSize(u32 height); }; struct RelativeItemSize : public ItemSize { - RelativeItemSize(const shapes::URect& rect, double height); - RelativeItemSize(const Window* window, double height); - RelativeItemSize(const Window& window, double height); - RelativeItemSize(const Layout& layout, double height); + OOPETRIS_GRAPHICS_EXPORTED RelativeItemSize(const shapes::URect& rect, double height); + OOPETRIS_GRAPHICS_EXPORTED RelativeItemSize(const Window* window, double height); + OOPETRIS_GRAPHICS_EXPORTED RelativeItemSize(const Window& window, double height); + OOPETRIS_GRAPHICS_EXPORTED RelativeItemSize(const Layout& layout, double height); }; @@ -54,7 +54,7 @@ namespace ui { u32 m_step_size; public: - explicit ScrollLayout( + OOPETRIS_GRAPHICS_EXPORTED explicit ScrollLayout( ServiceProvider* service_provider, u32 focus_id, Margin gap, @@ -63,9 +63,9 @@ namespace ui { bool is_top_level = true ); - void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; - Widget::EventHandleResult + OOPETRIS_GRAPHICS_EXPORTED Widget::EventHandleResult handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; //TODO(Totto): with some template paramater and magic make this an option in the base class, so that only get_layout_for_new needs to be overwritten! @@ -90,7 +90,7 @@ namespace ui { return index; } - void clear_widgets(); + OOPETRIS_GRAPHICS_EXPORTED void clear_widgets(); protected: Widget::EventHandleResult handle_focus_change_events( diff --git a/src/ui/layouts/tile_layout.hpp b/src/ui/layouts/tile_layout.hpp index da68fdcb..fb7ce61b 100644 --- a/src/ui/layouts/tile_layout.hpp +++ b/src/ui/layouts/tile_layout.hpp @@ -48,7 +48,7 @@ namespace ui { static_assert(S != 0 and "TileLayout has to hold at least one child"); } - void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; private: [[nodiscard]] Layout get_layout_for_index(u32 index) override; diff --git a/src/ui/widget.hpp b/src/ui/widget.hpp index 9dd33b9a..28684771 100644 --- a/src/ui/widget.hpp +++ b/src/ui/widget.hpp @@ -59,9 +59,9 @@ namespace ui { handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) = 0; }; - [[nodiscard]] std::optional as_focusable(Widget* widget); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional as_focusable(Widget* widget); - [[nodiscard]] std::optional as_hoverable(Widget* widget); + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] std::optional as_hoverable(Widget* widget); } // namespace ui From 4ef349eb216a0d47199fae7128c60f65afcd2b0b Mon Sep 17 00:00:00 2001 From: "Totto16 (Windows VM)" Date: Thu, 3 Oct 2024 11:42:00 +0200 Subject: [PATCH 12/19] windows installer: add shared libraries to the install process --- tools/installer/setup.nsi | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tools/installer/setup.nsi b/tools/installer/setup.nsi index 88d15ace..25f7d388 100644 --- a/tools/installer/setup.nsi +++ b/tools/installer/setup.nsi @@ -124,6 +124,27 @@ Section "Core App" CoreApp ; install dynamic libraries SetOutPath "$INSTDIR" + + ; install oopetris-* core libraries + File "${PROJECT_BUILD_DIR}\src\libs\core\oopetris_core-0.dll" + File "${PROJECT_BUILD_DIR}\src\libs\recordings\oopetris_recordings-0.dll" + File "${PROJECT_BUILD_DIR}\src\oopetris_graphics-0.dll" + + ; install subprojects / external libraries + File "${PROJECT_BUILD_DIR}\subprojects\SDL2-2.30.6\SDL2-6.dll" + File "${PROJECT_BUILD_DIR}\subprojects\fmt-11.0.2\fmt.dll" + File "${PROJECT_BUILD_DIR}\subprojects\SDL2_ttf-2.20.1\sdl2_ttf.dll" + File "${PROJECT_BUILD_DIR}\subprojects\freetype-2.13.3\freetype-6.dll" + File "${PROJECT_BUILD_DIR}\subprojects\SDL2_image-2.6.3\sdl2image.dll" + File "${PROJECT_BUILD_DIR}\subprojects\libpng-1.6.44\png16-16.dll" + File "${PROJECT_BUILD_DIR}\subprojects\SDL2_mixer-2.6.2\sdl2mixer.dll" + File "${PROJECT_BUILD_DIR}\subprojects\libvorbis-1.3.7\lib\vorbisfile-3.dll" + File "${PROJECT_BUILD_DIR}\subprojects\libvorbis-1.3.7\lib\vorbis-0.dll" + File "${PROJECT_BUILD_DIR}\subprojects\libogg-1.3.5\src\ogg.dll" + File "${PROJECT_BUILD_DIR}\subprojects\flac-1.4.3\src\libFLAC\FLAC-8.dll" + File "${PROJECT_BUILD_DIR}\subprojects\openssl-3.0.8\crypto.dll" + File "${PROJECT_BUILD_DIR}\subprojects\openssl-3.0.8\ssl.dll" + File "${PROJECT_BUILD_DIR}\subprojects\nativefiledialog-extended-1.2.1\src\nativefiledialog-extended.dll" File "${PROJECT_SOURCE_DIR}\subprojects\discord_game_sdk-3.2.1\lib\x86_64\discord_game_sdk.dll" ; install default settings (DO NOT Override) From 17d30b8fa25df855b607827ba81890b86fd456fb Mon Sep 17 00:00:00 2001 From: "Totto16 (Windows VM)" Date: Thu, 3 Oct 2024 11:53:14 +0200 Subject: [PATCH 13/19] installer: use files() to pose a correct dependency on the chnaging of the .nsi file --- src/executables/meson.build | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/executables/meson.build b/src/executables/meson.build index fb9b687c..adac32d4 100644 --- a/src/executables/meson.build +++ b/src/executables/meson.build @@ -69,7 +69,9 @@ if build_application makensis = find_program('makensis') - nsis_script = meson.project_source_root() / 'tools' / 'installer' / 'setup.nsi' + nsis_script = files( + meson.project_source_root() / 'tools' / 'installer' / 'setup.nsi', + ) run_target( 'windows_installer', From 40cebf9bab62af7d55bfbb62f9a94c046b3033cf Mon Sep 17 00:00:00 2001 From: "Totto16 (Windows VM)" Date: Thu, 3 Oct 2024 12:08:43 +0200 Subject: [PATCH 14/19] installer: support local and Ci vcredist files by using a compile time if --- tools/installer/setup.nsi | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/tools/installer/setup.nsi b/tools/installer/setup.nsi index 25f7d388..95820a03 100644 --- a/tools/installer/setup.nsi +++ b/tools/installer/setup.nsi @@ -191,7 +191,7 @@ SectionEnd ;; source: partially https://stackoverflow.com/questions/62092185/how-to-install-the-visual-c-redist-using-nsis ;; and https://gist.github.com/mattiasghodsian/a30f50568792939e35e93e6bc2084c2a -!define VC_REDITS_NAME "vc_redist.x64.exe" +!define VC_REDIST_NAME "vc_redist.x64.exe" Section "-hidden Visual Studio C++ Runtime" ; install the MSVC C++ Redistributable (Runtime libraries needed by C++ and C), only if not already installed @@ -204,12 +204,26 @@ Section "-hidden Visual Studio C++ Runtime" DetailPrint "Visual Studio C++ Runtime NOT installed, launching installer" SetOutPath "$INSTDIR" - ; this dir is specifiy to github runners, locally it would be: "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Redist\MSVC\v143\${VC_REDITS_NAME}" - File "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Redist\MSVC\v143\${VC_REDITS_NAME}" + + ; this is executed at compile time, so we ge the correct path of the file, if we are in teh CI or local it differs + !if "$%CI%" == "true" + ; this dir is specific to github runners + !define VC_REDIST_ROOT "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Redist\MSVC" + !define VC_REDIST_VERSION "v143" + !else + ; TODO: allow custom folders via env variable + ; this dir is specific to my local setup + !define VC_REDIST_ROOT "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Redist\MSVC" + !define VC_REDIST_VERSION "v143" + !endif + + File "${VC_REDIST_ROOT}\${VC_REDIST_VERSION}\${VC_REDIST_NAME}" + ; error code is ignored, that is intended - ExecWait '"$INSTDIR\${VC_REDITS_NAME}" /install' + ExecWait '"$INSTDIR\${VC_REDIST_NAME}" /install' + ; it is not needed anymore - Delete "$INSTDIR\${VC_REDITS_NAME}" + Delete "$INSTDIR\${VC_REDIST_NAME}" ${Else} DetailPrint "Visual Studio C++ Runtime already installed, skipping installing it" ${EndIf} From ffd7e2ac0fd1629d34ddf1352a5be7b2ca89ee01 Mon Sep 17 00:00:00 2001 From: "Totto16 (Windows VM)" Date: Thu, 3 Oct 2024 12:12:09 +0200 Subject: [PATCH 15/19] assets: update gamecontrollerdb.txt file --- assets/mappings/gamecontrollerdb.txt | 608 ++++++++++++++------------- 1 file changed, 318 insertions(+), 290 deletions(-) diff --git a/assets/mappings/gamecontrollerdb.txt b/assets/mappings/gamecontrollerdb.txt index 691bce83..bd0b24e4 100644 --- a/assets/mappings/gamecontrollerdb.txt +++ b/assets/mappings/gamecontrollerdb.txt @@ -1,9 +1,10 @@ # Game Controller DB for SDL in 2.0.16 format # Source: https://github.com/gabomdq/SDL_GameControllerDB -# Fetched at: 2024-05-23T22:26:29.401Z +# Fetched at: 2024-10-03T10:11:10.435Z # Windows 03000000300f00000a01000000000000,3 In 1 Conversion Box,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:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows, +03000000fa190000918d000000000000,3 In 1 Conversion Box,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:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows, 03000000fa2d00000100000000000000,3dRudder Foot Motion Controller,leftx:a0,lefty:a1,rightx:a5,righty:a2,platform:Windows, 03000000d0160000040d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, 03000000d0160000050d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, @@ -20,6 +21,7 @@ 03000000801000000900000000000000,8BitDo F30 Arcade Stick,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00001038000000000000,8BitDo F30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +05000000c82d00006a28000000000000,8BitDo GameCube,a:b0,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b9,paddle2:b8,rightshoulder:b10,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b1,y:b4,platform:Windows, 03000000c82d00001251000000000000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00001151000000000000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000150000000000000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b4,y:b3,platform:Windows, @@ -73,6 +75,8 @@ 03000000c82d00000260000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000261000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00001230000000000000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001b30000000000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001d30000000000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00001530000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00001630000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00001730000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, @@ -109,13 +113,14 @@ 03000000830500000160000000000000,Arcade,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b4,platform:Windows, 03000000120c0000100e000000000000,Armor 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, 03000000490b00004406000000000000,ASCII Seamic Controller,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, -03000000869800002500000000000000,Astro C40 TR PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, +03000000869800002500000000000000,Astro C40 TR 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, 03000000a30c00002700000000000000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, 03000000a30c00002800000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, 03000000050b00000579000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000050b00000679000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000503200000110000000000000,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,start:b3,platform:Windows, 03000000503200000210000000000000,Atari VCS Modern Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, +03000000380800001889000000000000,AtGames Legends Gamer Pro,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b13,lefttrigger:b14,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 030000008a3500000102000000000000,Backbone One,a:b4,b:b5,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b10,leftstick:b17,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b18,righttrigger:b13,rightx:a3,righty:a4,start:b15,x:b7,y:b8,platform:Windows, 030000008a3500000201000000000000,Backbone One,a:b4,b:b5,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b10,leftstick:b17,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b18,righttrigger:b13,rightx:a3,righty:a4,start:b15,x:b7,y:b8,platform:Windows, 030000008a3500000302000000000000,Backbone One,a:b4,b:b5,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b10,leftstick:b17,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b18,righttrigger:b13,rightx:a3,righty:a4,start:b15,x:b7,y:b8,platform:Windows, @@ -125,7 +130,7 @@ 03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows, 030000006f0e00003201000000000000,Battlefield 4 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, 03000000ad1b000001f9000000000000,BB 070,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, -03000000d62000002a79000000000000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000d62000002a79000000000000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 03000000bc2000005250000000000000,Beitong G3,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a3,righty:a4,start:b15,x:b3,y:b4,platform:Windows, 030000000d0500000208000000000000,Belkin Nostromo N40,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, 03000000bc2000006012000000000000,Betop 2126F,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, @@ -142,8 +147,8 @@ 030000006b1400000209000000000000,Bigben,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, 030000006b1400000055000000000000,Bigben PS3 Controller,a:b0,b:b1,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:Windows, 030000006b1400000103000000000000,Bigben PS3 Controller,a:b0,b:b1,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:b3,y:b2,platform:Windows, -03000000120c0000200e000000000000,Brook Mars PS4 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, -03000000120c0000210e000000000000,Brook Mars 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:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000200e000000000000,Brook Mars 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:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000120c0000210e000000000000,Brook Mars 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:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 03000000120c0000f10e000000000000,Brook PS2 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, 03000000120c0000310c000000000000,Brook Super Converter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, 03000000d81d00000b00000000000000,Buffalo BSGP1601 Series,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows, @@ -225,7 +230,7 @@ 030000004c0e00001035000000000000,Gamester,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, 030000000d0f00001110000000000000,GameStick Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 0300000047530000616d000000000000,GameStop,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000c01100000140000000000000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000c01100000140000000000000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 03000000b62500000100000000000000,Gametel GT004 01,a:b3,b:b0,dpdown:b10,dpleft:b9,dpright:b8,dpup:b11,leftshoulder:b4,rightshoulder:b5,start:b7,x:b1,y:b2,platform:Windows, 030000008f0e00001411000000000000,Gamo2 Divaller,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, 03000000120c0000a857000000000000,Gator Claw,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, @@ -259,7 +264,7 @@ 030000000d0f00002500000000000000,Hori Fighting Commander 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:Windows, 030000000d0f00002d00000000000000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00005e00000000000000,Hori Fighting Commander 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:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005e00000000000000,Hori Fighting Commander 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:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 030000000d0f00008400000000000000,Hori Fighting Commander 5,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:Windows, 030000000d0f00006201000000000000,Hori Fighting Commander Octa,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,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00006401000000000000,Hori Fighting Commander Octa,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,start:b7,x:b2,y:b3,platform:Windows, @@ -267,7 +272,7 @@ 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,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, @@ -277,8 +282,8 @@ 030000000d0f00002100000000000000,Hori Fightstick V3,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, 030000000d0f00002700000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f0000a000000000000000,Hori Grip TAC4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b13,x:b0,y:b3,platform:Windows, -030000000d0f0000a500000000000000,Hori Miku Project Diva X HD 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:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f0000a600000000000000,Hori Miku Project Diva X HD 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:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000a500000000000000,Hori Miku Project Diva X HD 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:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000000d0f0000a600000000000000,Hori Miku Project Diva X HD 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:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 030000000d0f00000101000000000000,Hori Mini Hatsune Miku FT,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, 030000000d0f00005400000000000000,Hori 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:Windows, 030000000d0f00000900000000000000,Hori Pad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, @@ -312,7 +317,7 @@ 030000000d0f00001300000000000000,Horipad 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, 030000000d0f00005500000000000000,Horipad 4 FPS,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, 030000000d0f00006e00000000000000,Horipad 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,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00006600000000000000,Horipad 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,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006600000000000000,Horipad 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,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 030000000d0f00004200000000000000,Horipad A,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, 03000000ad1b000001f5000000000000,Horipad EXT2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 030000000d0f0000ee00000000000000,Horipad Mini 4,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:Windows, @@ -324,6 +329,7 @@ 03000000242e0000ff0b000000000000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Windows, 03000000790000004e95000000000000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Windows, 03000000242e00006a48000000000000,Hyperkin RetroN Sq,a:b3,b:b7,back:b5,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b0,rightshoulder:b1,start:b4,x:b2,y:b6,platform:Windows, +03000000242f00000a20000000000000,Hyperkin Scout,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, 03000000242e00006a38000000000000,Hyperkin Trooper 2,a:b0,b:b1,back:b4,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b3,start:b5,platform:Windows, 03000000d81d00000e00000000000000,iBuffalo AC02 Arcade Joystick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,rightx:a2,righty:a5,start:b8,x:b4,y:b5,platform:Windows, 03000000d81d00000f00000000000000,iBuffalo BSGP1204 Series,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:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, @@ -378,22 +384,22 @@ 03000000380700006352000000000000,Mad Catz CTRLR,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, 03000000380700006652000000000000,Mad Catz CTRLR,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:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, 03000000380700005032000000000000,Mad Catz Fightpad Pro 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:Windows, -03000000380700005082000000000000,Mad Catz Fightpad Pro 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,x:b0,y:b3,platform:Windows, +03000000380700005082000000000000,Mad Catz Fightpad Pro 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:Windows, 03000000380700008031000000000000,Mad Catz FightStick Alpha PS3 ,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, 030000003807000038b7000000000000,Mad Catz Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, 03000000380700008433000000000000,Mad Catz Fightstick TE S 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:Windows, -03000000380700008483000000000000,Mad Catz Fightstick TE S 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,x:b0,y:b3,platform:Windows, +03000000380700008483000000000000,Mad Catz Fightstick TE S 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:Windows, 03000000380700008134000000000000,Mad Catz Fightstick TE2 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008184000000000000,Mad Catz Fightstick TE2 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008184000000000000,Mad Catz Fightstick TE2 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 03000000380700006252000000000000,Mad Catz Micro CTRLR,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:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, 03000000380700008232000000000000,Mad Catz PlayStation Brawlpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000380700008731000000000000,Mad Catz PlayStation Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000003807000056a8000000000000,Mad Catz 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, 03000000380700001888000000000000,Mad Catz SFIV Fightstick PS3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000380700008081000000000000,Mad Catz SFV Arcade Fightstick Alpha 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,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008081000000000000,Mad Catz SFV Arcade Fightstick Alpha 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,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 03000000380700001847000000000000,Mad Catz Street Fighter 4 Xbox 360 FightStick,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, 03000000380700008034000000000000,Mad Catz TE2 PS3 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 030000002a0600001024000000000000,Matricom,a:b0,b:b1,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:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, 030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows, @@ -406,6 +412,7 @@ 03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, 0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,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:b3,y:b0,platform:Windows, 03000000d620000010a7000000000000,Mayflash Magic NS,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, +03000000242e0000f500000000000000,Mayflash N64 Adapter,a:b2,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a5,start:b9,platform:Windows, 03000000242f0000f400000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a5,start:b9,platform:Windows, 03000000790000007918000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,righttrigger:b7,rightx:a3,righty:a2,start:b8,platform:Windows, 030000008f0e00001030000000000000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, @@ -439,10 +446,10 @@ 03000000f70600000100000000000000,N64 Adaptoid,+rightx:b2,+righty:b1,-rightx:b4,-righty:b5,a:b0,b:b3,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,platform:Windows, 030000006f0e00001311000000000000,N64 Controller,+rightx:b10,+righty:b3,-rightx:b0,-righty:b11,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,platform:Windows, 030000006b140000010c000000000000,Nacon GC 400ES,a:b0,b:b1,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:Windows, -030000006b1400001106000000000000,Nacon Revolution 3 PS4 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, +030000006b1400001106000000000000,Nacon Revolution 3 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:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 0300000085320000170d000000000000,Nacon Revolution 5 Pro,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, 0300000085320000190d000000000000,Nacon Revolution 5 Pro,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, -030000006b140000100d000000000000,Nacon Revolution Infinity PS4 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, +030000006b140000100d000000000000,Nacon Revolution Infinity 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:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 030000006b140000080d000000000000,Nacon Revolution Unlimited Pro 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, 03000000bd12000001c0000000000000,Nebular,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:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows, 03000000eb0300000000000000000000,NeGcon Adapter,a:a2,b:b13,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,lefttrigger:a4,leftx:a1,righttrigger:b11,start:b3,x:a3,y:b12,platform:Windows, @@ -477,6 +484,7 @@ 03000000790000002201000000000000,PC 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, 030000006f0e00008501000000000000,PDP Fightpad Pro 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,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 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,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, @@ -485,7 +493,7 @@ 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 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,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,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, 03000000dd62000016a7000000000000,PowerA Fusion Pro 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,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, @@ -523,28 +531,28 @@ 030000008f0e00000300000000000000,PS3 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:a5,start:b9,x:b3,y:b0,platform:Windows, 030000008f0e00001431000000000000,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, 03000000ba2200002010000000000000,PS3 Controller,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:a5,righty:a2,start:b9,x:b3,y:b2,platform:Windows, -03000000120c00000807000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c0000111e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c0000121e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c0000130e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c0000150e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c0000180e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c0000181e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c0000191e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c00001e0e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c0000a957000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c0000aa57000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c0000f21c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c0000f31c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c0000f41c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c0000f51c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120c0000f70e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000120e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000160e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -030000001a1e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -030000004c050000a00b000000000000,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,x:b0,y:b3,platform:Windows, +03000000120c00000807000000000000,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, +03000000120c0000111e000000000000,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, +03000000120c0000121e000000000000,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, +03000000120c0000130e000000000000,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, +03000000120c0000150e000000000000,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, +03000000120c0000180e000000000000,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, +03000000120c0000181e000000000000,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, +03000000120c0000191e000000000000,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, +03000000120c00001e0e000000000000,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, +03000000120c0000a957000000000000,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, +03000000120c0000aa57000000000000,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, +03000000120c0000f21c000000000000,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, +03000000120c0000f31c000000000000,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, +03000000120c0000f41c000000000000,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, +03000000120c0000f51c000000000000,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, +03000000120c0000f70e000000000000,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, +03000000120e0000120c000000000000,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, +03000000160e0000120c000000000000,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, +030000001a1e0000120c000000000000,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, +030000004c050000a00b000000000000,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, 030000004c050000c405000000000000,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, -030000004c050000cc09000000000000,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,x:b0,y:b3,platform:Windows, +030000004c050000cc09000000000000,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, 030000004c0500005f0e000000000000,PS5 Access 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,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 030000004c050000e60c000000000000,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,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 030000004c050000f20d000000000000,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,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, @@ -559,7 +567,7 @@ 03000000300f00001210000000000000,Qanba Joystick Plus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, 03000000341a00000104000000000000,Qanba Joystick Q4RAF,a:b5,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b1,y:b2,platform:Windows, 03000000222c00000223000000000000,Qanba Obsidian Arcade Stick 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:Windows, -03000000222c00000023000000000000,Qanba Obsidian Arcade Stick PS4,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,x:b0,y:b3,platform:Windows, +03000000222c00000023000000000000,Qanba Obsidian Arcade Stick PS4,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:Windows, 030000008a2400006682000000000000,R1 Mobile Controller,a:b3,b:b1,back:b7,leftx:a0,lefty:a1,start:b6,x:b4,y:b0,platform:Windows, 03000000086700006626000000000000,RadioShack,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:a5,start:b9,x:b3,y:b0,platform:Windows, 03000000ff1100004733000000000000,Ramox FPS 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,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows, @@ -591,7 +599,7 @@ 03000000321500000003000000000000,Razer Hydra,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,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 03000000f8270000bf0b000000000000,Razer Kishi,a:b6,b:b7,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b18,leftshoulder:b12,leftstick:b19,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b13,rightstick:b20,righttrigger:b15,rightx:a3,righty:a4,start:b17,x:b9,y:b10,platform:Windows, 03000000321500000204000000000000,Razer Panthera 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, -03000000321500000104000000000000,Razer Panthera 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,x:b0,y:b3,platform:Windows, +03000000321500000104000000000000,Razer Panthera 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:Windows, 03000000321500000010000000000000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, 03000000321500000507000000000000,Razer Raiju Mobile,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:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000321500000707000000000000,Razer Raiju Mobile,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:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, @@ -599,7 +607,7 @@ 03000000321500000a10000000000000,Razer Raiju TE,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, 03000000321500000410000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, 03000000321500000910000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, -03000000321500000011000000000000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000011000000000000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 03000000321500000009000000000000,Razer Serval,+lefty:+a2,-lefty:-a1,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,leftx:a0,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 03000000921200004547000000000000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b6,x:b3,y:b4,platform:Windows, 03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, @@ -656,7 +664,7 @@ 03000000830500006120000000000000,Sanwa Smart Grip II,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,x:b1,y:b3,platform:Windows, 03000000c01100000051000000000000,Satechi 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:a5,start:b11,x:b3,y:b4,platform:Windows, 030000004f04000028b3000000000000,Score A,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, -03000000952e00002577000000000000,Scuf PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, +03000000952e00002577000000000000,Scuf 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, 03000000a30c00002500000000000000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Windows, 03000000a30c00002400000000000000,Sega Mega Drive Mini 6B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, 03000000d804000086e6000000000000,Sega Multi Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, @@ -666,7 +674,7 @@ 03000000b40400000a01000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, 030000003b07000004a1000000000000,SFX,a:b0,b:b2,back:b7,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Windows, 03000000f82100001900000000000000,Shogun Bros Chameleon X1,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000120c00001c1e000000000000,SnakeByte 4S PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, +03000000120c00001c1e000000000000,SnakeByte 4S 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, 03000000140300000918000000000000,SNES Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, 0300000081170000960a000000000000,SNES Controller,a:b4,b:b0,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b5,y:b1,platform:Windows, 03000000811700009d0a000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, @@ -681,7 +689,7 @@ 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,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, +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, 03000000110100001914000000000000,SteelSeries,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000381000001214000000000000,SteelSeries Free,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, 03000000110100003114000000000000,SteelSeries Stratus Duo,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:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, @@ -743,8 +751,8 @@ 03000000632500002305000000000000,USB Vibration Joystick,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, 03000000790000001a18000000000000,Venom,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, 03000000790000001b18000000000000,Venom Arcade Joystick,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, -030000006f0e00000302000000000000,Victrix PS4 Pro Fightstick,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, -030000006f0e00000702000000000000,Victrix PS4 Pro Fightstick,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,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000302000000000000,Victrix PS4 Pro Fightstick,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, +030000006f0e00000702000000000000,Victrix PS4 Pro Fightstick,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,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 0300000034120000adbe000000000000,vJoy Device,a:b0,b:b1,back:b15,dpdown:b6,dpleft:b7,dpright:b8,dpup:b5,guide:b16,leftshoulder:b9,leftstick:b13,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b14,righttrigger:b12,rightx:a3,righty:a4,start:b4,x:b2,y:b3,platform:Windows, 03000000120c0000ab57000000000000,Warrior Joypad JS083,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,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, 030000007e0500003003000000000000,Wii U Pro,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b6,leftstick:b11,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b12,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, @@ -772,7 +780,6 @@ 03000000120c00000a88000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a4,start:b6,x:b2,y:b3,platform:Windows, 03000000120c00001088000000000000,Xbox Controller,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, 030000002a0600002000000000000000,Xbox Controller,a:b0,b:b1,back:b13,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b5,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b15,righttrigger:b7,rightx:a2,righty:a5,start:b12,x:b2,y:b3,platform:Windows, -03000000300f00008888000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:b13,dpleft:b10,dpright:b11,dpup:b12,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, 03000000380700001645000000000000,Xbox Controller,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, 03000000380700002645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 03000000380700003645000000000000,Xbox Controller,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, @@ -781,7 +788,6 @@ 030000005e0400008502000000000000,Xbox Controller,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, 030000005e0400008702000000000000,Xbox Controller,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:b7,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, 030000005e0400008902000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b8,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b9,righttrigger:b4,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, -030000000d0f00006300000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 030000005e0400000c0b000000000000,Xbox One Controller,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, 030000005e040000d102000000000000,Xbox One Controller,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, 030000005e040000dd02000000000000,Xbox One Controller,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, @@ -815,6 +821,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X, 03000000c82d00000090000001000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00006a28000000010000,8BitDo GameCube,a:b0,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b9,paddle2:b8,rightshoulder:b10,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b1,y:b4,platform:Mac OS X, 03000000c82d00001251000000010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00001251000000020000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, @@ -856,6 +863,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c82d00000260000001000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00001230000000010000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001b30000001000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001d30000001000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00001530000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00001630000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00001730000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, @@ -874,6 +883,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, 03000000050b00000579000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b42,paddle1:b9,paddle2:b11,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, 03000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b23,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, +03000000503200000110000045010000,Atari VCS Classic,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b3,start:b2,platform:Mac OS X, 03000000503200000110000047010000,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b3,start:b2,platform:Mac OS X, 03000000503200000210000047010000,Atari VCS Modern Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Mac OS X, 030000008a3500000102000000010000,Backbone One,a:b0,b:b1,back:b16,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b17,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b15,x:b2,y:b3,platform:Mac OS X, @@ -883,9 +893,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000008a3500000302000000010000,Backbone One PlayStationÆ Edition,a:b0,b:b1,back:b16,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b17,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b15,x:b2,y:b3,platform:Mac OS X, 03000000c62400001a89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, 03000000c62400001b89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000120c0000200e000000010000,Brook Mars 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,x:b0,y:b3,platform:Mac OS X, -03000000120c0000210e000000010000,Brook Mars 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: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, +03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +03000000120c0000200e000000010000,Brook Mars 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:Mac OS X, +03000000120c0000210e000000010000,Brook Mars 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:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, 030000008305000031b0000000000000,Cideko AK08b,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:Mac OS X, 03000000d8140000cecf000000000000,Cthulhu,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, 03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Mac OS X, @@ -900,7 +910,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000ac0500001a06000002020000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000ad1b000001f9000000000000,Gamestop BB070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,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, 0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, -03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, 030000006f0e00000102000000000000,GameStop Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,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, 03000000ff1100003133000007010000,GameWare PC Control Pad,a:b2,b:b1,back:b10,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:a4,start:b11,x:b3,y:b0,platform:Mac OS X, 030000007d0400000540000001010000,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:Mac OS X, @@ -909,13 +919,13 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f00002d00000000100000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00005f00000000000000,Hori Fighting Commander 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,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00005f00000000010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00005e00000000000000,Hori Fighting Commander 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,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00005e00000000010000,Hori Fighting Commander 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:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005e00000000000000,Hori Fighting Commander 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,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005e00000000010000,Hori Fighting Commander 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:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, 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,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, @@ -923,7 +933,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f00000002000017010000,Hori Split Pad Fit,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:Mac OS X, 030000000d0f00000002000015010000,Hori Switch Split Pad Pro,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:Mac OS X, 030000000d0f00006e00000000010000,Horipad 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,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00006600000000010000,Horipad 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,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006600000000010000,Horipad 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,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, 030000000d0f00006600000000000000,Horipad FPS Plus 4,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:Mac OS X, 030000000d0f0000ee00000000010000,Horipad Mini 4,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:Mac OS X, 030000000d0f0000c100000072050000,Horipad 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,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, @@ -946,8 +956,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000006d04000018c2000000010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000380700005032000000010000,Mad Catz PS3 Fightpad Pro,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, 03000000380700008433000000010000,Mad Catz PS3 Fightstick TE S Plus,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, -03000000380700005082000000010000,Mad Catz PS4 Fightpad Pro,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, -03000000380700008483000000010000,Mad Catz PS4 Fightstick TE S Plus,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, +03000000380700005082000000010000,Mad Catz PS4 Fightpad Pro,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, +03000000380700008483000000010000,Mad Catz PS4 Fightstick TE S Plus,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, 03000000790000000600000007010000,Marvo GT-004,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:Mac OS X, 030000008f0e00001330000011010000,Mayflash Controller Adapter,a:b2,b:b4,back:b16,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b12,lefttrigger:b16,leftx:a0,lefty:a2,rightshoulder:b14,rightx:a6~,righty:a4,start:b18,x:b0,y:b6,platform:Mac OS X, 03000000790000004318000000010000,Mayflash GameCube Adapter,a:b4,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X, @@ -991,10 +1001,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, 030000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, 030000004c0500006802000072050000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, -030000004c050000a00b000000010000,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,x:b0,y:b3,platform:Mac OS X, -030000004c050000c405000000000000,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,x:b0,y:b3,platform:Mac OS X, -030000004c050000c405000000010000,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,x:b0,y:b3,platform:Mac OS X, -030000004c050000cc09000000010000,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,x:b0,y:b3,platform:Mac OS X, +030000004c050000a00b000000010000,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:Mac OS X, +030000004c050000c405000000000000,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:Mac OS X, +030000004c050000c405000000010000,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:Mac OS X, +030000004c050000cc09000000010000,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:Mac OS X, 0300004b4c0500005f0e000000010000,PS5 Access 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,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, 030000004c050000e60c000000010000,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,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, 030000004c050000f20d000000010000,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,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, @@ -1007,10 +1017,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 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, 030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,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, 03000000321500000204000000010000,Razer Panthera 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:Mac OS X, -03000000321500000104000000010000,Razer Panthera 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,x:b0,y:b3,platform:Mac OS X, +03000000321500000104000000010000,Razer Panthera 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:Mac OS X, 03000000321500000010000000010000,Razer Raiju,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, 03000000321500000507000001010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000321500000011000000010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000011000000010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, 03000000321500000009000000020000,Razer Serval,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, 030000003215000000090000163a0000,Razer Serval,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, 0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,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, @@ -1034,8 +1044,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000b40400000a01000000000000,Sega Saturn,a:b0,b:b1,back:b5,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X, 030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, 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,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,x:b0,y:b3,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,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, @@ -1065,8 +1075,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X, 03000000632500002605000000010000,Uberwith Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000151900005678000010010000,Uniplay U6,a:b3,b:b6,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,leftstick:b31,lefttrigger:b21,leftx:a1,lefty:a3,rightshoulder:b19,rightstick:b33,righttrigger:b23,rightx:a4,righty:a5,start:b27,x:b11,y:b13,platform:Mac OS X, -030000006f0e00000302000025040000,Victrix PS4 Pro Fightstick,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, -030000006f0e00000702000003060000,Victrix PS4 Pro Fightstick,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,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006f0e00000302000025040000,Victrix PS4 Pro Fightstick,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:Mac OS X, +030000006f0e00000702000003060000,Victrix PS4 Pro Fightstick,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,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, 050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X, 050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,platform:Mac OS X, 030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,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, @@ -1081,7 +1091,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,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, 030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,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, 030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, -030000005e040000e002000003090000,Xbox One Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000e002000003090000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, 030000005e040000e302000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,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, 030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,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, 030000005e040000fd02000003090000,Xbox One Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, @@ -1091,6 +1101,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000005e040000130b000015050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000007050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000005e040000130b000017050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000005e040000220b000017050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Mac OS X, @@ -1103,6 +1114,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000021000000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,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:b4,y:b3,platform:Linux, 03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,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:b4,y:b3,platform:Linux, +05000000c82d00006a28000000010000,8BitDo GameCube,a:b0,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b9,paddle2:b8,rightshoulder:b10,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b1,y:b4,platform:Linux, 03000000c82d00001251000011010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00001251000000010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00001151000011010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, @@ -1110,11 +1122,13 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00000650000011010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000a20000000020000,8BitDo M30 Xbox,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,start:b7,x:b2,y:b3,platform:Linux, 03000000c82d00002090000011010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00002090000000010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux, 03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,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:b4,y:b3,platform:Linux, 05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,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:b4,y:b3,platform:Linux, +03000000c82d00006928000011010000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Linux, 05000000c82d00006928000000010000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Linux, 05000000c82d00002590000001000000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000008000000210000011010000,8BitDo NES30,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, @@ -1136,6 +1150,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000431000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Linux, +03000000c82d00000060000011010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00000060000000010000,8BitDo SF30 Pro,a:b1,b:b0,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:b4,y:b3,platform:Linux, 05000000c82d00000061000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 030000003512000012ab000010010000,8BitDo SFC30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux, @@ -1154,6 +1169,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 05000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000202800000900000000010000,8BitDo SNES30,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00001230000000010000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000a31000014010000,8BitDo Ultimate 2C,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, +03000000c82d00001d30000011010000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00001b30000001000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00001530000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00001630000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00001730000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, @@ -1168,7 +1186,6 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 05000000a00500003232000001000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, 05000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, -050000005e040000e002000030110000,8BitDo Zero 2,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, 05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c01100000355000011010000,Acrux Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 030000006f0e00008801000011010000,Afterglow Deluxe 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,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, @@ -1205,7 +1222,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000008a3500000302000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 030000008a3500000402000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000c62400001b89000011010000,BDA MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 03000000c21100000791000011010000,Be1 GC101 Controller 1.03,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:Linux, 03000000c31100000791000011010000,Be1 GC101 Controller 1.03,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 030000005e0400008e02000003030000,Be1 GC101 Xbox 360,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, @@ -1213,8 +1230,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 05000000bc2000000055000001000000,Betop AX1 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000bc2000006412000011010000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b30,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:Linux, 030000006b1400000209000011010000,Bigben,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:Linux, -03000000120c0000200e000011010000,Brook Mars 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,x:b0,y:b3,platform:Linux, -03000000120c0000210e000011010000,Brook Mars 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:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000200e000011010000,Brook Mars 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:Linux, +03000000120c0000210e000011010000,Brook Mars 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:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 03000000120c0000f70e000011010000,Brook Universal Fighting Board,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, 03000000e82000006058000001010000,Cideko AK08b,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:Linux, 03000000af1e00002400000010010000,Clockwork Pi DevTerm,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b9,x:b3,y:b0,platform:Linux, @@ -1267,13 +1284,13 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f00006d00000020010000,Hori EDGE 301,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, 030000000d0f00008400000011010000,Hori Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00005f00000011010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00005e00000011010000,Hori Fighting Commander 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:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00005e00000011010000,Hori Fighting Commander 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:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 030000000d0f00005001000009040000,Hori Fighting Commander OCTA Xbox One,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, 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,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, @@ -1289,7 +1306,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f00008501000017010000,Hori Split Pad Fit,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, 030000000d0f00008501000015010000,Hori Switch Split Pad Pro,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, 030000000d0f00006e00000011010000,Horipad 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,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00006600000011010000,Horipad 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,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006600000011010000,Horipad 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,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 030000000d0f0000ee00000011010000,Horipad Mini 4,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, 030000000d0f0000c100000011010000,Horipad 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,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00006700000001010000,Horipad One,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, @@ -1340,12 +1357,12 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 05000000380700006652000025010000,Mad Catz CTRLR,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, 03000000380700008532000010010000,Mad Catz Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, 03000000380700005032000011010000,Mad Catz Fightpad Pro 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, -03000000380700005082000011010000,Mad Catz Fightpad Pro 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,x:b0,y:b3,platform:Linux, +03000000380700005082000011010000,Mad Catz Fightpad Pro 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, 03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,a:b0,b:b1,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:b2,y:b3,platform:Linux, 03000000380700008034000011010000,Mad Catz Fightstick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000380700008084000011010000,Mad Catz Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008084000011010000,Mad Catz Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 03000000380700008433000011010000,Mad Catz Fightstick TE S 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, -03000000380700008483000011010000,Mad Catz Fightstick TE S 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,x:b0,y:b3,platform:Linux, +03000000380700008483000011010000,Mad Catz Fightstick TE S 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, 03000000380700001888000010010000,Mad Catz Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000380700003888000010010000,Mad Catz Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:a0,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 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, @@ -1388,6 +1405,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000005e040000050b000003090000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 050000005e0400008e02000030110000,Microsoft Xbox One Elite 2,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,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b14,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e040000120b00000b050000,Microsoft 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, +060000005e040000120b000001050000,Microsoft Xbox Series X 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, 03000000030000000300000002000000,Miroof,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, 03000000790000001c18000010010000,Mobapad Chitu HD,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:Linux, 050000004d4f435554452d3035335800,Mocute 053X,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, @@ -1465,7 +1483,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 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 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: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, 03000000dd62000015a7000011010000,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:Linux, 03000000d620000012a7000011010000,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:Linux, 03000000d62000000140000001010000,PowerA Fusion Pro 2 Controller,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:Linux, @@ -1480,7 +1498,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c62400001a54000001010000,PowerA Xbox One Mini 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, 03000000d62000000240000001010000,PowerA Xbox One Spectra Infinity,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:Linux, 03000000d62000000f20000001010000,PowerA Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,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, +03000000d62000000b20000001010000,PowerA Xbox Series X 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, 030000006d040000d2ca000011010000,Precision 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:Linux, +03000000250900000017000010010000,PS/SS/N64 Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b5,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2~,righty:a3,start:b8,platform:Linux, 03000000ff1100004133000010010000,PS2 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, 03000000341a00003608000011010000,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, 030000004c0500006802000010010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, @@ -1496,18 +1516,18 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000004c0500006802000000810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,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, 05000000504c415953544154494f4e00,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, 060000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -030000004c050000a00b000011010000,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,x:b0,y:b3,platform:Linux, +030000004c050000a00b000011010000,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:Linux, 030000004c050000a00b000011810000,PS4 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, -030000004c050000c405000011010000,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,x:b0,y:b3,platform:Linux, +030000004c050000c405000011010000,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:Linux, 030000004c050000c405000011810000,PS4 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, -030000004c050000cc09000000010000,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,x:b0,y:b3,platform:Linux, -030000004c050000cc09000011010000,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,x:b0,y:b3,platform:Linux, +030000004c050000cc09000000010000,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:Linux, +030000004c050000cc09000011010000,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:Linux, 030000004c050000cc09000011810000,PS4 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, -03000000c01100000140000011010000,PS4 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:Linux, -050000004c050000c405000000010000,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,x:b0,y:b3,platform:Linux, +03000000c01100000140000011010000,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:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +050000004c050000c405000000010000,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:Linux, 050000004c050000c405000000810000,PS4 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, 050000004c050000c405000001800000,PS4 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, -050000004c050000cc09000000010000,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,x:b0,y:b3,platform:Linux, +050000004c050000cc09000000010000,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:Linux, 050000004c050000cc09000000810000,PS4 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, 050000004c050000cc09000001800000,PS4 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, 0300004b4c0500005f0e000011010000,PS5 Access 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,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, @@ -1519,25 +1539,29 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 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,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,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,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, +0300132d9b2800006500000001010000,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, 030000009b2800003200000001010000,Raphnet GC and N64 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, 030000009b2800006000000001010000,Raphnet GC and N64 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, 030000009b2800008000000020020000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux, 03000000f8270000bf0b000011010000,Razer Kishi,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000321500000204000011010000,Razer Panthera 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, -03000000321500000104000011010000,Razer Panthera 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,x:b0,y:b3,platform:Linux, -03000000321500000810000011010000,Razer Panthera PS4 Evo Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,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:Linux, +03000000321500000104000011010000,Razer Panthera 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, +03000000321500000810000011010000,Razer Panthera PS4 Evo Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,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, 03000000321500000010000011010000,Razer Raiju,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:Linux, 03000000321500000507000000010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 05000000321500000a10000001000000,Razer Raiju Tournament Edition,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,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:Linux, -03000000321500000011000011010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000011000011010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 030000008916000000fe000024010000,Razer Sabertooth,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, 03000000c6240000045d000024010000,Razer Sabertooth,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, 03000000c6240000045d000025010000,Razer Sabertooth,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, @@ -1585,7 +1609,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000bc2000000055000010010000,Shanwan Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000f025000021c1000010010000,Shanwan Gioteck PS3 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:Linux, 03000000341a00000908000010010000,SL6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -050000004c050000cc09000001000000,Sony DualShock 4,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:Linux, +030000004b2900000430000011000000,Snakebyte 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, +050000004c050000cc09000001000000,Sony DualShock 4,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, 03000000ff000000cb01000010010000,Sony PlayStation Portable,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, 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, @@ -1655,8 +1680,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000100800000300000010010000,USB Gamepad,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, 03000000790000000600000007010000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux, 03000000790000001100000000010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux, -030000006f0e00000302000011010000,Victrix Pro Fightstick 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,x:b0,y:b3,platform:Linux, -030000006f0e00000702000011010000,Victrix Pro Fightstick 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,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00000302000011010000,Victrix Pro Fightstick 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:Linux, +030000006f0e00000702000011010000,Victrix Pro Fightstick 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,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 05000000ac0500003232000001000000,VR Box Controller,a:b0,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:b2,y:b3,platform:Linux, 05000000434f4d4d414e440000000000,VX Gaming Command Series,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 0000000058626f782033363020576900,Xbox 360 Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, @@ -1667,6 +1692,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000005e040000a102000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e040000a102000007010000,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, 030000005e040000a102000030060000,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, +030000006f0e00001503000000020000,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, 030000005e0400008e02000000010000,Xbox 360 EasySMX,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, 030000005e040000a102000014010000,Xbox 360 Receiver,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e0400000202000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, @@ -1691,7 +1717,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000005e040000120b000007050000,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,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e040000120b000009050000,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, 030000005e040000120b00000d050000,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,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000120b00000f050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,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, +030000005e040000120b00000f050000,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, +030000005e040000120b000015050000,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, 030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 050000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 050000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, @@ -1719,183 +1746,184 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000120c0000101e000011010000,Zeroplus P4,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:Linux, # Android -38653964633230666463343334313533,8BitDo Adapter,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -36666264316630653965636634386234,8BitDo Adapter 2,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38653964633230666463343334313533,8BitDo Adapter,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +36666264316630653965636634386234,8BitDo Adapter 2,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 38426974446f20417263616465205374,8BitDo Arcade Stick,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b5,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -61393962646434393836356631636132,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, -64323139346131306233636562663738,8BitDo Arcade Stick,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, -64643565386136613265663236636564,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, -33313433353539306634656436353432,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -38426974446f20446f67626f6e65204d,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, -34343439373236623466343934376233,8BitDo FC30 Pro,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b28,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b29,righttrigger:b7,start:b5,x:b30,y:b2,platform:Android, -38426974446f2038426974446f204c69,8BitDo Lite,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -30643332373663313263316637356631,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974446f204c6974652032000000,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -62656331626461363634633735353032,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38393936616436383062666232653338,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974446f204c6974652053450000,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -39356430616562366466646636643435,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +61393962646434393836356631636132,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +64323139346131306233636562663738,8BitDo Arcade Stick,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +64643565386136613265663236636564,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +33313433353539306634656436353432,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38426974446f20446f67626f6e65204d,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, +34343439373236623466343934376233,8BitDo FC30 Pro,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b28,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b29,righttrigger:b7,start:b5,x:b30,y:b2,platform:Android, +38426974446f204e4743204d6f646b69,8BitDo GameCube,a:b0,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b18,paddle2:b17,rightshoulder:b15,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b1,y:b3,platform:Android, +38426974446f2038426974446f204c69,8BitDo Lite,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +30643332373663313263316637356631,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f204c6974652032000000,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +62656331626461363634633735353032,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38393936616436383062666232653338,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f204c6974652053450000,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +39356430616562366466646636643435,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 05000000c82d000006500000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a5,rightshoulder:b10,righttrigger:a4,start:b6,x:b3,y:b2,platform:Android, 05000000c82d000051060000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,start:b6,x:b3,y:b2,platform:Android, -32323161363037623637326438643634,8BitDo M30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -33656266353630643966653238646264,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,start:b10,x:b19,y:b2,platform:Android, -38426974446f204d3330204d6f646b69,8BitDo M30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -39366630663062373237616566353437,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,start:b6,x:b2,y:b3,platform:Android, -64653533313537373934323436343563,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,start:b6,x:b2,y:b3,platform:Android, -66356438346136366337386437653934,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,start:b18,x:b19,y:b2,platform:Android, -66393064393162303732356665666366,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b2,y:b3,platform:Android, -38426974446f204d6963726f2067616d,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android, -61653365323561356263373333643266,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android, -62613137616239666338343866326336,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android, -33663431326134333366393233616633,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, -38426974446f204e3330204d6f646b69,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, +32323161363037623637326438643634,8BitDo M30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +33656266353630643966653238646264,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,start:b10,x:b19,y:b2,platform:Android, +38426974446f204d3330204d6f646b69,8BitDo M30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39366630663062373237616566353437,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,start:b6,x:b2,y:b3,platform:Android, +64653533313537373934323436343563,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,start:b6,x:b2,y:b3,platform:Android, +66356438346136366337386437653934,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,start:b18,x:b19,y:b2,platform:Android, +66393064393162303732356665666366,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b2,y:b3,platform:Android, +38426974446f204d6963726f2067616d,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android, +61653365323561356263373333643266,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android, +62613137616239666338343866326336,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android, +33663431326134333366393233616633,8BitDo N30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, +38426974446f204e3330204d6f646b69,8BitDo N30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, 05000000c82d000015900000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 05000000c82d000065280000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38323035343766666239373834336637,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android, -38426974446f204e3634204d6f646b69,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android, -32363135613966656338666638666237,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -35363534633333373639386466346631,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -38426974446f204e454f47454f204750,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -39383963623932353561633733306334,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38323035343766666239373834336637,8BitDo N64,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android, +38426974446f204e3634204d6f646b69,8BitDo N64,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android, +32363135613966656338666638666237,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35363534633333373639386466346631,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38426974446f204e454f47454f204750,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39383963623932353561633733306334,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000000220000000900000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 050000002038000009000000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38313433643131656262306631373166,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -38326536643339353865323063616339,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -38426974446f2050333020636c617373,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -35376664343164386333616535333434,8BitDo Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,start:b10,x:b19,y:b2,platform:Android, -38426974446f2038426974446f205072,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974446f2050726f203200000000,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -61333362366131643730353063616330,8BitDo Pro 2,a:b1,b:b0,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -62373739366537363166326238653463,8BitDo Pro 2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b3,y:b2,platform:Android, -38386464613034326435626130396565,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974446f2038426974446f205265,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -66303230343038613365623964393766,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974446f20533330204d6f646b69,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -66316462353561376330346462316137,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38313433643131656262306631373166,8BitDo P30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38326536643339353865323063616339,8BitDo P30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38426974446f2050333020636c617373,8BitDo P30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35376664343164386333616535333434,8BitDo Pro 2,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,start:b10,x:b19,y:b2,platform:Android, +38426974446f2038426974446f205072,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f2050726f203200000000,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +61333362366131643730353063616330,8BitDo Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +62373739366537363166326238653463,8BitDo Pro 2,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b3,y:b2,platform:Android, +38386464613034326435626130396565,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f2038426974446f205265,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +66303230343038613365623964393766,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f20533330204d6f646b69,8BitDo S30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66316462353561376330346462316137,8BitDo S30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 05000000c82d000000600000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 05000000c82d000000610000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974646f20534633302050726f00,8BitDo SF30 Pro,a:b1,b:b0,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b17,platform:Android, +38426974646f20534633302050726f00,8BitDo SF30 Pro,a:b1,b:b0,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b17,platform:Android, 61623334636338643233383735326439,8BitDo SFC30,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b31,start:b5,x:b30,y:b2,platform:Android, 05000000c82d000012900000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, 05000000c82d000062280000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, -38316230613931613964356666353839,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974446f20534e3330204d6f646b,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -65323563303231646531383162646335,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -35383531346263653330306238353131,8BitDo SN30 PP,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38316230613931613964356666353839,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f20534e3330204d6f646b,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +65323563303231646531383162646335,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +35383531346263653330306238353131,8BitDo SN30 PP,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 05000000c82d000001600000ffff3f00,8BitDo SN30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 05000000c82d000002600000ffff0f00,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -36653638656632326235346264663661,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, -38303232393133383836366330346462,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, -38346630346135363335366265656666,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974446f20534e33302050726f2b,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -536f6e7920436f6d707574657220456e,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -66306331643531333230306437353936,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +36653638656632326235346264663661,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +38303232393133383836366330346462,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +38346630346135363335366265656666,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f20534e33302050726f2b,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +536f6e7920436f6d707574657220456e,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66306331643531333230306437353936,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 050000002028000009000000ffff3f00,8BitDo SNES30,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 050000003512000020ab000000780f00,8BitDo SNES30,a:b21,b:b20,back:b30,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b26,rightshoulder:b27,start:b31,x:b24,y:b23,platform:Android, 33666663316164653937326237613331,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, 38426974646f205a65726f2047616d65,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, 05000000c82d000018900000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, 05000000c82d000030320000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, -33663434393362303033616630346337,8BitDo Zero 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, -34656330626361666438323266633963,8BitDo Zero 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, -63396666386564393334393236386630,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, -63633435623263373466343461646430,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, -32333634613735616163326165323731,Amazon Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, -4c696e757820342e31392e3137322077,Anbernic Gamepad,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a4,start:b6,x:b2,y:b3,platform:Android, +33663434393362303033616630346337,8BitDo Zero 2,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +34656330626361666438323266633963,8BitDo Zero 2,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, +63396666386564393334393236386630,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +63633435623263373466343461646430,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +32333634613735616163326165323731,Amazon Luna Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +4c696e757820342e31392e3137322077,Anbernic Gamepad,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a4,start:b6,x:b2,y:b3,platform:Android, 417374726f2063697479206d696e6920,Astro City Mini,a:b23,b:b22,back:b29,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android, -35643263313264386134376362363435,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,start:b6,platform:Android, -32353831643566306563643065356239,Atari VCS Modern Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35643263313264386134376362363435,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,start:b6,platform:Android, +32353831643566306563643065356239,Atari VCS Modern Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 4f64696e20436f6e74726f6c6c657200,AYN Odin,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b14,dpright:b13,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:+a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -32303165626138343962363666346165,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +32303165626138343962363666346165,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, 38383337343564366131323064613561,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -34313430343161653665353737323365,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, -4875694a6961204a432d573031550000,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, -30363230653635633863366338623265,Evo VR,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,x:b2,y:b3,platform:Android, +34313430343161653665353737323365,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, +4875694a6961204a432d573031550000,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, +30363230653635633863366338623265,Evo VR,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,x:b2,y:b3,platform:Android, 05000000b404000011240000dfff3f00,Flydigi Vader 2,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 05000000bc20000000550000ffff3f00,GameSir G3w,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -34323662653333636330306631326233,Google Nexus,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -35383633353935396534393230616564,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34323662653333636330306631326233,Google Nexus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35383633353935396534393230616564,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 05000000d6020000e5890000dfff3f00,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, 05000000d6020000e5890000dfff3f80,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,platform:Android, -66633030656131663837396562323935,Hori Battle,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, -35623466343433653739346434636330,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -484f524920434f2e2c4c54442e203130,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -484f524920434f2e2c4c544420205041,Hori Gem Pad 3,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android, -65656436646661313232656661616130,Hori PC Engine Mini Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b18,platform:Android, -31303433326562636431653534636633,Hori Real Arcade Pro 3,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -32656664353964393561366362333636,Hori Switch Split Pad Pro,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, -30306539356238653637313730656134,HORIPAD Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +66633030656131663837396562323935,Hori Battle,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +35623466343433653739346434636330,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +484f524920434f2e2c4c54442e203130,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +484f524920434f2e2c4c544420205041,Hori Gem Pad 3,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android, +65656436646661313232656661616130,Hori PC Engine Mini Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,start:b18,platform:Android, +31303433326562636431653534636633,Hori Real Arcade Pro 3,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +32656664353964393561366362333636,Hori Switch Split Pad Pro,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +30306539356238653637313730656134,HORIPAD Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, 48797065726b696e2050616400000000,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android, 62333331353131353034386136626636,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android, -31306635363562663834633739396333,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, -5368616e57616e202020202048797065,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +31306635363562663834633739396333,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +5368616e57616e202020202048797065,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, 0500000083050000602000000ffe0000,iBuffalo SNES Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b15,rightshoulder:b16,start:b10,x:b2,y:b3,platform:Android, -5553422c322d6178697320382d627574,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,rightshoulder:b18,start:b10,x:b3,y:b2,platform:Android, +5553422c322d6178697320382d627574,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b17,rightshoulder:b18,start:b10,x:b3,y:b2,platform:Android, 64306137363261396266353433303531,InterAct GoPad,a:b24,b:b25,leftshoulder:b23,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,x:b21,y:b22,platform:Android, -532e542e442e20496e74657261637420,InterAct HammerHead FX,a:b23,b:b24,back:b30,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b22,lefttrigger:b28,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b25,righttrigger:b29,rightx:a2,righty:a3,start:b31,x:b20,y:b21,platform:Android, -65346535636333663931613264643164,Joy-Con,a:b21,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b23,y:b24,platform:Android, -33346566643039343630376565326335,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, -35313531613435623366313835326238,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, -4a6f792d436f6e20284c290000000000,Joy-Con (L),a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, -38383665633039363066383334653465,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, -39363561613936303237333537383931,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, -4a6f792d436f6e202852290000000000,Joy-Con (R),a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, -39656136363638323036303865326464,JYS Aapter,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -63316564383539663166353034616434,JYS Adapter,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android, -64623163333561643339623235373232,Logitech F310,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -35623364393661626231343866613337,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -4c6f6769746563682047616d65706164,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -64396331333230326333313330336533,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -39653365373864633935383236363438,Logitech G Cloud,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -416d617a6f6e2047616d6520436f6e74,Luna Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, -4c756e612047616d6570616400000000,Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -30363066623539323534363639323363,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -31353762393935386662336365626334,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -39623565346366623931666633323530,Magic NS,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android, -6d6179666c617368206c696d69746564,Mayflash GameCube Adapter,a:b22,b:b21,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a5,righty:a2,start:b30,x:b23,y:b24,platform:Android, -436f6e74726f6c6c6572000000000000,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, -65666330633838383061313633326461,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, -37316565396364386635383230353365,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, -4875694a696120205553422047616d65,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, -535a4d792d706f776572204c54442043,Mayflash Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b31,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, -30653962643666303631376438373532,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, -39346131396233376535393665363161,Mayflash Wii U Pro Adapter,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftstick:b31,lefttrigger:b27,rightshoulder:b26,rightstick:b0,righttrigger:b28,rightx:a0,righty:a1,start:b30,x:b21,y:b24,platform:Android, +532e542e442e20496e74657261637420,InterAct HammerHead FX,a:b23,b:b24,back:b30,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,leftstick:b22,lefttrigger:b28,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b25,righttrigger:b29,rightx:a2,righty:a3,start:b31,x:b20,y:b21,platform:Android, +65346535636333663931613264643164,Joy-Con,a:b21,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b23,y:b24,platform:Android, +33346566643039343630376565326335,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, +35313531613435623366313835326238,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, +4a6f792d436f6e20284c290000000000,Joy-Con (L),a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, +38383665633039363066383334653465,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +39363561613936303237333537383931,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +4a6f792d436f6e202852290000000000,Joy-Con (R),a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +39656136363638323036303865326464,JYS Aapter,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +63316564383539663166353034616434,JYS Adapter,a:b1,b:b3,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android, +64623163333561643339623235373232,Logitech F310,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35623364393661626231343866613337,Logitech F710,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4c6f6769746563682047616d65706164,Logitech F710,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +64396331333230326333313330336533,Logitech F710,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39653365373864633935383236363438,Logitech G Cloud,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +416d617a6f6e2047616d6520436f6e74,Luna Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +4c756e612047616d6570616400000000,Luna Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30363066623539323534363639323363,Magic NS,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +31353762393935386662336365626334,Magic NS,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +39623565346366623931666633323530,Magic NS,a:b1,b:b3,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android, +6d6179666c617368206c696d69746564,Mayflash GameCube Adapter,a:b22,b:b21,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a5,righty:a2,start:b30,x:b23,y:b24,platform:Android, +436f6e74726f6c6c6572000000000000,Mayflash N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +65666330633838383061313633326461,Mayflash N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +37316565396364386635383230353365,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, +4875694a696120205553422047616d65,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, +535a4d792d706f776572204c54442043,Mayflash Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b31,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, +30653962643666303631376438373532,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, +39346131396233376535393665363161,Mayflash Wii U Pro Adapter,a:b22,b:b23,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,leftstick:b31,lefttrigger:b27,rightshoulder:b26,rightstick:b0,righttrigger:b28,rightx:a0,righty:a1,start:b30,x:b21,y:b24,platform:Android, 31323564663862633234646330373138,Mega Drive,a:b23,b:b22,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android, -37333564393261653735306132613061,Mega Drive,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, -64363363336633363736393038313464,Mega Drive,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Android, -33323763323132376537376266393366,Microsoft Dual Strike,a:b24,b:b23,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b29,rightshoulder:b78,rightx:a0,righty:a1~,start:b26,x:b22,y:b21,platform:Android, +37333564393261653735306132613061,Mega Drive,a:b21,b:b22,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, +64363363336633363736393038313464,Mega Drive,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,start:b9,x:b2,y:b3,platform:Android, +33323763323132376537376266393366,Microsoft Dual Strike,a:b24,b:b23,back:b25,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b29,rightshoulder:b78,rightx:a0,righty:a1~,start:b26,x:b22,y:b21,platform:Android, 30306461613834333439303734316539,Microsoft SideWinder Pro,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b20,lefttrigger:b9,rightshoulder:b19,righttrigger:b10,start:b17,x:b2,y:b3,platform:Android, -32386235353630393033393135613831,Microsoft Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -4d4f42415041442050726f2d48440000,Mobapad Chitu HD,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -4d4f435554452d303533582d4d35312d,Mocute 053X,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -33343361376163623438613466616531,Mocute M053,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -39306635663061636563316166303966,Mocute M053,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +32386235353630393033393135613831,Microsoft Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4d4f42415041442050726f2d48440000,Mobapad Chitu HD,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4d4f435554452d303533582d4d35312d,Mocute 053X,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +33343361376163623438613466616531,Mocute M053,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39306635663061636563316166303966,Mocute M053,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 7573622067616d657061642020202020,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Android, 050000007e05000009200000ffff0f00,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b17,y:b2,platform:Android, 34323437396534643531326161633738,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,misc1:b5,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -50726f20436f6e74726f6c6c65720000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b2,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b10,rightx:a2,righty:a3,start:b18,y:b3,platform:Android, -36326533353166323965623661303933,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android, -4e363420436f6e74726f6c6c65720000,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android, -534e455320436f6e74726f6c6c657200,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, -64623863346133633561626136366634,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +50726f20436f6e74726f6c6c65720000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b2,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b10,rightx:a2,righty:a3,start:b18,y:b3,platform:Android, +36326533353166323965623661303933,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android, +4e363420436f6e74726f6c6c65720000,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android, +534e455320436f6e74726f6c6c657200,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +64623863346133633561626136366634,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, 050000005509000003720000cf7f3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000005509000010720000ffff3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000005509000014720000df7f3f00,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, 050000005509000014720000df7f3f80,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,platform:Android, -37336435666338653565313731303834,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -61363931656135336130663561616264,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +37336435666338653565313731303834,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +61363931656135336130663561616264,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 39383335313438623439373538343266,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b16,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,x:b1,y:b19,platform:Android, 4f5559412047616d6520436f6e74726f,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b6,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b19,platform:Android, -506572666f726d616e63652044657369,PDP PS3 Rock Candy Controller,a:b1,b:b17,back:h0.2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android, +506572666f726d616e63652044657369,PDP PS3 Rock Candy Controller,a:b1,b:b17,back:h0.2,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android, 62653335326261303663356263626339,PlayStation Classic Controller,a:b19,b:b1,back:b17,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b3,rightshoulder:b10,righttrigger:b20,start:b18,x:b2,y:b0,platform:Android, -536f6e7920496e746572616374697665,PlayStation Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -576972656c65737320436f6e74726f6c,PlayStation Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -61653962353232366130326530363061,Pokken,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,rightshoulder:b20,righttrigger:b10,start:b18,x:b0,y:b2,platform:Android, -32666633663735353234363064386132,PS2,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a3,righty:a2,start:b30,x:b24,y:b21,platform:Android, +536f6e7920496e746572616374697665,PlayStation Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +576972656c65737320436f6e74726f6c,PlayStation Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +61653962353232366130326530363061,Pokken,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,rightshoulder:b20,righttrigger:b10,start:b18,x:b0,y:b2,platform:Android, +32666633663735353234363064386132,PS2,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a3,righty:a2,start:b30,x:b24,y:b21,platform:Android, 050000004c05000068020000dfff3f00,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 536f6e7920504c415953544154494f4e,PS3 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -61363034663839376638653463633865,PS3 Controller,a:b0,b:b1,back:b15,dpdown:a14,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +61363034663839376638653463633865,PS3 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 66366539656564653432353139356536,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 66383132326164626636313737373037,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000004c050000c405000000783f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, @@ -1904,89 +1932,89 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000004c050000c4050000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000004c050000cc090000fffe3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000004c050000cc090000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -30303839663330346632363232623138,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, -31326235383662333266633463653332,PS4 Controller,a:b1,b:b16,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b17,x:b0,y:b2,platform:Android, -31373231336561636235613666323035,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -31663838336334393132303338353963,PS4 Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -34613139376634626133336530386430,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -35643031303033326130316330353564,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, -37626233336235343937333961353732,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -37626464343430636562316661643863,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -38393161636261653636653532386639,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -63313733393535663339656564343962,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -63393662363836383439353064663939,PS4 Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -65366465656364636137653363376531,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -66613532303965383534396638613230,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +30303839663330346632363232623138,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +31326235383662333266633463653332,PS4 Controller,a:b1,b:b16,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b17,x:b0,y:b2,platform:Android, +31373231336561636235613666323035,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +31663838336334393132303338353963,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34613139376634626133336530386430,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35643031303033326130316330353564,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +37626233336235343937333961353732,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +37626464343430636562316661643863,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38393161636261653636653532386639,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +63313733393535663339656564343962,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +63393662363836383439353064663939,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65366465656364636137653363376531,PS4 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +66613532303965383534396638613230,PS4 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, 050000004c050000e60c0000fffe3f00,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, 050000004c050000e60c0000fffe3f80,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a3,rightx:a4,righty:a5,start:b16,x:b0,y:b2,platform:Android, 050000004c050000e60c0000ffff3f00,PS5 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, -37363764353731323963323639666565,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, -61303162353165316365336436343139,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, -64336263393933626535303339616332,Qanba 4RAF,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, -36626666353861663864336130363137,Razer Junglecat,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +37363764353731323963323639666565,PS5 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +61303162353165316365336436343139,PS5 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +64336263393933626535303339616332,Qanba 4RAF,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +36626666353861663864336130363137,Razer Junglecat,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 05000000f8270000bf0b0000ffff3f00,Razer Kishi,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -62653861643333663663383332396665,Razer Kishi,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +62653861643333663663383332396665,Razer Kishi,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000003215000005070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000003215000007070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000003215000000090000bf7f3f00,Razer Serval,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, -5a6869587520526574726f2042697420,Retro Bit Saturn Controller,a:b21,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b26,rightshoulder:b27,righttrigger:b28,start:b30,x:b23,y:b24,platform:Android, +5a6869587520526574726f2042697420,Retro Bit Saturn Controller,a:b21,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b26,rightshoulder:b27,righttrigger:b28,start:b30,x:b23,y:b24,platform:Android, 32417865732031314b6579732047616d,Retro Bit SNES Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, 36313938306539326233393732613361,Retro Bit SNES Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, -526574726f466c616720576972656420,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,rightshoulder:b18,start:b10,x:b2,y:b3,platform:Android, -61343739353764363165343237303336,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,lefttrigger:b18,leftx:a0,lefty:a1,start:b10,x:b2,y:b3,platform:Android, -526574726f696420506f636b65742043,Retroid Pocket,a:b1,b:b0,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -582d426f7820436f6e74726f6c6c6572,Retroid Pocket,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -38653130373365613538333235303036,Retroid Pocket 2,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -64363363336633363736393038313463,Retrolink,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b6,platform:Android, +526574726f466c616720576972656420,Retro Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b17,rightshoulder:b18,start:b10,x:b2,y:b3,platform:Android, +61343739353764363165343237303336,Retro Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b17,lefttrigger:b18,leftx:a0,lefty:a1,start:b10,x:b2,y:b3,platform:Android, +526574726f696420506f636b65742043,Retroid Pocket,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +582d426f7820436f6e74726f6c6c6572,Retroid Pocket,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38653130373365613538333235303036,Retroid Pocket 2,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +64363363336633363736393038313463,Retrolink,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,start:b6,platform:Android, 37393234373533633333323633646531,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android, 5365616c6965436f6d707574696e6720,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android, 526574726f5553422e636f6d20534e45,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android, 64643037633038386238303966376137,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android, -37656564346533643138636436356230,Rock Candy Switch Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -33373336396634316434323337666361,RumblePad 2,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b24,platform:Android, -36363537303435333566386638366333,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -53616d73756e672047616d6520506164,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +37656564346533643138636436356230,Rock Candy Switch Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +33373336396634316434323337666361,RumblePad 2,a:b22,b:b23,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b24,platform:Android, +36363537303435333566386638366333,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +53616d73756e672047616d6520506164,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 66386565396238363534313863353065,Sanwa PlayOnline Mobile,a:b21,b:b22,back:b23,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b24,platform:Android, -32383165316333383766336338373261,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, +32383165316333383766336338373261,Saturn,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, 38613865396530353338373763623431,Saturn,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b10,rightshoulder:b20,righttrigger:b19,start:b17,x:b2,y:b3,platform:Android, -61316232336262373631343137633631,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, -30353835333338613130373363646337,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, -66386262366536653765333235343634,SG H510,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, -66633132393363353531373465633064,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, -62653761636366393366613135366338,SN30 PP,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +61316232336262373631343137633631,Saturn,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, +30353835333338613130373363646337,SG H510,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +66386262366536653765333235343634,SG H510,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +66633132393363353531373465633064,SG H510,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +62653761636366393366613135366338,SN30 PP,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 38376662666661636265313264613039,SNES,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, 5346432f555342205061640000000000,SNES Adapter,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, -5553422047616d657061642000000000,SNES Controller,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, -63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android, -63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android, -476f6f676c65204c4c43205374616469,Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +5553422047616d657061642000000000,SNES Controller,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android, +63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android, +476f6f676c65204c4c43205374616469,Stadia Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 5374616469614e3848532d6532633400,Stadia Controller,a:b0,b:b1,back:b15,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, 05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, -0500000011010000201400000f7e0f00,SteelSeries Nimbus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,x:b19,y:b2,platform:Android, +0500000011010000201400000f7e0f00,SteelSeries Nimbus,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,x:b19,y:b2,platform:Android, 35306436396437373135383665646464,SteelSeries Nimbus Plus,a:b0,b:b1,leftshoulder:b3,leftstick:b17,lefttrigger:b9,leftx:a0,rightshoulder:b20,rightstick:b18,righttrigger:b10,rightx:a2,x:b19,y:b2,platform:Android, 33313930373536613937326534303931,Taito Egret II Mini Control Panel,a:b25,b:b23,back:b27,guide:b30,leftx:a0,lefty:a1,rightshoulder:b21,righttrigger:b22,start:b28,x:b29,y:b24,platform:Android, -54475a20436f6e74726f6c6c65720000,TGZ Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -62363434353532386238336663643836,TGZ Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +54475a20436f6e74726f6c6c65720000,TGZ Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +62363434353532386238336663643836,TGZ Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 37323236633763666465316365313236,THEC64 Joystick,a:b21,b:b22,back:b27,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b27,x:b23,y:b24,platform:Android, 38346162326232346533316164363336,THEGamepad,a:b23,b:b22,back:b27,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b24,y:b21,platform:Android, 050000004f0400000ed00000fffe3f00,ThrustMaster eSwap Pro Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -5477696e20555342204a6f7973746963,Twin Joystick,a:b22,b:b21,back:b28,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android, -30623739343039643830333266346439,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -31643365666432386133346639383937,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -30386438313564306161393537333663,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, -33333034646336346339646538643633,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, +5477696e20555342204a6f7973746963,Twin Joystick,a:b22,b:b21,back:b28,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android, +30623739343039643830333266346439,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +31643365666432386133346639383937,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30386438313564306161393537333663,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, +33333034646336346339646538643633,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, 050000005e0400008e02000000783f00,Xbox 360 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 30396232393162346330326334636566,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 38313038323730383864666463383533,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -58626f782033363020576972656c6573,Xbox 360 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +58626f782033363020576972656c6573,Xbox 360 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 65353331386662343338643939643636,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 65613532386633373963616462363038,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -47656e6572696320582d426f78207061,Xbox Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -4d6963726f736f667420582d426f7820,Xbox Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -64633436313965656664373634323364,Xbox Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +47656e6572696320582d426f78207061,Xbox Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4d6963726f736f667420582d426f7820,Xbox Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +64633436313965656664373634323364,Xbox Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000005e04000091020000ff073f00,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, 050000005e04000091020000ff073f80,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000005e040000e00200000ffe3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android, @@ -1994,11 +2022,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000005e040000e0020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android, 050000005e040000e0020000ffff3f80,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a2,righty:a3,start:b10,x:b17,y:b2,platform:Android, 050000005e040000fd020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -33356661323266333733373865656366,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -34356136633366613530316338376136,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,x:b17,y:b2,platform:Android, -35623965373264386238353433656138,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +33356661323266333733373865656366,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34356136633366613530316338376136,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,x:b17,y:b2,platform:Android, +35623965373264386238353433656138,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 36616131643361333337396261666433,Xbox One Controller,a:b0,b:b1,back:b15,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -58626f7820576972656c65737320436f,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +58626f7820576972656c65737320436f,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000005e040000000b000000783f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, 050000005e040000000b000000783f80,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000005e040000050b0000ffff3f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, @@ -2007,8 +2035,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000005e040000fd020000ff7f3f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000005e040000120b000000783f00,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, 050000005e040000120b000000783f80,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000005e040000130b0000ffff3f00,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -65633038363832353634653836396239,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000130b0000ffff3f00,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65633038363832353634653836396239,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000001727000044310000ffff3f00,XiaoMi Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, # iOS From 08be3f502187c395de8567f22184de3e71840ea8 Mon Sep 17 00:00:00 2001 From: Totto16 Date: Thu, 3 Oct 2024 12:35:39 +0200 Subject: [PATCH 16/19] linter: format all cpp and meson files --- src/game/game.hpp | 2 +- src/game/graphic_helpers.hpp | 2 +- src/game/grid.hpp | 2 +- src/game/simulated_tetrion.hpp | 11 +++-- src/game/simulation.hpp | 2 +- src/game/tetrion.hpp | 2 +- src/game/tetromino.hpp | 2 +- src/graphics/renderer.hpp | 2 +- src/graphics/text.hpp | 2 +- src/graphics/texture.hpp | 5 ++- src/graphics/window.hpp | 2 +- src/helper/meson.build | 2 +- src/input/controller_input.hpp | 2 +- src/input/input_creator.hpp | 7 +--- src/input/joystick_input.hpp | 17 ++++---- src/libs/core/helper/color.hpp | 7 +++- src/libs/core/helper/sleep.cpp | 10 ++--- src/libs/core/helper/static_string.hpp | 14 +++---- src/libs/core/meson.build | 2 +- .../utility/additional_information.hpp | 41 +++++++++++-------- .../recordings/utility/checksum_helper.hpp | 2 +- src/libs/recordings/utility/recording.hpp | 2 +- .../recordings/utility/recording_writer.hpp | 2 +- .../utility/tetrion_core_information.hpp | 2 +- .../recordings/utility/tetrion_snapshot.hpp | 10 +++-- src/lobby/api.hpp | 2 +- src/manager/settings_manager.hpp | 10 ++--- .../recording_selector/recording_chooser.hpp | 9 ++-- src/ui/focusable.hpp | 2 +- tests/utils/meson.build | 2 +- tools/dependencies/meson.build | 7 +--- wrapper/c | 2 +- wrapper/haskell | 2 +- wrapper/javascript | 2 +- 34 files changed, 102 insertions(+), 90 deletions(-) diff --git a/src/game/game.hpp b/src/game/game.hpp index 3283c0de..0535edb8 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -3,10 +3,10 @@ #include #include "helper/clock_source.hpp" +#include "helper/windows.hpp" #include "input/input_creator.hpp" #include "tetrion.hpp" #include "ui/widget.hpp" -#include "helper/windows.hpp" struct Game : public ui::Widget { private: diff --git a/src/game/graphic_helpers.hpp b/src/game/graphic_helpers.hpp index ac3d29e3..c0d22296 100644 --- a/src/game/graphic_helpers.hpp +++ b/src/game/graphic_helpers.hpp @@ -2,8 +2,8 @@ #include -#include "manager/service_provider.hpp" #include "helper/windows.hpp" +#include "manager/service_provider.hpp" enum class MinoTransparency : u8 { // here the enum value is used as index into the preview alpha array diff --git a/src/game/grid.hpp b/src/game/grid.hpp index d7580757..bf6c35dd 100644 --- a/src/game/grid.hpp +++ b/src/game/grid.hpp @@ -4,10 +4,10 @@ #include #include "graphics/rect.hpp" +#include "helper/windows.hpp" #include "manager/service_provider.hpp" #include "ui/layout.hpp" #include "ui/widget.hpp" -#include "helper/windows.hpp" struct Grid final : public ui::Widget { public: diff --git a/src/game/simulated_tetrion.hpp b/src/game/simulated_tetrion.hpp index 16e96830..209e85ac 100644 --- a/src/game/simulated_tetrion.hpp +++ b/src/game/simulated_tetrion.hpp @@ -8,12 +8,12 @@ #include "bag.hpp" #include "grid.hpp" +#include "helper/windows.hpp" #include "input/game_input.hpp" #include "manager/service_provider.hpp" #include "tetromino.hpp" #include "ui/layouts/grid_layout.hpp" #include "ui/widget.hpp" -#include "helper/windows.hpp" #include @@ -110,12 +110,15 @@ struct SimulatedTetrion { OOPETRIS_GRAPHICS_EXPORTED void update_step(SimulationStep simulation_step_index); // returns if the input event lead to a movement - OOPETRIS_GRAPHICS_EXPORTED bool handle_input_command(input::GameInputCommand command, SimulationStep simulation_step_index); + OOPETRIS_GRAPHICS_EXPORTED bool + handle_input_command(input::GameInputCommand command, SimulationStep simulation_step_index); OOPETRIS_GRAPHICS_EXPORTED void spawn_next_tetromino(SimulationStep simulation_step_index); - OOPETRIS_GRAPHICS_EXPORTED void spawn_next_tetromino(helper::TetrominoType type, SimulationStep simulation_step_index); + OOPETRIS_GRAPHICS_EXPORTED void + spawn_next_tetromino(helper::TetrominoType type, SimulationStep simulation_step_index); OOPETRIS_GRAPHICS_EXPORTED bool rotate_tetromino_right(); OOPETRIS_GRAPHICS_EXPORTED bool rotate_tetromino_left(); - OOPETRIS_GRAPHICS_EXPORTED bool move_tetromino_down(MovementType movement_type, SimulationStep simulation_step_index); + OOPETRIS_GRAPHICS_EXPORTED bool + move_tetromino_down(MovementType movement_type, SimulationStep simulation_step_index); OOPETRIS_GRAPHICS_EXPORTED bool move_tetromino_left(); OOPETRIS_GRAPHICS_EXPORTED bool move_tetromino_right(); OOPETRIS_GRAPHICS_EXPORTED bool drop_tetromino(SimulationStep simulation_step_index); diff --git a/src/game/simulation.hpp b/src/game/simulation.hpp index 37d07305..c1515718 100644 --- a/src/game/simulation.hpp +++ b/src/game/simulation.hpp @@ -3,10 +3,10 @@ #include #include "core/helper/expected.hpp" +#include "helper/windows.hpp" #include "input/input_creator.hpp" #include "input/replay_input.hpp" #include "simulated_tetrion.hpp" -#include "helper/windows.hpp" struct Simulation { private: diff --git a/src/game/tetrion.hpp b/src/game/tetrion.hpp index 90dd297f..36583674 100644 --- a/src/game/tetrion.hpp +++ b/src/game/tetrion.hpp @@ -5,13 +5,13 @@ #include #include +#include "helper/windows.hpp" #include "input/game_input.hpp" #include "manager/service_provider.hpp" #include "simulated_tetrion.hpp" #include "ui/layout.hpp" #include "ui/layouts/tile_layout.hpp" #include "ui/widget.hpp" -#include "helper/windows.hpp" namespace recorder { struct RecordingWriter; diff --git a/src/game/tetromino.hpp b/src/game/tetromino.hpp index 3c81e974..6538af57 100644 --- a/src/game/tetromino.hpp +++ b/src/game/tetromino.hpp @@ -3,8 +3,8 @@ #include #include "graphic_helpers.hpp" -#include "rotation.hpp" #include "helper/windows.hpp" +#include "rotation.hpp" #include diff --git a/src/graphics/renderer.hpp b/src/graphics/renderer.hpp index 07639ace..faf412a8 100644 --- a/src/graphics/renderer.hpp +++ b/src/graphics/renderer.hpp @@ -2,11 +2,11 @@ #include +#include "helper/windows.hpp" #include "manager/font.hpp" #include "rect.hpp" #include "texture.hpp" #include "window.hpp" -#include "helper/windows.hpp" #include #include diff --git a/src/graphics/text.hpp b/src/graphics/text.hpp index 6b21d59f..52798319 100644 --- a/src/graphics/text.hpp +++ b/src/graphics/text.hpp @@ -2,11 +2,11 @@ #include +#include "helper/windows.hpp" #include "manager/font.hpp" #include "manager/service_provider.hpp" #include "rect.hpp" #include "texture.hpp" -#include "helper/windows.hpp" struct Text final { private: diff --git a/src/graphics/texture.hpp b/src/graphics/texture.hpp index e27f8c52..8db232f3 100644 --- a/src/graphics/texture.hpp +++ b/src/graphics/texture.hpp @@ -6,9 +6,9 @@ #include #include +#include "helper/windows.hpp" #include "manager/font.hpp" #include "rect.hpp" -#include "helper/windows.hpp" #include #include @@ -26,7 +26,8 @@ struct Texture { explicit Texture(SDL_Texture* raw_texture); public: - OOPETRIS_GRAPHICS_EXPORTED static Texture from_image(SDL_Renderer* renderer, const std::filesystem::path& image_path); + OOPETRIS_GRAPHICS_EXPORTED static Texture + from_image(SDL_Renderer* renderer, const std::filesystem::path& image_path); OOPETRIS_GRAPHICS_EXPORTED static Texture prerender_text( SDL_Renderer* renderer, diff --git a/src/graphics/window.hpp b/src/graphics/window.hpp index 39020634..43033f3b 100644 --- a/src/graphics/window.hpp +++ b/src/graphics/window.hpp @@ -4,8 +4,8 @@ #include "graphics/rect.hpp" #include "helper/message_box.hpp" -#include "sdl_context.hpp" #include "helper/windows.hpp" +#include "sdl_context.hpp" #include #include diff --git a/src/helper/meson.build b/src/helper/meson.build index d5823266..58d92379 100644 --- a/src/helper/meson.build +++ b/src/helper/meson.build @@ -12,7 +12,7 @@ graphics_src_files += files( 'music_utils.hpp', 'platform.cpp', 'platform.hpp', - 'windows.hpp' + 'windows.hpp', ) if have_file_dialogs diff --git a/src/input/controller_input.hpp b/src/input/controller_input.hpp index 0d4c1d44..cd0a8ef9 100644 --- a/src/input/controller_input.hpp +++ b/src/input/controller_input.hpp @@ -2,10 +2,10 @@ #pragma once +#include "helper/windows.hpp" #include "input.hpp" #include "joystick_input.hpp" #include "manager/sdl_controller_key.hpp" -#include "helper/windows.hpp" namespace input { diff --git a/src/input/input_creator.hpp b/src/input/input_creator.hpp index 7398307f..6339c50a 100644 --- a/src/input/input_creator.hpp +++ b/src/input/input_creator.hpp @@ -38,11 +38,8 @@ namespace input { using AdditionalInfo = std::tuple, tetrion::StartingParameters>; OOPETRIS_GRAPHICS_EXPORTED - [[nodiscard]] std::pair, recorder::AdditionalInformation> - get_game_parameters_for_replay( - ServiceProvider* service_provider, - const std::filesystem::path& recording_path - ); + [[nodiscard]] std::pair, recorder::AdditionalInformation> + get_game_parameters_for_replay(ServiceProvider* service_provider, const std::filesystem::path& recording_path); OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] helper::expected get_single_player_game_parameters( diff --git a/src/input/joystick_input.hpp b/src/input/joystick_input.hpp index 7ffb62e6..dc464097 100644 --- a/src/input/joystick_input.hpp +++ b/src/input/joystick_input.hpp @@ -106,8 +106,9 @@ namespace input { OOPETRIS_GRAPHICS_EXPORTED static void discover_devices(std::vector>& inputs); OOPETRIS_GRAPHICS_EXPORTED - [[nodiscard]] static helper::expected, std::string> - get_by_device_index(int device_index); + [[nodiscard]] static helper::expected, std::string> get_by_device_index( + int device_index + ); OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] static bool process_special_inputs(const SDL_Event& event, std::vector>& inputs); @@ -277,12 +278,12 @@ namespace input { OOPETRIS_GRAPHICS_EXPORTED - [[nodiscard]] static helper::expected, std::string> - get_game_input_by_settings( - const input::InputManager& input_manager, - EventDispatcher* event_dispatcher, - const JoystickSettings& settings - ); + [[nodiscard]] static helper::expected, std::string> + get_game_input_by_settings( + const input::InputManager& input_manager, + EventDispatcher* event_dispatcher, + const JoystickSettings& settings + ); OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const JoystickInput* underlying_input() const override; diff --git a/src/libs/core/helper/color.hpp b/src/libs/core/helper/color.hpp index 6dd6cd6d..f4cd2220 100644 --- a/src/libs/core/helper/color.hpp +++ b/src/libs/core/helper/color.hpp @@ -62,7 +62,8 @@ struct HSVColor { constexpr HSVColor() : HSVColor{ 0.0, 0.0, 0.0, 0 } { } - OOPETRIS_CORE_EXPORTED [[nodiscard]] static helper::expected from_string(const std::string& value + OOPETRIS_CORE_EXPORTED [[nodiscard]] static helper::expected from_string( + const std::string& value ); using InfoType = std::tuple; @@ -139,7 +140,9 @@ struct Color { constexpr Color(u8 red, u8 green, u8 blue) : Color{ red, green, blue, 0xFF } { } - OOPETRIS_CORE_EXPORTED [[nodiscard]] static helper::expected from_string(const std::string& value); + OOPETRIS_CORE_EXPORTED [[nodiscard]] static helper::expected from_string( + const std::string& value + ); using InfoType = std::tuple; diff --git a/src/libs/core/helper/sleep.cpp b/src/libs/core/helper/sleep.cpp index 9ddde9d2..69269408 100644 --- a/src/libs/core/helper/sleep.cpp +++ b/src/libs/core/helper/sleep.cpp @@ -44,12 +44,12 @@ bool helper::sleep_nanoseconds(std::chrono::nanoseconds ns) { #else int result{}; - struct timespec remaining { }; - struct timespec current { + struct timespec remaining{}; + struct timespec current{ static_cast(std::chrono::duration_cast(ns).count()), - static_cast( - ns.count() % std::chrono::duration_cast(1s).count() - ), + static_cast( + ns.count() % std::chrono::duration_cast(1s).count() + ), }; do { // NOLINT(cppcoreguidelines-avoid-do-while) diff --git a/src/libs/core/helper/static_string.hpp b/src/libs/core/helper/static_string.hpp index 62a0e4f2..f279ad83 100644 --- a/src/libs/core/helper/static_string.hpp +++ b/src/libs/core/helper/static_string.hpp @@ -31,13 +31,13 @@ struct StaticString { } // iterator trait - using iterator = char * ; //NOLINT(readability-identifier-naming) - using const_iterator = const char*; //NOLINT(readability-identifier-naming) - using difference_type = std::ptrdiff_t; //NOLINT(readability-identifier-naming) - using value_type = char; //NOLINT(readability-identifier-naming) - using pointer = char * ; //NOLINT(readability-identifier-naming) - using reference = char&; //NOLINT(readability-identifier-naming) - using iterator_category = std::bidirectional_iterator_tag; //NOLINT(readability-identifier-naming) + using iterator = char*; //NOLINT(readability-identifier-naming) + using const_iterator = const char*; //NOLINT(readability-identifier-naming) + using difference_type = std::ptrdiff_t; //NOLINT(readability-identifier-naming) + using value_type = char; //NOLINT(readability-identifier-naming) + using pointer = char*; //NOLINT(readability-identifier-naming) + using reference = char&; //NOLINT(readability-identifier-naming) + using iterator_category = std::bidirectional_iterator_tag; //NOLINT(readability-identifier-naming) [[nodiscard]] constexpr iterator begin() { diff --git a/src/libs/core/meson.build b/src/libs/core/meson.build index 1634c1ed..2da91d76 100644 --- a/src/libs/core/meson.build +++ b/src/libs/core/meson.build @@ -14,7 +14,7 @@ liboopetris_core = library( include_directories: core_lib.get('inc_dirs'), dependencies: core_lib.get('deps'), cpp_args: core_lib.get('compile_args'), - cpp_shared_args: ['-DOOPETRIS_LIBRARY_CORE_EXPORT','-DHASH_LIBRARY_EXPORT'], + cpp_shared_args: ['-DOOPETRIS_LIBRARY_CORE_EXPORT', '-DHASH_LIBRARY_EXPORT'], override_options: { 'warning_level': '3', 'werror': true, diff --git a/src/libs/recordings/utility/additional_information.hpp b/src/libs/recordings/utility/additional_information.hpp index e52eff0f..31a3c1cb 100644 --- a/src/libs/recordings/utility/additional_information.hpp +++ b/src/libs/recordings/utility/additional_information.hpp @@ -3,9 +3,9 @@ #include "./checksum_helper.hpp" #include "./helper.hpp" +#include "./windows.hpp" #include #include -#include "./windows.hpp" #include #include @@ -65,7 +65,7 @@ namespace recorder { return m_value; } - OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] std::string to_string(u32 recursion_depth = 0) const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] std::string to_string(u32 recursion_depth = 0) const; template [[nodiscard]] bool operator==(const T& other) const { // NOLINT(misc-no-recursion) @@ -115,13 +115,14 @@ namespace recorder { ); } - OOPETRIS_RECORDINGS_EXPORTED static helper::expected, std::string> read_from_istream( - std::istream& istream - ); + OOPETRIS_RECORDINGS_EXPORTED static helper::expected, std::string> + read_from_istream(std::istream& istream); - OOPETRIS_RECORDINGS_EXPORTED[[nodiscard]] helper::expected, std::string> to_bytes(u32 recursion_depth = 0) const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] helper::expected, std::string> to_bytes( + u32 recursion_depth = 0 + ) const; - OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] static std::vector string_to_bytes(const std::string& value); + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] static std::vector string_to_bytes(const std::string& value); private: static helper::expected read_string_from_istream(std::istream& istream); @@ -142,11 +143,14 @@ namespace recorder { explicit AdditionalInformation(UnderlyingContainer&& values); public: - OOPETRIS_RECORDINGS_EXPORTED explicit AdditionalInformation(); + OOPETRIS_RECORDINGS_EXPORTED explicit AdditionalInformation(); - OOPETRIS_RECORDINGS_EXPORTED static helper::expected from_istream(std::istream& istream); + OOPETRIS_RECORDINGS_EXPORTED static helper::expected from_istream( + std::istream& istream + ); - OOPETRIS_RECORDINGS_EXPORTED void add_value(const std::string& key, const InformationValue& value, bool overwrite = false); + OOPETRIS_RECORDINGS_EXPORTED void + add_value(const std::string& key, const InformationValue& value, bool overwrite = false); template void add(const std::string& key, const T& raw_value, bool overwrite = false) { @@ -154,9 +158,9 @@ namespace recorder { add_value(key, value, overwrite); } - OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] std::optional get(const std::string& key) const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] std::optional get(const std::string& key) const; - OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] bool has(const std::string& key) const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] bool has(const std::string& key) const; template [[nodiscard]] std::optional get_if(const std::string& key) const { @@ -174,9 +178,10 @@ namespace recorder { return value.as(); } - OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] helper::expected, std::string> to_bytes() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] helper::expected, std::string> to_bytes() const; - OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] helper::expected get_checksum() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] helper::expected get_checksum( + ) const; // iterator trait using iterator = UnderlyingContainer::iterator; //NOLINT(readability-identifier-naming) @@ -188,13 +193,13 @@ namespace recorder { using iterator_category = std::bidirectional_iterator_tag; //NOLINT(readability-identifier-naming) - OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] iterator begin(); + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] iterator begin(); - OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] const_iterator begin() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] const_iterator begin() const; - OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] iterator end(); + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] iterator end(); - OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] const_iterator end() const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] const_iterator end() const; }; STATIC_ASSERT_WITH_MESSAGE( diff --git a/src/libs/recordings/utility/checksum_helper.hpp b/src/libs/recordings/utility/checksum_helper.hpp index 85623c67..33504f34 100644 --- a/src/libs/recordings/utility/checksum_helper.hpp +++ b/src/libs/recordings/utility/checksum_helper.hpp @@ -2,9 +2,9 @@ #pragma once +#include "./windows.hpp" #include #include -#include "./windows.hpp" #include #include diff --git a/src/libs/recordings/utility/recording.hpp b/src/libs/recordings/utility/recording.hpp index 85121b0d..bb35d89c 100644 --- a/src/libs/recordings/utility/recording.hpp +++ b/src/libs/recordings/utility/recording.hpp @@ -1,9 +1,9 @@ #pragma once +#include "./windows.hpp" #include #include #include -#include "./windows.hpp" #include "./additional_information.hpp" #include "./checksum_helper.hpp" diff --git a/src/libs/recordings/utility/recording_writer.hpp b/src/libs/recordings/utility/recording_writer.hpp index 376a4c5d..7e6f4fc7 100644 --- a/src/libs/recordings/utility/recording_writer.hpp +++ b/src/libs/recordings/utility/recording_writer.hpp @@ -5,8 +5,8 @@ #include "./recording.hpp" #include "./tetrion_core_information.hpp" -#include #include "./windows.hpp" +#include #include diff --git a/src/libs/recordings/utility/tetrion_core_information.hpp b/src/libs/recordings/utility/tetrion_core_information.hpp index f41a727a..8f7df5a6 100644 --- a/src/libs/recordings/utility/tetrion_core_information.hpp +++ b/src/libs/recordings/utility/tetrion_core_information.hpp @@ -21,5 +21,5 @@ struct TetrionCoreInformation { level{ level }, score{ score }, lines_cleared{ lines_cleared }, - mino_stack{ std::move(mino_stack) } {}; + mino_stack{ std::move(mino_stack) } { }; }; diff --git a/src/libs/recordings/utility/tetrion_snapshot.hpp b/src/libs/recordings/utility/tetrion_snapshot.hpp index 3990f48a..f833e764 100644 --- a/src/libs/recordings/utility/tetrion_snapshot.hpp +++ b/src/libs/recordings/utility/tetrion_snapshot.hpp @@ -1,9 +1,9 @@ #pragma once +#include "./windows.hpp" #include #include #include -#include "./windows.hpp" #include "./tetrion_core_information.hpp" @@ -39,7 +39,9 @@ struct TetrionSnapshot final { MinoStack mino_stack ); - OOPETRIS_RECORDINGS_EXPORTED static helper::expected from_istream(std::istream& istream); + OOPETRIS_RECORDINGS_EXPORTED static helper::expected from_istream( + std::istream& istream + ); OOPETRIS_RECORDINGS_EXPORTED TetrionSnapshot(std::unique_ptr information, SimulationStep simulation_step_index); @@ -58,5 +60,7 @@ struct TetrionSnapshot final { OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] std::vector to_bytes() const; - OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] helper::expected compare_to(const TetrionSnapshot& other) const; + OOPETRIS_RECORDINGS_EXPORTED [[nodiscard]] helper::expected compare_to( + const TetrionSnapshot& other + ) const; }; diff --git a/src/lobby/api.hpp b/src/lobby/api.hpp index ce5ba43e..eca63d03 100644 --- a/src/lobby/api.hpp +++ b/src/lobby/api.hpp @@ -67,7 +67,7 @@ namespace lobby { OOPETRIS_GRAPHICS_EXPORTED ~Client(); OOPETRIS_GRAPHICS_EXPORTED - [[nodiscard]] helper::expected static get_client(const std::string& url); + [[nodiscard]] helper::expected static get_client(const std::string& url); OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] bool is_authenticated(); diff --git a/src/manager/settings_manager.hpp b/src/manager/settings_manager.hpp index b0adbf43..5d1f81df 100644 --- a/src/manager/settings_manager.hpp +++ b/src/manager/settings_manager.hpp @@ -1,12 +1,12 @@ #pragma once +#include "helper/windows.hpp" #include "input/controller_input.hpp" #include "input/joystick_input.hpp" #include "input/keyboard_input.hpp" #include "input/touch_input.hpp" #include "manager/service_provider.hpp" -#include "helper/windows.hpp" #include #include @@ -78,9 +78,9 @@ namespace detail { }; - OOPETRIS_GRAPHICS_EXPORTED void to_json(nlohmann::json& obj, const Settings& settings); + OOPETRIS_GRAPHICS_EXPORTED void to_json(nlohmann::json& obj, const Settings& settings); - OOPETRIS_GRAPHICS_EXPORTED void from_json(const nlohmann::json& obj, Settings& settings); + OOPETRIS_GRAPHICS_EXPORTED void from_json(const nlohmann::json& obj, Settings& settings); } // namespace detail @@ -91,7 +91,7 @@ struct SettingsManager { detail::Settings m_settings; public: - OOPETRIS_GRAPHICS_EXPORTED explicit SettingsManager(ServiceProvider* service_provider); + OOPETRIS_GRAPHICS_EXPORTED explicit SettingsManager(ServiceProvider* service_provider); - OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const detail::Settings& settings() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const detail::Settings& settings() const; }; diff --git a/src/scenes/recording_selector/recording_chooser.hpp b/src/scenes/recording_selector/recording_chooser.hpp index 7b14a88a..c15f682c 100644 --- a/src/scenes/recording_selector/recording_chooser.hpp +++ b/src/scenes/recording_selector/recording_chooser.hpp @@ -19,19 +19,20 @@ namespace custom_ui { std::vector currently_chosen_files{}; public: - OOPETRIS_GRAPHICS_EXPORTED explicit RecordingFileChooser( + OOPETRIS_GRAPHICS_EXPORTED explicit RecordingFileChooser( ServiceProvider* service_provider, ui::FocusHelper& focus_helper, const ui::Layout& layout, bool is_top_level ); - OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; + OOPETRIS_GRAPHICS_EXPORTED void render(const ServiceProvider& service_provider) const override; - OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Widget::EventHandleResult + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] Widget::EventHandleResult handle_event(const std::shared_ptr& input_manager, const SDL_Event& event) override; - OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const std::vector& get_currently_chosen_files() const; + OOPETRIS_GRAPHICS_EXPORTED [[nodiscard]] const std::vector& get_currently_chosen_files( + ) const; private: [[nodiscard]] std::tuple get_texts(); diff --git a/src/ui/focusable.hpp b/src/ui/focusable.hpp index ea144e7d..d2ed86db 100644 --- a/src/ui/focusable.hpp +++ b/src/ui/focusable.hpp @@ -12,7 +12,7 @@ namespace ui { u32 m_focus_id; public: - explicit FocusHelper(u32 start_focus_id = 0) : m_focus_id{ start_focus_id } {}; + explicit FocusHelper(u32 start_focus_id = 0) : m_focus_id{ start_focus_id } { }; [[nodiscard]] u32 focus_id() { return m_focus_id++; diff --git a/tests/utils/meson.build b/tests/utils/meson.build index b2a61873..adaf0f0e 100644 --- a/tests/utils/meson.build +++ b/tests/utils/meson.build @@ -2,5 +2,5 @@ test_src += files( 'files.cpp', 'files.hpp', 'helper.hpp', - 'printer.hpp' + 'printer.hpp', ) diff --git a/tools/dependencies/meson.build b/tools/dependencies/meson.build index 7aff079b..b3f22734 100644 --- a/tools/dependencies/meson.build +++ b/tools/dependencies/meson.build @@ -336,12 +336,9 @@ if build_application discord_sdk_dep = dependency( 'discord-game-sdk', required: not meson.is_cross_build(), - # only with msvc we need a static library, all others work without adding __declspec() everywhere + # only with msvc we need a static library, all others work without adding __declspec() everywhere static: c.get_id() == 'msvc', - #TODO: format and run mesonlint - default_options : c.get_id() != 'msvc' ? {}: { - 'default_library':'static' - } + default_options: c.get_id() != 'msvc' ? {} : {'default_library': 'static'}, ) if discord_sdk_dep.found() have_discord_sdk = true diff --git a/wrapper/c b/wrapper/c index 8434173d..d3b251f1 160000 --- a/wrapper/c +++ b/wrapper/c @@ -1 +1 @@ -Subproject commit 8434173d7a4a551c20c90372d54bcd0744b75529 +Subproject commit d3b251f12337ddbaa104d928f775537342c4afc7 diff --git a/wrapper/haskell b/wrapper/haskell index 619cd0d5..880a7352 160000 --- a/wrapper/haskell +++ b/wrapper/haskell @@ -1 +1 @@ -Subproject commit 619cd0d5816c9d531abe907463675d681483868f +Subproject commit 880a7352368e59eac6b29f936657e545587d9dad diff --git a/wrapper/javascript b/wrapper/javascript index 6a70f2ae..419b251b 160000 --- a/wrapper/javascript +++ b/wrapper/javascript @@ -1 +1 @@ -Subproject commit 6a70f2ae57cb5f8d06cc23ce8b57a99d00d9c17a +Subproject commit 419b251ba1d6e00640505f0e46b238dfbd854876 From 4c52be1422a1cbb3c8bd80a85aea0485e17e478f Mon Sep 17 00:00:00 2001 From: Totto16 Date: Thu, 3 Oct 2024 12:39:36 +0200 Subject: [PATCH 17/19] lint: fix clang-tidy warnings --- src/graphics/window.cpp | 10 +++++----- src/graphics/window.hpp | 4 ++-- src/libs/core/helper/date.cpp | 2 +- src/libs/core/helper/date.hpp | 2 +- src/libs/core/helper/sleep.cpp | 12 +++++++----- src/libs/core/helper/sleep.hpp | 2 +- src/ui/layouts/scroll_layout.hpp | 2 +- 7 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/graphics/window.cpp b/src/graphics/window.cpp index 036875a2..72d8368f 100644 --- a/src/graphics/window.cpp +++ b/src/graphics/window.cpp @@ -6,11 +6,11 @@ Window::Window(const std::string& title, WindowPosition position, u32 width, u32 height) : Window{ title, static_cast(position), static_cast(position), width, height } { } -Window::Window(const std::string& title, u32 x, u32 y, u32 width, u32 height) +Window::Window(const std::string& title, u32 x_pos, u32 y_pos, u32 width, u32 height) : m_window{ SDL_CreateWindow( title.c_str(), - static_cast(x), - static_cast(y), + static_cast(x_pos), + static_cast(y_pos), static_cast(width), static_cast(height), 0 @@ -19,14 +19,14 @@ Window::Window(const std::string& title, u32 x, u32 y, u32 width, u32 height) Window::Window(const std::string& title, WindowPosition position) : Window{ title, static_cast(position), static_cast(position) } { } -Window::Window(const std::string& title, u32 x, u32 y) { +Window::Window(const std::string& title, u32 x_pos, u32 y_pos) { SDL_DisplayMode mode{}; const int result = SDL_GetCurrentDisplayMode(0, &mode); if (result != 0) { throw std::runtime_error{ "failed in getting display mode: " + std::string{ SDL_GetError() } }; } - m_window = SDL_CreateWindow(title.c_str(), static_cast(x), static_cast(y), mode.w, mode.h, 0); + m_window = SDL_CreateWindow(title.c_str(), static_cast(x_pos), static_cast(y_pos), mode.w, mode.h, 0); if (m_window == nullptr) { throw std::runtime_error{ "failed in creating window: " + std::string{ SDL_GetError() } }; } diff --git a/src/graphics/window.hpp b/src/graphics/window.hpp index 43033f3b..d9db16ff 100644 --- a/src/graphics/window.hpp +++ b/src/graphics/window.hpp @@ -22,9 +22,9 @@ struct Window final { public: OOPETRIS_GRAPHICS_EXPORTED Window(const std::string& title, WindowPosition position, u32 width, u32 height); - OOPETRIS_GRAPHICS_EXPORTED Window(const std::string& title, u32 x, u32 y, u32 width, u32 height); + OOPETRIS_GRAPHICS_EXPORTED Window(const std::string& title, u32 x_pos, u32 y_pos, u32 width, u32 height); OOPETRIS_GRAPHICS_EXPORTED Window(const std::string& title, WindowPosition position); - OOPETRIS_GRAPHICS_EXPORTED Window(const std::string& title, u32 x, u32 y); + OOPETRIS_GRAPHICS_EXPORTED Window(const std::string& title, u32 x_pos, u32 y_pos); OOPETRIS_GRAPHICS_EXPORTED Window(const Window&) = delete; OOPETRIS_GRAPHICS_EXPORTED Window(Window&&) = delete; OOPETRIS_GRAPHICS_EXPORTED Window& operator=(const Window&) = delete; diff --git a/src/libs/core/helper/date.cpp b/src/libs/core/helper/date.cpp index 2d5e9bac..16c7bba1 100644 --- a/src/libs/core/helper/date.cpp +++ b/src/libs/core/helper/date.cpp @@ -23,7 +23,7 @@ date::ISO8601Date::ISO8601Date(std::tm tm) { date::ISO8601Date date::ISO8601Date::now() { auto now = std::chrono::system_clock::now(); const std::time_t time = std::chrono::system_clock::to_time_t(now); - return { static_cast(time) }; + return ISO8601Date{ static_cast(time) }; } diff --git a/src/libs/core/helper/date.hpp b/src/libs/core/helper/date.hpp index 09d7ffee..8f744680 100644 --- a/src/libs/core/helper/date.hpp +++ b/src/libs/core/helper/date.hpp @@ -18,7 +18,7 @@ namespace date { static constexpr const char* iso_8601_format_string = "%Y%m%dT%H%M%S"; public: - OOPETRIS_CORE_EXPORTED ISO8601Date(u64 value); + OOPETRIS_CORE_EXPORTED explicit ISO8601Date(u64 value); OOPETRIS_CORE_EXPORTED static ISO8601Date now(); OOPETRIS_CORE_EXPORTED static helper::expected from_string(const std::string& input); diff --git a/src/libs/core/helper/sleep.cpp b/src/libs/core/helper/sleep.cpp index 69269408..5609fd6b 100644 --- a/src/libs/core/helper/sleep.cpp +++ b/src/libs/core/helper/sleep.cpp @@ -17,7 +17,7 @@ using namespace std::chrono_literals; #endif -bool helper::sleep_nanoseconds(std::chrono::nanoseconds ns) { +bool helper::sleep_nanoseconds(std::chrono::nanoseconds nano_seconds) { #if defined(_MSC_VER) // windows supports more than 100 ns precision, see here: https://randomascii.wordpress.com/2020/10/04/windows-timer-resolution-the-great-rule-change/ @@ -30,7 +30,7 @@ bool helper::sleep_nanoseconds(std::chrono::nanoseconds ns) { return false; } // use negative ns to set relative intervals - li.QuadPart = -ns.count(); + li.QuadPart = -nano_seconds.count(); if (!SetWaitableTimer(timer, &li, 0, nullptr, nullptr, false)) { CloseHandle(timer); return false; @@ -46,9 +46,11 @@ bool helper::sleep_nanoseconds(std::chrono::nanoseconds ns) { int result{}; struct timespec remaining{}; struct timespec current{ - static_cast(std::chrono::duration_cast(ns).count()), - static_cast( - ns.count() % std::chrono::duration_cast(1s).count() + .tv_sec = static_cast( + std::chrono::duration_cast(nano_seconds).count() + ), + .tv_nsec = static_cast( + nano_seconds.count() % std::chrono::duration_cast(1s).count() ), }; diff --git a/src/libs/core/helper/sleep.hpp b/src/libs/core/helper/sleep.hpp index d29e5b81..39e75bbd 100644 --- a/src/libs/core/helper/sleep.hpp +++ b/src/libs/core/helper/sleep.hpp @@ -8,6 +8,6 @@ namespace helper { - OOPETRIS_CORE_EXPORTED bool sleep_nanoseconds(std::chrono::nanoseconds ns); + OOPETRIS_CORE_EXPORTED bool sleep_nanoseconds(std::chrono::nanoseconds nano_seconds); } diff --git a/src/ui/layouts/scroll_layout.hpp b/src/ui/layouts/scroll_layout.hpp index 8dd22d6d..39125824 100644 --- a/src/ui/layouts/scroll_layout.hpp +++ b/src/ui/layouts/scroll_layout.hpp @@ -29,7 +29,7 @@ namespace ui { }; struct AbsolutItemSize : public ItemSize { - OOPETRIS_GRAPHICS_EXPORTED AbsolutItemSize(u32 height); + OOPETRIS_GRAPHICS_EXPORTED explicit AbsolutItemSize(u32 height); }; From 7ed2b706bc15bcc1bdcd91cf702d17a5d6358b9f Mon Sep 17 00:00:00 2001 From: Totto16 Date: Thu, 3 Oct 2024 14:49:52 +0200 Subject: [PATCH 18/19] ci: use run command instead of action to install clang --- .github/workflows/cpp-linter.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/cpp-linter.yml b/.github/workflows/cpp-linter.yml index dea28c47..8ed1912a 100644 --- a/.github/workflows/cpp-linter.yml +++ b/.github/workflows/cpp-linter.yml @@ -20,10 +20,13 @@ jobs: pip install meson --break-system-packages - name: Setup Clang - uses: egor-tensin/setup-clang@v1 - with: - version: 19 - platform: x64 + run: | + wget https://apt.llvm.org/llvm.sh + chmod +x llvm.sh + sudo ./llvm.sh 19 + echo "CC=clang-19" >> "$GITHUB_ENV" + echo "CXX=clang++-19" >> "$GITHUB_ENV" + echo "OBJC=clang-19" >> "$GITHUB_ENV" - name: Prepare compile_commands.json run: | From 3c69e89db982cd19183d69ad3f132ac11f3b7f02 Mon Sep 17 00:00:00 2001 From: Totto16 Date: Thu, 3 Oct 2024 20:50:30 +0200 Subject: [PATCH 19/19] fix: fix tricky clang-format error also adjust the cpp-linter arguments --- .github/workflows/cpp-linter.yml | 2 +- src/libs/core/helper/sleep.hpp | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/cpp-linter.yml b/.github/workflows/cpp-linter.yml index 8ed1912a..afb94790 100644 --- a/.github/workflows/cpp-linter.yml +++ b/.github/workflows/cpp-linter.yml @@ -47,7 +47,7 @@ jobs: database: build files-changed-only: ${{ github.event_name != 'workflow_dispatch' }} lines-changed-only: ${{ github.event_name != 'workflow_dispatch' }} - thread-comments: true + thread-comments: update tidy-checks: '' step-summary: true file-annotations: true diff --git a/src/libs/core/helper/sleep.hpp b/src/libs/core/helper/sleep.hpp index 39e75bbd..f86c1c3b 100644 --- a/src/libs/core/helper/sleep.hpp +++ b/src/libs/core/helper/sleep.hpp @@ -1,5 +1,3 @@ - - #pragma once #include "./windows.hpp" @@ -9,5 +7,4 @@ namespace helper { OOPETRIS_CORE_EXPORTED bool sleep_nanoseconds(std::chrono::nanoseconds nano_seconds); - }